Репликация: 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 и мониторингом.