Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
Доброго дня Прошу всех специалистов в теме highload помочь со следующим заданием: 1) На базе PHP+MySQL нужно реализовать сервис приёма статистики игровых данных. Cтруктура: - ID игрока - игровое время события - ID устройства ( строка , 64 символа ) - платформа устройства (iPad, iPhone) - набор произвольных данных (например, устройство отсылает событие с параметрами Event=Start, Money=15444 и т.д.) 2) Требования: - сервис должен выдерживать приём 20 млн обращений в сутки. - необходимо предусмотреть возможность выборки и удаления данных за предыдущий день ( например, 10 -го числа забираются и удаляются данные за 9 -е) - сервис должен отвечать клиенту, что приём прошёл удачно либо неудачно Свои идеи: 1. Структура БД Т.к. данные будет писаться часто и много, а удаляться и читаться редко то вижу два варианта структуры БД: 1.1 Каждый день кроном (cron) создавать таблицу на следующий день - куда будут складываться данные. Тогда удаление и чтение данных не будет оказывать влияния на вновь записываемые данные. CREATE TABLE IF NOT EXISTS `day_data` ( `id` int(10) NOT NULL AUTO_INCREMENT, `user_id` int(10) NOT NULL, `datetime` int(10) NOT NULL, `device_id` varchar(64) NOT NULL, `platform` enum('ipad','iphone') NOT NULL, `data` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0; 1.2 Таблица создаётся одна, но в ней делаются партиции(PARTITION) по дню месяца(1-31) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 2. Удаление С удалением проблем нет т.к. в первом варианте DROP таблицы происходит достаточно быстро Во втором варианте делаем ALTER TABLE `day_data` TRUNCATE PARTITION p11 - это тоже быстро т.к. если очень грубо, то Mysql удаляет старый файл данных и создает новый. А эта операция выполняется значительно быстрее построчного удаления. 3. Чтение Для того чтобы избежать потери данных и не вешать сервер на скачку 20млн записей на лету - предварительно сохраняем эти данные в csv файл на сервер и для скачки - даём ссылку на файл на сервере. Сохранение производим в цикле по 10000 записей - устанавливая флаг в БД для данных уже сохранённх в файл. 4. Отдача клиенту Ответ присылае в виде JSON В случае удачи присылаем ok В случае неудачи: если данные неполные - ошибку с информацией о неполных данных если есть ишибка при вставке в БД - информацию об ошибке вставки в БД и номер ошибки 5. Настройка БД Для увеличения производительности - вероятно нужно дополнительно настроить БД затронув параметры: innodb_buffer_pool_size innodb_log_file_size innodb_log_buffer_size innodb_file_per_table innodb_flush_method innodb_flush_log_at_trx_commit Можно здесь что-то подсказать Заранее спасибо всем кто ответит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2017, 12:16 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
...как данные вставляются? 20 млн в день, 0.9 млн в час, 250 ТХ в секунду в среднем, может быть 500 или 1000 трансакций в пике. PHP будет сильно удивлен... ...в нескольких проектах на среднем железе веб часть обычно в >10 раз дольше чем сердние запросы к базе. Т.е. вам нужен или очень серьезный комп или кластер веб серверов как минимум на 10-20 машин.... 1000 вставок в секунду -- нехило для среднего железа... посмотрите еще: * исползование быстрых операционных систем * не исползовать ТЕХТ -- так как его может выбить в отдельный файл ...ну и соответсвено не принемать слишком длинное поле ДАТА * продумать как будет отдаватся дануе? если нужен только CSV -- то почеми бы просто не записывать файл? (я не в курсе но может запись в файл будет тупо быстрее записи в базу) * отключить все трансакции * кажется ПХП не самый быстрый фреймвор на прием и обработку запросов * ngnix быстрее Апачи.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2017, 15:20 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
Всю статистику нужно сначала писать в кэш(redis или тп), а потом бэкендом, одним запросом, из кэша всё писать в базу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2017, 16:48 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
alex-zzxвижу два варианта структуры БД: 1.1 Каждый день кроном (cron) создавать таблицу на следующий день 1.2 Таблица создаётся одна, но в ней делаются партиции(PARTITION) по дню месяца(1-31) Так это ж почти одно и то же. И оптимизирует фактически из озвученных задач только чистку - при том что это операция чуть ли не одноразовая. Нет бы задуматься о секционировании, снижающем нагрузку на одну секцию от основного типа запроса - вставки. Т.е., например, при секционировании по дате каждую секцию партиционировать по, скажем, ID игрока. Раз Вы прогнозируете 20кк запросов в сутки, т.е. 230 запросов в секунду, с, например, 4х пиком, то есть смысл думать о 8 или 16 секциях при бинарном ID (последние 3 или 4 бита) либо о 10 секциях для десятичного (последняя цифра) ID. И секции следует создавать не на завтра, а на изрядно вперёд (ну минимум на десяток дней, а то и больше - всё равно пустые секции места не едят, и в цепи проверок выполнение до них не доходит). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2017, 17:40 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
alex-zzx, В описанных требованиях не вижу, нужно ли что-то делать с самими данными в порциях меньших, чем день. Если не нужно, то тут СУБД вовсе не нужна. Достаточно формировать по csv-файлу на каждый день. Если всё же нужно держать данные в виде отдельных записей, то какие требования к надежности и задержкам вставки? Если, например, буферизировать данные по (например, часовым) порциям в файл, а затем вставлять этот файл пакетно командой LOAD DATA, то 20 млн в сутки не выглядят чем-то чрезмерным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2017, 21:07 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
javajdbc...в нескольких проектах на среднем железе веб часть обычно в >10 раз дольше чем сердние запросы к базе. Т.е. вам нужен или очень серьезный комп или кластер веб серверов как минимум на 10-20 машин..... Планируется размещение на амазоновских серверах - с этим вроде проблем быть не должно. javajdbc* не исползовать ТЕХТ -- так как его может выбить в отдельный файл Согласен. Пробовал поставить varchar 250 - 500 мне сделали замечание - почему так мало. А точную длинна данных не указана :( javajdbc* продумать как будет отдаватся дануе? если нужен только CSV -- то почеми бы просто не записывать файл? Вроде я продумал механизм. В цикле читаем данные предыдущего дня и пишем их в csv файл. на прочитанные данные ставим флаг в таблицу. Тоже думал сразу писать в csv файл но по условиям - нужно решение именно на базе PHP+MySQL javajdbc* отключить все трансакции Тоже как вариант, но целостность данных может пострадать при сбоях нет? В любом случае спасибо за замечания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2017, 23:42 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
macheteroВсю статистику нужно сначала писать в кэш(redis или тп), а потом бэкендом, одним запросом, из кэша всё писать в базу. Как бы да, но по условиям пока нужно делать именно PHP+MySQL Спасибо за замечание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2017, 23:43 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
Akinaalex-zzxвижу два варианта структуры БД: 1.1 Каждый день кроном (cron) создавать таблицу на следующий день 1.2 Таблица создаётся одна, но в ней делаются партиции(PARTITION) по дню месяца(1-31) Так это ж почти одно и то же. И оптимизирует фактически из озвученных задач только чистку - при том что это операция чуть ли не одноразовая. Нет бы задуматься о секционировании, снижающем нагрузку на одну секцию от основного типа запроса - вставки. Т.е., например, при секционировании по дате каждую секцию партиционировать по, скажем, ID игрока. Раз Вы прогнозируете 20кк запросов в сутки, т.е. 230 запросов в секунду, с, например, 4х пиком, то есть смысл думать о 8 или 16 секциях при бинарном ID (последние 3 или 4 бита) либо о 10 секциях для десятичного (последняя цифра) ID. И секции следует создавать не на завтра, а на изрядно вперёд (ну минимум на десяток дней, а то и больше - всё равно пустые секции места не едят, и в цепи проверок выполнение до них не доходит). Отличная идея. Сам думал о таком третьем варианте: делать таблицы на каждый день и в этих таблицах секционировать данные по какому либо полю. Это получается такой "псевдогоризонтальный шардинг" Но будет ли прирост производительности при инсертах - я не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2017, 23:48 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
miksoftВ описанных требованиях не вижу, нужно ли что-то делать с самими данными в порциях меньших, чем день. Если не нужно, то тут СУБД вовсе не нужна. Достаточно формировать по csv-файлу на каждый день. С данными делать ничего не нужно. Их нужно только скачать в виде csv файла а потом удалить данные за выбранный день - это всё. Тоже думал формировать csv файлы за каждый день но условия таковы что так делать нельзя :( Может быть у вас есть какие либо пруфы подтверждающие что запись в файл будет быстрее чем в Mysql? miksoftЕсли всё же нужно держать данные в виде отдельных записей, то какие требования к надежности и задержкам вставки? Если, например, буферизировать данные по (например, часовым) порциям в файл, а затем вставлять этот файл пакетно командой LOAD DATA, то 20 млн в сутки не выглядят чем-то чрезмерным. У меня нет этих требований :( Тоже вроде неплохой вариант Спасибо за замечания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2017, 23:54 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
alex-zzxМожет быть у вас есть какие либо пруфы подтверждающие что запись в файл будет быстрее чем в Mysql?Это настолько очевидно, что даже не знаю. MySQL же тоже данные хранит не в вакууме, а в файле. Почитайте устройство файлов движка InnoDB, там все непросто. А это "непросто" обходится не бесплатно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 07:51 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
alex-zzxС данными делать ничего не нужно. Их нужно только скачать в виде csv файла а потом удалить данные за выбранный день - это всё. Тоже думал формировать csv файлы за каждый день но условия таковы что так делать нельзя :(Тогда при записи в MySQL не обязательно парсить исходные данные по полям/записям. Можно скопом/порциями писать в BLOB-поля (тот же TEXT, но без накладных расходов на кодировку). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 07:55 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
javajdbc1000 вставок в секунду -- нехило для среднего железа... Вообще-то это маловато даже для старенького ноутбука, но связка с PHP, конечно, портит всю малину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 14:37 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
miksoftalex-zzxМожет быть у вас есть какие либо пруфы подтверждающие что запись в файл будет быстрее чем в Mysql?Это настолько очевидно, что даже не знаю. MySQL же тоже данные хранит не в вакууме, а в файле. Почитайте устройство файлов движка InnoDB, там все непросто. А это "непросто" обходится не бесплатно. Вроде бы и да но если одновременно 200 человек будут пытаться записать в файл а в пике нагрузки целая тысяча - то пока 1 пишет остальным придётся ждать. И ждать они могут долго. Прошу поправить если ошибаюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 15:16 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
miksoftalex-zzxС данными делать ничего не нужно. Их нужно только скачать в виде csv файла а потом удалить данные за выбранный день - это всё. Тоже думал формировать csv файлы за каждый день но условия таковы что так делать нельзя :(Тогда при записи в MySQL не обязательно парсить исходные данные по полям/записям. Можно скопом/порциями писать в BLOB-поля (тот же TEXT, но без накладных расходов на кодировку). Это просто гениально!!! Спасибо! Насколько я понимаю - запихнув всё в одно поле - получится сэкономить кучу ресурсов. В итоге пришёл к такому решению 1) Все данные пришедшие от 1 клиента пишу сразу в одно поле BLOB 2) Делаю разбивку таблиц по дням - чтение и удаление за предыдущий день никак не тормозит запись новых данных. 3) Для каждой дневной таблицы делаю секционирование через HASH или KEY по id записи - это позволит ускорить одновременную запись данных. Поправьте если ошибаюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 18:16 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
Зачем секционирование? В таблице будет мизер записей, или вообще одна.Что там секционировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 19:42 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
miksoft, А почему там будет 1 запись? Имеется в виду что в таблице будет 1 запись, в этой записи будет поле DATA типа BLOB и в него будут дописываться данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 19:46 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
Сначала подумал что на каждый запрос будет создаваться запись в таблице id, data и в поле data в формате BLOB будут писаться принятые данные и таких записей в 1 таблице будет 20 млн ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 19:49 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
alex-zzxmiksoft, А почему там будет 1 запись? Имеется в виду что в таблице будет 1 запись, в этой записи будет поле DATA типа BLOB и в него будут дописываться данные?ну да, как файл, только в MySQL. Хотя можно и каждое обращение новую запись писать, зависит от деталей проекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 19:50 |
|
||
|
Как сделать сервис статистики для 20млн записей в сутки MySql?
|
|||
|---|---|---|---|
|
#18+
miksoft, Протестировал скорость вставки через INSERT И через UPDATE В итоге получилось - если мы апдейтим одно и то же поле - постоянно дописывая в него - то скорость работы по сравнению с инсертом заметно ниже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 21:06 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=64&tid=1830292]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 223ms |
| total: | 358ms |

| 0 / 0 |
