Выпуск Dragonfly 1.0, системы для кэширования данных в оперативной памяти

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

По сравнению с Redis в Dragonfly при типовых видах нагрузки удалось добиться 25-кратного увеличения производительности (3.8 млн запросов в секунду в окружении Amazon EC2 c6gn.16xlarge). По сравнению с Memcached в AWS-окружении c6gn.16xlarge Dragonfly смог выполнить в 4.7 раза больше запросов в секунду на запись (3.8 млн против 806 тысяч) и в 1.77 раз больше запросов в секунду на чтение (3.7 млн против 2.1 млн).

CFD0C5CECEC5D4_1653985197.png

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

CFD0C5CECEC5D4_1653989767.png

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

Некоторые возможности Dragonfly:

  • Режим кэширования, при котором автоматически обеспечивается вытеснение старых данных новыми после исчерпания свободной памяти.
  • Поддержка привязки к данным времени жизни, в течение которого данные считаются актуальными.
  • Поддержка сброса состояния хранилища на диск в фоновом режиме для последующего восстановления после перезапуска.
  • Наличие HTTP-консоли (привязывается к TCP-порту 6379) для управления системой и API для отдачи метрик, совместимый с Prometheus.
  • Поддержка 185 команд Redis, что примерно соответствует функциональности выпуска Redis 5.
  • Поддержка всех команд Memcached, кроме CAS (check-and-set).
  • Поддержка асинхронных операций для создания снапшотов.
  • Предсказуемое потребление памяти.
  • Встроенный интерпретатор Lua 5.4.
  • Поддержка сложных типов данных, таких как хэши, множества, списки (ZSET, HSET, LIST, SETS и STRING) и данные в формате JSON.
  • Поддержка репликации хранилища для обеспечения отказоустойчивости и балансировки нагрузки.

Код Dragonfly написан на языках C/С++ и распространяется под лицензией BSL (Business Source License). Лицензия BSL была предложена сооснователями MySQL в качестве альтернативы модели Open Core. Суть BSL в том, что код расширенной функциональности изначально доступен для внесения изменений, но в течение какого-то времени может применяться бесплатно только при соблюдении дополнительных условий, для обхода которых требуется приобретение коммерческой лицензии. Дополнительные лицензионные условия проекта Dragonfly предписывают перевод кода на лицензию Apache 2.0 15 марта 2028 года. До этого времени лицензия разрешает использование кода только для обеспечения работы своих сервисов и продуктов, но запрещает применение для создания платных облачных сервисов, выступающих надстройкой над Dragonfly.

Версия Dragonfly 1.0 примечательна реализацией поддержи репликации данных с первичного сервера на вторичный. При этом Dragonfly можно настроить для использования в качестве вторичного хранилища, принимающего данные с первичного сервера как на базе Dragonfly, так и на базе Redis. API для управления репликацией совместим с Redis и основан на применении команд ROLE и REPLICAOF (SLAVEOF).



Источник: http://www.opennet.ru/opennews/art.shtml? num=58830

© OpenNet