teni13
Новичок
Доброго времени суток.
Есть тизерная сеть - сайты размещают у себя код, по коду сеть отдаёт блок с тизерами, учитывает показы тизеров и клики по ним. В систему входит mysql-сервер (живёт на отдельном физическом сервере, где больше нет ничего пока) и php-фронт + мемкеш на другом физическом сервере. Веб-сервер nginx.
Был выбран следующий вариант работы статистики:
При показе блока (так же и при клике) информация о нём заносится в мемкеш, для статистики необходимо учитывать следующие данные ИДБлока_ИДСайта_ИДТизера_ИДРекламнойКампании_ИДКатегорииТизера_ИДРегионаПоказа и соотв. количество показов и кликов для этого набора данных, суммы списанных и начисленных денег.
Именно под таким ключём: "stats_ИДБлока_ИДСайта_ИДТизера_ИДРекламнойКампании_ИДКатегорииТизера_ИДРегионаПоказа" данные и записываются в мемкеш при каждом клике-показе (если ключ уже есть, в нём просто обновляются числа)
Для учёта существующих ключей такого вида используется массив, так же лежащий в мемкеше.
Соответственно, при каждом показе блока из мемкеша читается список ключей, находится там соответствующий (или создаётся новый), модифицируется массив, с данными, лежаший под этим ключём и записывается в мемкеш:
Раз в Н минут (сейчас каждые 2 минуты) срабатывает скрипт, который всё это дело сбрасывает в базу, в одну таблицу stats, которая выглядит следующим образом:
Эта таблица используется только для вывода статистических данных клиентам, все финансовые расчёты производятся по таблице лога кликов (каждый клик сразу пишется в базу, без всякого мемкеша).
И именно с этой таблицей возникла проблема, по которой и требуется хороший совет.
При сбросе статистики из мемкеша в базу на каждый ключ делается 2 запроса (селект - проверить наличие такой записи в таблице) и инсерт-апдейт. При росте показов до 10млн. уже начинаются проблемы - сброс статистики генерит очень много запросов и не понятно, как это количество уменьшить, mysql получает 1,5к запросов в секунду и виснет. Реже сбрасывать статистику можно, разница по объёму данных будет несущественна, но это всё равно будет пиковая нагрузка, которая повесит сервер.
Ещё интересно мнение, как можно лучше организовать временное хранение статистических данных в мемкеше (или без него)
Заранее спасибо за ответы.
Есть тизерная сеть - сайты размещают у себя код, по коду сеть отдаёт блок с тизерами, учитывает показы тизеров и клики по ним. В систему входит mysql-сервер (живёт на отдельном физическом сервере, где больше нет ничего пока) и php-фронт + мемкеш на другом физическом сервере. Веб-сервер nginx.
Был выбран следующий вариант работы статистики:
При показе блока (так же и при клике) информация о нём заносится в мемкеш, для статистики необходимо учитывать следующие данные ИДБлока_ИДСайта_ИДТизера_ИДРекламнойКампании_ИДКатегорииТизера_ИДРегионаПоказа и соотв. количество показов и кликов для этого набора данных, суммы списанных и начисленных денег.
Именно под таким ключём: "stats_ИДБлока_ИДСайта_ИДТизера_ИДРекламнойКампании_ИДКатегорииТизера_ИДРегионаПоказа" данные и записываются в мемкеш при каждом клике-показе (если ключ уже есть, в нём просто обновляются числа)
Для учёта существующих ключей такого вида используется массив, так же лежащий в мемкеше.
Соответственно, при каждом показе блока из мемкеша читается список ключей, находится там соответствующий (или создаётся новый), модифицируется массив, с данными, лежаший под этим ключём и записывается в мемкеш:
PHP:
$aRecord = array(
'views_teaser' => 0,
'views_block' => 0,
'clicks' => 0,
'money_out' => 0,
'money_in' => 0,
);
PHP:
block_id,site_id,teaser_id,campaign_id,category_id,date,region_id,views_teaser,views_block,clicks,ctr,money_out,money_in
И именно с этой таблицей возникла проблема, по которой и требуется хороший совет.
При сбросе статистики из мемкеша в базу на каждый ключ делается 2 запроса (селект - проверить наличие такой записи в таблице) и инсерт-апдейт. При росте показов до 10млн. уже начинаются проблемы - сброс статистики генерит очень много запросов и не понятно, как это количество уменьшить, mysql получает 1,5к запросов в секунду и виснет. Реже сбрасывать статистику можно, разница по объёму данных будет несущественна, но это всё равно будет пиковая нагрузка, которая повесит сервер.
Ещё интересно мнение, как можно лучше организовать временное хранение статистических данных в мемкеше (или без него)
Заранее спасибо за ответы.