Репликация: master-slave, multi-master и отставание реплик

Репликация — это держать несколько копий данных, чтобы пережить отказ и разгрузить чтение.

Репликация — поддержание копий одних и тех же данных на нескольких узлах. Это повышает доступность (упал один — есть копия) и масштабирует чтение.

Зачем реплицировать

  • Отказоустойчивость. Упал узел — данные не потеряны, другой подхватит.
  • Масштаб чтения. Чтения раскидываем по репликам, разгружая основной узел.
  • География. Реплика рядом с пользователем уменьшает задержку.

Master-slave (primary-replica)

Один узел — master — принимает все записи. Изменения копируются на slave-реплики, которые обслуживают только чтение. Это естественно ложится на типичную нагрузку «чтений в 100 раз больше, чем записей»: масштабируем чтение, добавляя реплики.

Запись ─────▶ [ MASTER ] ──копирует──▶ [ replica 1 ] ◀── чтение
                            └─────────▶ [ replica 2 ] ◀── чтение

Минус: master — единственный, кто принимает записи (точка отказа на запись). Если он падает, нужен failover — повысить одну из реплик до master. Это не мгновенно и требует аккуратности.

Multi-master

Записи принимают несколько узлов сразу. Плюс — нет единой точки отказа на запись и можно писать в ближайший узел. Минус — конфликты: два master'а одновременно изменили одну запись по-разному. Их приходится разрешать (по времени, по версиям, вручную), и это сложно. Multi-master берут, когда география или доступность записи важнее простоты.

Синхронная и асинхронная репликация

СвойствоСинхроннаяАсинхронная
Когда подтверждаем записьпосле копии на репликисразу после master'а
Скорость записимедленнее (ждём реплики)быстрая
Потеря данных при падении masterнетвозможна (не успело скопироваться)
Отставание репликнетесть

Отставание реплик (replication lag)

При асинхронной репликации реплика отстаёт от master'а на доли секунды — секунды. Классический баг: пользователь написал комментарий (запись в master), тут же перечитал страницу (чтение с реплики) — и не увидел свой комментарий, потому что до реплики он ещё не доехал.

Приём против lagСуть
Read-your-writesпосле записи читать с master'а (или дождаться реплику)
Sticky к master на времянесколько секунд после записи читать с master
Мониторить lagвыводить сильно отставшие реплики из чтения

Итог

  • Репликация даёт отказоустойчивость, масштаб чтения и близость к пользователю.
  • Master-slave прост и масштабирует чтение; multi-master убирает точку отказа на запись ценой конфликтов.
  • Асинхронная репликация быстра, но даёт lag — лечится read-your-writes и мониторингом.
Проверьте себя
1. Почему схема master-slave хорошо ложится на типичную веб-нагрузку?
AЗаписей всегда больше, чем чтений
BЧтений обычно намного больше — их масштабируют, добавляя реплики на чтение
CОна убирает любую точку отказа
DОна ускоряет запись
2. Что такое replication lag и чем он опасен?
AЗадержка сети между клиентом и сервером
BОтставание асинхронной реплики от master: пользователь может не увидеть только что записанные данные
CВремя запуска новой реплики
DЗадержка балансировщика
3. Главная сложность multi-master репликации — это…
Aневозможность чтения
Bконфликты записи, когда два узла по-разному изменили одну запись
Cотсутствие отказоустойчивости
Dслишком высокая скорость
4. Приём read-your-writes решает проблему отставания реплик за счёт…
Aотключения репликации
Bчтения с master (или дожидания реплики) сразу после собственной записи пользователя
Cудаления всех реплик
Dперехода на синхронную сеть
Поддержать проект