На проекте используется MySQL, в секунду ~500 инсертов и ~200 селектов.
Некоторые таблицы разрослись до >1 млрд записей, некоторые таблицы в результате неизвестно чего повредились и мускул стал несколько раз в день падать.
Собрав все пролемы в кучу и предположив, что нагрузка будет только расти - мы решили перейти на ClickHouse.
Переписали скрипт, перенесли данные из MySQL и запустили всё на на полную мощь. В итоге сайт начал тормозить, в логах кликхауса появляться ошибки что слишком много запросов идёт на запись (примерно так).
В MySQL у меня были такие же проблемы, когда диск не выдерживал такого объёма записей и всё начинало лагать. Решил это с помощью конфигов:
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2
После изучения документации кликхауса я понял, что для решения этой проблемы нужно использовать движок Buffer.
Далее я выполнил такой запрос:
CREATE TABLE `buffer_log` AS `log` ENGINE = Buffer(`default`, `log`, 16, 10, 60, 1000, 10000, 10000000, 100000000);
Далее я все инсерты повесил на таблицу buffer_log, нагрузка на проц и диск упала, но появилась новая проблема.
SELECT запросы у меня идут с небуферизованной таблицы log, а там они соответственно появляются не сразу и появляется задержка около минуты. Меня это не устраивает, нужен полный realtime как был на MySQL.
Далее я попробовал чтение делать тоже из таблицы буфера, но сайт снова стал тормозить. Покопав документацию я увидел, что при записи в буфер блокируется вся таблица.
Как это исправить?
Мне нужно решить всего две проблемы:
1) Чтобы данные писались быстро
2) Чтобы данные читались быстро