03.02.2023

Проект Dragonfly развивает более быструю замену Redis и Memcached

Доступен первый выпуск системы кэширования данных в оперативной памят Dragonfly, обеспечивающей поддержку протоколов Memcached и Redis, но позволяющей выполнять запросы с гораздо более высокой производительностью и с меньшим потреблением памяти. Система манипулирует данными в формате ключ/значение и может применяться как легковесное решение для ускорения работы высоконагруженных сайтов, кэширующие медленные запросы к СУБД и промежуточные данные в оперативной памяти. Код Dragonfly написан на языках C/С++ и распространяется под лицензией BSL (Business Source License).

Лицензия BSL была предложена сооснователями MySQL в качестве альтернативы модели Open Core. Суть BSL в том, что код расширенной функциональности изначально доступен для внесения изменений, но в течение какого-то времени может применяться бесплатно только при соблюдении дополнительных условий, для обхода которых требуется приобретение коммерческой лицензии. Дополнительные лицензионные условия проекта Dragonfly предписывают перевод кода на лицензию Apache 2.0 лишь 1 июня 2027 года. До этого времени лицензия разрешает использование кода только для обеспечения работы своих сервисов и продуктов, но запрещает применение для создания платных облачных сервисов, выступающих надстройкой над Dragonfly.

По заявлению разработчиков и продемонстрированным тестам Dragonfly претендует на звание самой быстрой системы хранения в памяти. По сравнению с Redis в Dragonfly при типовых видах нагрузки удалось добиться 25-кратного увеличения производительности и трёхкратного снижения потребления памяти. Один сервер Dragonfly может обрабатывать миллионы запросов в секунду, например, в окружении Amazon EC2 c6gn.16xlarge удалось достичь производительности в 3.8 млн запросов в секунду.

В тестах на хранение 5 ГБ данных Dragonfly потребовал на 30% меньше памяти, чем Redis. Во время создания снапшотов командой «bgsave» потребление памяти возрастает, но в пиковые моменты оно остаётся почти в три раза меньше, чем в Redis, а сама операция записи снапшота выполняется значительно быстрее (в тесте снапшот в Dragonfly был записан за 30 секунд, а Redis — за 42 секунды).

Высокая производительность достигается благодаря многопоточной архитектуре без разделения ресурсов (shared-nothing), подразумевающей, что к каждому потоку привязывается отдельный обособленный обработчик со своей порцией данных, работающий без мьютексов и spin-блокировок. Для обеспечения атомарности при работе с несколькими ключами используются легковесные блокировки VLL. Для эффективного хранения информации в памяти применяется структура dashtable, реализующая разновидность секционированных хэш-таблиц.

Из возможностей, доступных в первом выпуске отмечается поддержка протокола RESP2 и 130 команд Redis, что примерно соответствует функциональности выпуска Redis 2.8. Кроме того, Dragonfly поддерживает все команды memcached, кроме CAS (check and set), предоставляет поддержку асинхронных операций для создания снапшотов, обеспечивает предсказуемое потребление памяти, предоставляет встроенный интерпретатор Lua 5.4 и поддерживает сложные типы данных, такие как хэши, множества и списки (ZSET, HSET, LIST, SETS и STRING).

Отдельно доступен режим кэширования, при котором автоматически обеспечивается вытеснение старых данных новыми после исчерпания свободной памяти. Возможна привязка к данным времени жизни, в течение которого данные считаются актуальными. Состояние хранилища может сбрасываться на диск в фоновом режиме для последующего восстановления после перезапуска. Для управления системой предоставляется HTTP-консоль (привязывается к TCP-порту 6379) и API для отдачи метрик, совместимый с Prometheus. В следующих версиях планируется расширить поддержку команд Redis и реализовать возможность репликации хранилища для обеспечения отказоустойчивости и балансировки нагрузки.

Источник.