Под капотом in-memory db: как обработать миллионы запросов в секунду. Или, почему Reindexer такой быстрыйБазы данных и системы хранения
Мы уже 2 года разрабатываем in-memory базу данных Reindexer, которая была создана для решения задачи фильтрации и отдачи контента со сложной бизнес логикой в системе, обслуживающий 10м+ пользователей.
На одном физическом сервере Reindexer может выполнять более миллиона простых запросов в секунду и десятки тысяч запросов с JOIN и нетривиальной фильтрацией.
В этом докладе я расскажу, как нам удалось достичь такой производительности и о "под-капотном" пространстве Reindexer - какие структуры используются для хранения данных в RAM, как реализованы индексы и как это помогает выполнять выборки данных за минимальное количество итераций.
Кроме оптимизированных структур данных, на производительность БД очень влияет количество выделений/освобождений динамической памяти. Нам удалось свести количество аллокаций памяти при выполнении запросов к минимуму - многие запросы выполняются вообще без единого аллока.
Обратная сторона низко-уровневых оптимизаций - появление "опасного" кода, который напрямую работает с памятью и в случае ошибок потенциально может приводить к "падениям" и порче данных - что недопустимо для БД.
Поэтому, рассказ об оптимизациях был бы не полным, если не рассказать об автотестах и верификации оптимизаций, которые мы используем.