Настройка полусинхронной репликации в MySQL (Semi-Synchronous Replication)
- Риск потери зафиксированных транзакций при внезапном падении основного мастера в асинхронной схеме.
- Необходимость гарантии того, что хотя бы одна реплика сохранила транзакцию в Relay Log перед подтверждением клиенту.
- Деградация полусинхронной репликации в асинхронный режим из-за сетевых таймаутов.
1. Установка плагинов на Мастере и Реплике
На основном сервере (Master):
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
# Для MySQL 8.0.26+: rpl_semi_sync_source.soНа сервере-реплике (Replica):
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
# Для MySQL 8.0.26+: rpl_semi_sync_replica.so2. Конфигурация параметров на Мастере
В /etc/mysql/my.cnf (Master):
[mysqld]
# Включение полусинхронного режима
rpl_semi_sync_master_enabled = 1
# Таймаут ожидания ответа от реплики в мс перед переходом в асинхрон (10 сек)
rpl_semi_sync_master_timeout = 10000
# Минимальное количество реплик, обязанных подтвердить запись транзакции
rpl_semi_sync_master_wait_no_slave = 1
# Точка ожидания подтверждения (AFTER_SYNC защищает от фантомных чтений)
rpl_semi_sync_master_wait_point = AFTER_SYNC3. Конфигурация параметров на Реплике
В /etc/mysql/my.cnf (Replica):
[mysqld]
rpl_semi_sync_slave_enabled = 1Перезапустите поток репликации на реплике:
STOP REPLICA; START REPLICA;4. Проверка статуса полусинхронной репликации
# На мастере
SHOW STATUS LIKE 'Rpl_semi_sync_master_status'; # Должно быть: ON
SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx'; # Количество подтвержденных транзакций Частые вопросы (FAQ)
В чем разница между режимами AFTER_COMMIT и AFTER_SYNC?
В режиме AFTER_SYNC мастер сначала ждет записи транзакции в Relay Log реплики и только затем фиксирует ее в локальном хранилище, что исключает рассинхронизацию данных при падении мастера.
Что происходит, если все реплики недоступны дольше rpl_semi_sync_master_timeout?
Мастер автоматически временно деградирует до стандартной асинхронной репликации, чтобы не блокировать запись в приложении, и автоматически вернется в полусинхронный режим при восстановлении связи.