Состоялся релиз системы кэширования и хранения данных в оперативной памяти Dragonfly, которая манипулирует данными в формате ключ/значение и может применяться как легковесное решение для ускорения работы высоконагруженных сайтов, кэширующее медленные запросы к СУБД и промежуточные данные в оперативной памяти. Dragonfly поддерживает протоколы Memcached и Redis, что позволяет использовать уже существующие клиентские библиотеки и без переработки кода переводить на Dragonfly проекты, использующие Memcached и Redis.
По сравнению с Redis в Dragonfly при типовых видах нагрузки в окружении Amazon EC2 c6gn.16xlarge удалось добиться 25-кратного увеличения производительности (3.8 млн запросов в секунду). По сравнению с Memcached в AWS-окружении c6gn.16xlarge Dragonfly смог выполнить в 4.7 раза больше запросов в секунду на запись (3.8 млн против 806 тысяч) и в 1.77 раз больше запросов в секунду на чтение (3.7 млн против 2.1 млн).
В тестах на хранение 5 ГБ данных Dragonfly потребовал на 30% меньше памяти, чем Redis. Во время создания снапшотов командой "bgsave" потребление памяти возрастает, но в пиковые моменты оно оставалось почти в три раза меньше, чем в Redis, а сама операция записи снапшота выполняется значительно быстрее (в тесте снапшот в Dragonfly был записан за 30 секунд, а Redis - за 42 секунды).
Высокая производительность достигается благодаря многопоточной архитектуре без разделения ресурсов (shared-nothing), подразумевающей, что к каждому потоку привязывается отдельный обособленный обработчик со своей порцией данных, работающий без мьютексов и spin-блокировок. Для обеспечения атомарности при работе с несколькими ключами используются легковесные блокировки VLL. Для эффективного хранения информации в памяти применяется структура dashtable, реализующая разновидность секционированных хэш-таблиц.
Некоторые возможности Dragonfly:
Версия Dragonfly 1.0 примечательна реализацией поддержи репликации данных с первичного сервера на вторичный. При этом Dragonfly можно настроить для использования в качестве вторичного хранилища, принимающего данные с первичного сервера как на базе Dragonfly, так и на базе Redis. API для управления репликацией совместим с Redis и основан на применении команд ROLE и REPLICAOF (SLAVEOF).
По сравнению с Redis в Dragonfly при типовых видах нагрузки в окружении Amazon EC2 c6gn.16xlarge удалось добиться 25-кратного увеличения производительности (3.8 млн запросов в секунду). По сравнению с Memcached в AWS-окружении c6gn.16xlarge Dragonfly смог выполнить в 4.7 раза больше запросов в секунду на запись (3.8 млн против 806 тысяч) и в 1.77 раз больше запросов в секунду на чтение (3.7 млн против 2.1 млн).
В тестах на хранение 5 ГБ данных Dragonfly потребовал на 30% меньше памяти, чем Redis. Во время создания снапшотов командой "bgsave" потребление памяти возрастает, но в пиковые моменты оно оставалось почти в три раза меньше, чем в Redis, а сама операция записи снапшота выполняется значительно быстрее (в тесте снапшот в Dragonfly был записан за 30 секунд, а Redis - за 42 секунды).
Высокая производительность достигается благодаря многопоточной архитектуре без разделения ресурсов (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 1.0 примечательна реализацией поддержи репликации данных с первичного сервера на вторичный. При этом Dragonfly можно настроить для использования в качестве вторичного хранилища, принимающего данные с первичного сервера как на базе Dragonfly, так и на базе Redis. API для управления репликацией совместим с Redis и основан на применении команд ROLE и REPLICAOF (SLAVEOF).