Открыть сервис

Репликация Redis

Репликация Redis — это механизм асинхронного копирования данных с одного узла Redis (главного, или мастер-узла) на один или несколько подчинённых узлов (реплик, или слейв-узлов), обеспечивающий отказоустойчивость, масштабирование чтения и резервирование данных. Репликация является одной из ключевых функций Redis, позволяющей создавать распределённые конфигурации без использования внешних инструментов кластеризации.

Архитектура и принцип работы

Репликация в Redis построена по модели «ведущий — ведомый» (master-replica). Мастер-узел принимает все операции записи и модификации данных, а реплики получают от него копию данных и обслуживают запросы на чтение. Репликация является асинхронной: мастер не ждёт подтверждения от реплик перед завершением операции записи, что обеспечивает низкую задержку на мастере, но допускает потенциальную потерю данных при сбое мастера до синхронизации с репликами.

Типы репликации

  1. Асинхронная репликация (по умолчанию) — мастер отправляет команды записи репликам без ожидания их подтверждения. Реплики могут отставать от мастера на несколько команд или миллисекунд.
  2. Полусинхронная репликация (с опцией WAIT) — Redis поддерживает команду WAIT, которая позволяет блокировать запись на мастере до тех пор, пока указанное количество реплик не подтвердит получение данных. Это не делает репликацию полностью синхронной, но даёт возможность гарантировать определённый уровень согласованности.

Процесс синхронизации

При подключении новой реплики или после разрыва соединения выполняется полная синхронизация (full resynchronization):

  • Мастер создаёт моментальный снимок данных (RDB-файл) с помощью фонового процесса fork.
  • Снимок передаётся реплике по сети.
  • Реплика загружает полученный RDB-файл в память.
  • После загрузки мастер начинает отправлять реплике все последующие команды записи, накопленные в буфере репликации (replication backlog).

После завершения полной синхронизации реплика переходит в режим частичной синхронизации (partial resynchronization), при которой мастер передаёт только команды, произошедшие после последней точки синхронизации. Это возможно благодаря использованию уникального идентификатора репликации (replication ID) и смещения в буфере (offset).

История развития

Репликация появилась в Redis версии 1.0 (2009 год) как базовая возможность копирования данных с одного сервера на другой. В версии 2.8 (2013 год) была введена частичная синхронизация, значительно сократившая время восстановления после кратковременных разрывов соединения. В версии 5.0 (2018 год) репликация была улучшена за счёт поддержки потоковой передачи данных и оптимизации буфера. В версии 6.0 (2020 год) появилась поддержка SSL/TLS для шифрования трафика репликации, а также возможность настройки реплик только для чтения (replica-read-only).

Настройка и конфигурация

Репликация настраивается через файл конфигурации redis.conf или с помощью команд во время выполнения.

Основные параметры конфигурации

  • replicaof <master-ip> <master-port> — указывает реплике адрес и порт мастера для подключения.
  • masterauth <password> — задаёт пароль для аутентификации на мастере (если мастер использует пароль).
  • replica-read-only yes — запрещает запись на реплике (по умолчанию включено).
  • repl-backlog-size <bytes> — размер буфера репликации, хранящего команды для частичной синхронизации.
  • repl-timeout <seconds>тайм-аут ожидания ответа от реплики или мастера.
  • replica-serve-stale-data yes — разрешает реплике отвечать на запросы чтения, даже если она не полностью синхронизирована с мастером.

Команды для управления репликацией

  • REPLICAOF <host> <port> — подключает текущий узел как реплику к указанному мастеру.
  • REPLICAOF NO ONE — отключает репликацию и превращает реплику в самостоятельный мастер.
  • INFO replication — выводит информацию о состоянии репликации на узле.
  • WAIT <numreplicas> <timeout> — блокирует запись до подтверждения указанным числом реплик.

Преимущества и ограничения

Преимущества

  • Отказоустойчивость: при сбое мастера одна из реплик может быть повышена до мастера (вручную или с помощью Redis Sentinel).
  • Масштабирование чтения: реплики могут обслуживать запросы на чтение, снижая нагрузку на мастер.
  • Резервирование данных: реплики хранят копию данных, что защищает от потери при аппаратном сбое мастера.
  • Простота настройки: репликация настраивается одной строкой конфигурации.

Ограничения

  • Асинхронность: возможна потеря данных при сбое мастера до синхронизации с репликами (окно потери — до нескольких секунд).
  • Однонаправленность: репликация работает только от мастера к репликам; реплики не могут реплицировать данные друг другу (кроме каскадной репликации, где реплика может быть мастером для других реплик).
  • Задержка на репликах: реплики могут отставать от мастера, особенно при высокой нагрузке на запись.
  • Отсутствие автоматического переключения: базовая репликация не включает автоматическое повышение реплики при сбое мастера — для этого требуется Redis Sentinel или Redis Cluster.

Применение

Репликация Redis широко используется в веб-приложениях, системах кэширования, очередях сообщений и аналитических платформах. Типичные сценарии:

  • Кэширование базы данных: мастер принимает запись, реплики обслуживают чтение.
  • Географическое распределение: реплики размещаются в разных дата-центрах для снижения задержек.
  • Резервное копирование: реплика используется для создания резервных копий без нагрузки на мастер.
  • Отказоустойчивые конфигурации: в связке с Redis Sentinel репликация обеспечивает автоматическое восстановление после сбоя мастера.

Репликация в Redis Cluster

Redis Cluster — это распределённая реализация Redis, которая включает встроенную репликацию. Каждый шард (хэш-слот) в кластере имеет один мастер-узел и одну или несколько реплик. Репликация в кластере работает по тому же принципу, что и в standalone-режиме, но управление переключением при сбое мастера осуществляется автоматически с помощью протокола кластера (gossip-протокол и голосование). В отличие от базовой репликации, Redis Cluster не требует внешних инструментов для автоматического восстановления.

Безопасность

При настройке репликации в Redis следует учитывать аспекты безопасности:

  • Аутентификация: мастер может требовать пароль для подключения реплик (параметр requirepass и masterauth).
  • Шифрование: начиная с Redis 6.0, поддерживается шифрование трафика репликации через SSL/TLS.
  • Изоляция сети: рекомендуется размещать мастер и реплики в одной защищённой сети, чтобы предотвратить несанкционированный доступ.
  • Ограничение доступа: репликация не должна быть доступна из публичных сетей без шифрования и аутентификации.

Интересные факты

  • Redis использует однонаправленный поток команд репликации, что делает невозможным репликацию от реплики к мастеру (за исключением каскадной конфигурации).
  • Буфер репликации (repl-backlog) хранит команды в кольцевом буфере, что позволяет выполнять частичную синхронизацию даже после кратковременного разрыва соединения.
  • Репликация Redis не требует блокировки мастера на время полной синхронизации — создание RDB-файла происходит в фоновом процессе.
  • В Redis 7.0 была введена поддержка репликации с несколькими потоками (multi-threaded replication), что улучшило производительность на многоядерных системах.

Источники

  • Официальная документация Redis: «Replication» (redis.io/topics/replication)
  • Salvatore Sanfilippo, «Redis Replication: A Deep Dive» (2015)
  • Redis 6.0 Release Notes (2020)
  • Redis 7.0 Release Notes (2022)
  • «Redis in Action» by Josiah L. Carlson (2013)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →