Для чего лучше подходят синхронные и асинхронные репликации
Что проверяют
Понимаете ли вы компромисс между сохранностью данных, задержкой и доступностью и умеете ли перенести его на свой сервис. Для Go-разработчика следом почти всегда идёт вопрос: что увидит пользователь, если сервис читает с реплики сразу после записи.
Как отвечать
Сначала определения. При синхронной репликации мастер подтверждает коммит клиенту только после того, как реплика получила запись. При асинхронной подтверждает сразу, а реплика догоняет с задержкой, replication lag.
- синхронная: подтверждённые данные при падении мастера не теряются (RPO равен нулю), но каждая запись ждёт сетевой круг до реплики, и медленная реплика тормозит всех. Подходит для денег, балансов, заказов, а реплику ставят в соседней зоне того же региона;
- асинхронная: запись быстрая, но при аварийном переключении последние транзакции теряются. Подходит для реплик на чтение, аналитики, резервной копии в другом регионе;
- кворумная: компромисс, запись ждёт подтверждения от части реплик. Так работают Raft в etcd и
acks=allсmin.insync.replicasв Kafka.
Покажите на конкретной базе. В PostgreSQL репликация по умолчанию асинхронная. Синхронность включается через synchronous_standby_names, в том числе в кворумном виде ANY 1 (s1, s2), а уровень задаёт synchronous_commit: remote_write, on или remote_apply. Только remote_apply гарантирует, что изменения уже видны при чтении с реплики.
В коде на Go это выливается в маршрутизацию: чтение сразу после записи отправляют на мастер, остальное на пул реплик, а задержку мониторят через pg_stat_replication.
Где спотыкаются
Считают, что синхронная репликация гарантирует свежие данные при чтении с реплики. При synchronous_commit = on запись на реплике сохранена, но может быть ещё не применена.
Забывают про доступность. Если единственная синхронная реплика упала, запись на мастере встанет и будет ждать, пока реплика не вернётся или её не уберут из списка.
Читают с реплики сразу после записи. Пользователь сохраняет профиль, обновляет страницу и видит старые данные, а в логах всё чисто.