Redis больше десятилетия остаётся стандартом для кэша и очередей, но его ядро однопоточное: один экземпляр упирается в одно ядро, а частота процессоров почти не растёт. Dragonfly предлагает другой подход — многопоточный сервер с тем же протоколом RESP. Клиенты видят привычный Redis, а машина под ним использует все ядра и десятки гигабайт памяти.

Архитектура и совместимость

Dragonfly делит пространство ключей на сегменты, каждый обслуживает свой поток. Общие данные синхронизируются через разделяемую память, поэтому один экземпляр масштабируется вертикально. Для операций с несколькими ключами используют hash tags, чтобы ключи попали в один сегмент.

Протокол совместим с Redis и Memcached, поэтому подходят redis-cli, готовые клиенты и большинство библиотек. Но совместимость не абсолютна: модули вроде RediSearch или RedisJSON не поддерживаются, часть служебных команд отличается. Перед миграцией проверяют список используемых команд, а не только версию клиента.

Запуск в Docker

Самый быстрый способ познакомиться — контейнер с томом для снимков. Параметр —ulimit memlock=-1 снимает ограничение на блокировку памяти, иначе при больших объёмах возможны сюрпризы.

docker run -d --name dragonfly \
  --ulimit memlock=-1 \
  -p 6379:6379 \
  -v dragonfly-data:/data \
  docker.dragonflydb.io/dragonflydb/dragonfly \
  --maxmemory=8gb --proactor_threads=4

Проверка не отличается от Redis: тот же клиент, тот же ping. Если нужен пароль, добавьте —requirepass и не храните его в истории команд.

redis-cli -h 127.0.0.1 -p 6379 ping
redis-cli -p 6379 set session:42 active
redis-cli -p 6379 info memory
redis-cli -p 6379 dbsize

Параметры, которые важны

Настройки задают флагами командной строки или файлом. Для контейнера удобнее смонтировать файл с флагами в каталог конфигурации.

  • —maxmemory — верхняя граница памяти; без неё процесс может занять всё.
  • —proactor_threads — число потоков; обычно равно доступным ядрам.
  • —cache_mode — режим кэша с вытеснением, близкий к memcached.
  • —dir и —dbfilename — каталог и имя файла снимка.
  • —snapshot_cron — расписание фоновых снимков.
  • —replicaof — режим реплики с адресом мастера.

Значения по умолчанию рассчитаны на небольшую машину и почти всегда требуют правки. Отдельно проверьте лимиты контейнера: maxmemory должен быть меньше лимита памяти pod, иначе OOM-killer убьёт процесс раньше, чем сработает вытеснение.

Кэш или хранилище

В режиме кэша Dragonfly вытесняет ключи при достижении maxmemory и ведёт себя предсказуемо под нагрузкой. Без cache_mode превышение лимита приводит к ошибкам записи — это нормально для базы, где потеря ключа недопустима.

Выбор зависит от данных. Сессии, результаты запросов и счётчики переживут вытеснение. Очереди задач и блокировки — нет: для них нужен запас памяти, реплика и мониторинг. Смешивать оба сценария в одном экземпляре можно, но тогда кэш обязан иметь отдельный лимит или отдельный инстанс.

Отдельная тонкость — крупные значения. Многопоточность не помогает, если один ключ весит десятки мегабайт: такой запрос всё равно обрабатывается одним потоком и блокирует сегмент. Дробите большие объекты на части или храните их вне Redis-подобного хранилища.

Персистентность и репликация

Снимки пишутся в формате, совместимом с RDB, и загружаются при старте. Расписание задаёт cron, а ручной вызов доступен знакомой командой. Реплика подключается к мастеру и получает поток изменений; повышение выполняют вручную или с помощью оператора.

redis-cli -p 6379 info persistence
redis-cli -p 6379 save
redis-cli -p 6379 replicaof 10.0.0.10 6379
redis-cli -p 6379 info replication

Для отказоустойчивости одной реплики мало: нужен внешний арбитр или оркестратор, который переключит клиентов. В Kubernetes это делает оператор, в виртуальных машинах — связка с балансировщиком и health-check.

Замеры и диагностика

Сравнивать имеет смысл на своём профиле нагрузки. memtier_benchmark и redis-benchmark дают отправную точку, но решают не они, а задержка на ваших запросах.

memtier_benchmark -h 127.0.0.1 -p 6379 -t 4 -c 50 \
  --test-time=60 --ratio=1:9 --key-pattern=S:S
redis-cli -p 6379 --latency
redis-cli -p 6379 slowlog get 10
redis-cli -p 6379 info everything

Смотрите на p99, а не на среднее, и отдельно — на время вытеснения. Рост задержки при стабильном CPU часто означает нехватку памяти или слишком крупные значения. Метрики Prometheus отдаются по HTTP на admin-порту, если он включён.

Прогревайте стенд перед измерениями и повторяйте прогон несколько раз: первый запуск включает прогрев страниц и аллокаторов. Сравнивайте одинаковые конфигурации потоков, иначе разница будет отражать настройки, а не движок.

Переезд с Redis

Сначала инвентаризация: какие команды, модули, скрипты и клиентские библиотеки используются. Затем Dragonfly поднимают рядом и направляют на него теневой трафик или тестовый контур. Рабочая схема — сделать Dragonfly репликой текущего Redis, дождаться синхронизации, остановить запись, повысить реплику и переключить клиентов.

Откат должен быть готов до переключения: старый экземпляр не удаляют, пока новый не отработает под нагрузкой хотя бы сутки. Отдельно проверяют TTL, поведение при вытеснении и работу скриптов. Клиентам заранее увеличивают таймауты и число повторов, иначе короткая пауза при переключении превратится в шквал ошибок.

Эксплуатация в Kubernetes

Оператор создаёт StatefulSet с постоянным томом и сервисом. В манифесте задают память, число потоков и расписание снимков; лимит памяти контейнера держат выше maxmemory на 20–30 процентов.

kubectl apply -f dragonfly.yaml
kubectl -n cache get pods,pvc
kubectl -n cache logs dragonfly-0 --tail=100
kubectl -n cache exec -it dragonfly-0 -- redis-cli info memory

Проверьте, что readiness-проба действительно отвечает на ping, а не просто открывает порт. При обновлении образа сначала меняют реплики, затем мастера, иначе будет короткий простой записи. Отдельно ограничьте ресурсы: без requests планировщик поставит pod на перегруженный узел, и задержки вырастут без видимой причины.

Чек-лист

  • Список команд и модулей сверен с поддержкой.
  • maxmemory ниже лимита контейнера, вытеснение проверено.
  • Снимки пишутся по расписанию и восстанавливаются.
  • Реплика и процедура повышения описаны.
  • Алерты на память, p99 и ошибки записи настроены.

Итог

Dragonfly даёт знакомый Redis-протокол и лучше использует современное железо, но требует дисциплины: проверенной совместимости, явных лимитов памяти и готового плана отката. Если один экземпляр упирается в ядро или память, это разумный шаг. Если нужны модули Redis Stack, сначала убедитесь, что их чем заменить.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте