Для работы с данными применяются два типа решений: а) системы с хранением данных в оперативной памяти, задержка при обращении к которым не превышет одной миллисекунды на запрос, обеспечивающие возможность обработки сотен тысяч запросов в секунду на ядро и оптимизации под высокую нагрузку в случае большого числа параллельных запросов (Memcached, Redis); б) системы с хранением данных на диске, предоставляющие возможности полноценных открытых СУБД (MySQL, PostgreSQL и др.), обеспечивающих постоянное хранение данных, а также поддержку транзакций, сохранность, доступность и т. д. Однако для реальных проектов все чаще требуются возможности обоих типов решений. Например, при создании сервиса авторизации и аутентификации и работы с профилями пользователей в условиях множества одновременно выполняемых запросов нужно обеспечить сохранность данных, поддержку вторичных и композитных индексов и хранимых процедур для обнаружения попыток взлома и любой злонамеренной активности, причем одновременно требуется минимизировать задержку при выполнении запроса. Может показаться логичным использовать совместно несколько продуктов: решение для обеспечения кэширования и дисковую СУБД, когда все запросы на чтение обрабатываются в кэш-памяти, а запросы на запись выполняет дисковая СУБД с последующей синхронизацией с кэшем. Но при таком подходе возникает проблема рассинхронизации данных в кэше и основной базе данных, а описать логику синхронизации достаточно трудно — эта задача обычно делегируется разработчику, которому приходится вручную написать код, учитывающий все возможные ситуации. Необходимо также предоставить большее количество серверов для одновременной поддержки двух продуктов. В итоге ни кэш, ни дисковая СУБД не работают так, как ожидается.

Сегодня разработчики обращаются к разным продуктам для разных типов запросов, и реально используются далеко не все возможности каждого из решений. При смешанной конфигурации чтение происходит из кэша, поэтому при запросах на чтение теряются возможности основной СУБД. При запросах на запись невозможно сделать, например, транзакции, которые распространялись бы и на кэш, и на дисковую СУБД. Таким образом, система, состоящая из двух продуктов, не будет поддерживать транзакции. А значит, возможны ситуации, когда в кэше и дисковой СУБД будут данные в неконсистентном состоянии. При этом сложность разработки и поддержки только возрастает.

СУБД in-memory

Полноценная интеграция продуктов от разных поставщиков — нетривиальная задача, и идеальной представляется возможность использования одного продукта, имеющего все требуемые свойства. К таким продуктам относится, например, система Tarantool, представляющая собой документоориентированную СУБД с хранением в оперативной памяти (in-memory) и сервер приложений с открытым исходным кодом, совмещающий свойства кэша и «полноценных» СУБД для постоянного хранения данных. Эта система разрабатывается в компании Mail.ru с 2008 года и сегодня используется в Avito, Yota, Badoo, Qiwi и ряде других организаций.

Данные в Tarantool хранятся в оперативной памяти, благодаря чему запросы на чтение выполняются быстро, а в случае запросов на запись, перед тем как обновить данные в оперативной памяти, изменения записываются на диск в журнал транзакций (Write Ahead Log, WAL), поэтому данные на диске и в оперативной памяти всегда синхронизированы. При этом скорость запросов на запись достаточно высока: запись представляет собой лишь последовательное добавление транзакций в конец журнала. Даже классические жесткие диски (а также SSD) имеют высокую скорость последовательной записи — до 100 Мбайт/с, которая выполняется на несколько порядков быстрее, чем при произвольном доступе и произвольной записи. Таким образом, если при одной транзакции пересылается в среднем 100 байт, то Tarantool на сервере с жестким диском может заполнять журнал со скоростью 100 Мбайт/с, выполняя при этом до миллиона...

Это не вся статья. Полная версия доступна только подписчикам журнала. Пожалуйста, авторизуйтесь либо оформите подписку.

Поделитесь материалом с коллегами и друзьями

Купить номер с этой статьей в PDF