Ответ
Репликация — это процесс создания и синхронизации нескольких копий (реплик) одной и той же базы данных на разных серверах. Основная копия называется master (или primary), а остальные — slave (или replica).
Основные цели репликации:
Отказоустойчивость (High Availability): Если основной сервер (master) выходит из строя, система может автоматически переключиться на одну из реплик, минимизируя или полностью исключая простой в работе сервиса.
Масштабирование нагрузки (Scale-out): Нагрузку можно распределить между серверами. Как правило, все запросы на запись (
INSERT
,UPDATE
,DELETE
) отправляются на master-сервер, а запросы на чтение (SELECT
) распределяются между несколькими slave-серверами. Это значительно повышает общую производительность системы.Уменьшение задержек (Low Latency): Реплики можно размещать в разных географических регионах. Пользователи будут обращаться к ближайшему серверу, что сокращает время отклика.
Типы репликации:
- Асинхронная: Master-сервер записывает изменения и немедленно отвечает клиенту, а затем отправляет обновления на реплики. Это быстро, но есть риск потери данных, если master упадет до того, как данные будут скопированы.
- Синхронная: Master-сервер ждет подтверждения от одной или нескольких реплик, что данные были записаны, и только после этого отвечает клиенту. Это надежно, но увеличивает задержку на запись.
Как это используется в приложении на Go:
Вместо прямого указания хоста реплики в коде, как правило, используют более гибкие подходы:
- Два пула соединений: Приложение настраивает два источника данных (Data Sources):
- Один для записи, который всегда указывает на master-сервер.
- Второй для чтения, который является балансировщиком нагрузки между всеми slave-серверами.
- Прокси-сервер: Используется специальный прокси (например, ProxySQL), который автоматически направляет запросы на запись и чтение на нужные серверы. Приложение подключается только к прокси.
Важный аспект: При асинхронной репликации возникает лаг репликации — небольшая задержка, из-за которой данные на реплике могут быть неактуальными. Это нужно учитывать при проектировании системы.