быстрые способы подсчета хостов

belbek

Новичок
быстрые способы подсчета хостов

подскажите способы(быстрые для сайтов с 1 000 000 хитов в сутки) подсчета хостов, именно хостов (distinct(ip) - это просто чтобы показать что я имею ввиду, а не один из способов, ибо слишком медленно ) не посетителей(браузеры), без использования кукисов, с обязательным правильным(актуальным) отображением хитов - хостов посетелелям, без кеширования результатов.
 

Gas

может по одной?
belbek
Статистические отчёты не делаются в реалтайме. Выбирается минимальный период (например, час), создаются таблицы под нужные отчёты где и хранятся агрегированные данные. По этим данным уже и показывается статистика, если период час, то это всего 8760 записей за год и их сгруппировать намного проще чем миллионы.

В реалтайме не будет быстро работать обработка миллионов записей.
 

belbek

Новичок
Автор оригинала: Gas
belbek
Статистические отчёты не делаются в реалтайме. Выбирается минимальный период (например, час), создаются таблицы под нужные отчёты где и хранятся агрегированные данные. По этим данным уже и показывается статистика, если период час, то это всего 8760 записей за год и их сгруппировать намного проще чем миллионы.

В реалтайме не будет быстро работать обработка миллионов записей.
не, со статистикой понятно, я говорю о необходимости отображения актуальных циферок хитов - хостов в реалтайме, юзер кликает а сумма хитов обновляется, а хиты уже нет потому как уже увеличился каунтер хостов при первом заходе

-~{}~ 26.05.10 19:09:

подчеркиваю, система обслуживает как минимум 10 сайтов с подобной посещаемостью.("железные" возможности ограничены)
 

Dovg

Продвинутый новичок
>В реалтайме не будет быстро работать обработка миллионов записей.
>отображения актуальных циферок хитов - хостов в реалтайме

Точных цифр в реалтайме не будет, особенно, если
>.("железные" возможности ограничены)
 

Farsh

~ on ~ high ~ wave ~
belbek
А статистику запросов откуда берете? Тупо из логов ?
P.s.
на моей рабочей машине, если на входе подан массив из 1 млн ИПов, то кол-во уникальных находится за 0.5 секунд
 

Gas

может по одной?
я говорю о необходимости отображения актуальных циферок хитов - хостов в реалтайме
если не ошибаюсь, 440hz участвовал в создании подобной системы и может сказать исходя их практики.

Первое что приходит мне на ум (но так скорее всего делать не нужно :)
- запросы к системе статистики логируются nginx'ом/лайтом в файлы, для каждого домена свой лог-файл (или даже несколько);
- скриптами в фоне эти лог-файлы постоянно парсятся;
- хиты это просто одно число-счётчик;
- с хоставми чуть сложнее, нужен какой-то быстрый key value storage, в который вставляются батчем новые ip (дубли игнорируются) и получается count что есть в сторедже (для каждого домена).
- картинка с циферками генерится отдельным процессом каждые там 0.5 сек

-~{}~ 26.05.10 18:52:

То-есть главное, чтоб не было никакой динамики при обращении клиентов - дёрнули статическую картинку с цифрами (предыдущими, без учёта этого хита), сервер записал обращение к себе в лог, в фоне обработал логи, сгенерил новую картинку и так постоянно.

Но это моё имхо, сам с подобным не сталкивался и не ресёрчил best practices на эту тему.

-~{}~ 27.05.10 01:06:

Стало интересно чего можно ожидать от простых технологий:
- nginx: пишет в access.log только ip и отдаёт картинку в 385 байт
- mysql: memory engine, таблица с одним полем ip (int) и уникальным индексом;
- php: запущен в фоне, проверяет обновление access.log'а, пишет в базу ip и в файл количество хитов, хостов (без генерации картинки со счётчиком)

Сервер по нынешним меркам слабый: P4 2.8Hz 1CPU, 2GB, FreeBSD 6.1
ab запускался с другого сервера из одной сети

Тест 1:
ab -c 1000 -n 2000000 http://domain/stat-test-1/test.png
Код:
Server Software:        nginx/0.7.64

Document Path:          /stat-test-1/test.png
Document Length:        385 bytes

Concurrency Level:      1000
Time taken for tests:   1024.416 seconds
Complete requests:      2000000
Failed requests:        393
   (Connect: 169, Length: 224, Exceptions: 0)
Broken pipe errors:     0
Total transferred:      1191868284 bytes
HTML transferred:       769914915 bytes
Requests per second:    1952.33 [#/sec] (mean)
Time per request:       512.21 [ms] (mean)
Time per request:       0.51 [ms] (mean, across all concurrent requests)
Transfer rate:          1163.46 [Kbytes/sec] received

Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   369 1298.0      0 75006
Processing:     6   142    nan    126 88338
Waiting:        0   141    nan    125 88337
Total:          6   511 1280.5    145 122543
Загрузка:
- Load Average = 2.4
- nginx - 27% cpu
- mysql - 16% cpu
- php - 7% cpu

Тест 2:
отдельные 5 процессов ab -c 300 -n 1000000 http://domain/stat-test-[1...5]/test.png
на разные урлы, каждый пишет свой лог и ip в отдельную базу.

По всем ab примерно одинаковая картина:
Код:
Concurrency Level:      300
Time taken for tests:   2719.405 seconds
Complete requests:      1000000
Failed requests:        23
   (Connect: 9, Length: 14, Exceptions: 0)
Broken pipe errors:     0
Total transferred:      595991656 bytes
HTML transferred:       384994610 bytes
Requests per second:    367.73 [#/sec] (mean)
Time per request:       815.82 [ms] (mean)
Time per request:       2.72 [ms] (mean, across all concurrent requests)
Transfer rate:          219.16 [Kbytes/sec] received

Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   665 1679.7      0 75002
Processing:    12   150   50.1    150 12259
Waiting:        2   149   50.1    149 12259
Total:         12   815 1683.7    157 75002
Загрузка:
- Load Average = 2.8
- nginx - 26% cpu
- mysql - 12% cpu
- php - 5%

Лаг со стороны php был не больше пары десятых секунды. При вставке данных, ошибок со стороны mysql не было.
Похоже всё упёрлось в дисковую подсистему, iostat'ы не смотрел, но проц был не на максимум загружен.
IP в mysql записывался не реальный (всегда постоянный), а просто значение переменной-счётчика, который увеличивался на 1 после каждых пяти запросов.
При пустой таблице и когда уже было 600K записей загрузка от mysql была одинаковой.

К чему это я всё, просто удовлетворил своё любопытство.
С хорошим сервером (4+ ядра) для небольшой системы статистики (до 2000 rps при небольшом количестве трекаемых источников)
можно даже пробовать обойтись решением в лоб на основе базовых технологий (но я это не пропагандирую).
nginx, freebsd никак особо не настраивались, в тесте не генерились картинки-счётчики.
 
Сверху