Как написать эффективный счетчик посещений для сайтов

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

Я ищу простой, самостоятельный метод (php, скрипты python и т. Д.). Я думал об использовании MySQL, чтобы отслеживать это, но я предполагаю, что есть более эффективный способ. Каковы хорошие методы хранения счетчиков?

Увлекательный сюжет. Увеличение счетчика, как бы оно ни было, просто должно быть транзакцией … что означает, что он может заблокировать всю БД дольше, чем имеет смысл! -) Это может быть просто узким местом для всей системы.

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

Тогда есть очень быстрые счетчики, которые являются только статистически точными, но поскольку вы не говорите, что такая неточность приемлема, я не буду объяснять их более подробно.

Вы можете взять журнал доступа вашего веб-сервера (Apache: access.log) и оценивать его снова и снова (cronjob), если вам не нужно иметь данные под рукой в ​​тот момент, когда кто-то посещает ваш сайт.

Как правило, access.log генерируется в любом случае и содержит запрошенный ресурс, а также время, дату и IP-адрес пользователя. Таким образом, вам не нужно трассировать все трафик через php-скрипт. Бережливая, средняя счетная машина.

Есть два очень простых способа:

  1. Разбирайте его из своих веб-журналов в пакетном режиме.
  2. Запускайте хиты через beanstalkd или gearmand и выполняйте трудную работу жестким материалом.

Вариант 1 работает с готовыми инструментами. Вариант 2 требует всего немного программирования, но дает вам что-то ближе к обновлениям в реальном времени, не заставляя вас падать, когда трафик скапливается (например, вы найдете в своем прямом случае mysql).

Без сомнения, Redis идеально подходит для этой проблемы. Это требует около минуты для установки и установки, поддерживает атомные приращения, невероятно быстро, имеет клиентские библиотеки для python и php (и многих других языков), является долговечным (моментальные снимки, журнал, репликация).

Храните каждый счетчик в собственном ключе. Тогда просто

INCR key 

Если точность важна, вы можете сделать это немного медленнее с MySql … создайте таблицу HEAP / Memory для хранения ваших значений счетчика. Эти таблицы в памяти, которые невероятно быстрые. Вы можете записывать данные в обычную таблицу с интервалами.

Основываясь на идеях движка приложения, вы можете использовать memcache в качестве временного хранилища для вашего счетчика. Увеличение счетчика memcache происходит быстрее, чем использование таблиц кучи MySql (я думаю). Через каждые пять или десять секунд вы можете прочитать счетчик memcache и записать этот номер в свою БД.

Не уверен, что это вверх по вашей аллее, но AppEngine – неплохая платформа для разработки. Пример кода, который вы можете использовать для создания счетчика, используя свой DataStore и транзакции, описан здесь: http://code.google.com/appengine/docs/python/datastore/transactions.html .

Вы можете использовать Redis – это очень быстрое хранилище ключей с поддержкой атомных приращений. Если возникнет необходимость – подсчет данных может быть легко разделен между несколькими серверами.

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

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

Хорошо, если вам удастся перейти на PHP-маршрут, вы можете использовать базу данных SQLite , однако MySQL является вполне разумным способом хранения этой информации и, как правило, (по крайней мере, из тех, что я видел), как это делается.

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