MySQL 半同步複制介於非同步與全同步之間:主庫提交事務前,至少等待一個從庫確認收到 Relay Log 並寫入磁碟。本文記錄基於插件的半同步複制完整部署、驗證與監控流程。
-- 1. 安裝主庫半同步插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
-- 2. 驗證插件載入
SHOW PLUGINS LIKE 'rpl_semi_sync%';
-- 3. 啟用半同步並設定超時時間 (毫秒)
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 3000; -- 3秒超時後退回非同步
-- 4. 持久化到配置檔
-- [mysqld]
-- rpl_semi_sync_master_enabled=1
-- rpl_semi_sync_master_timeout=3000
-- 1. 安裝從庫半同步插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
-- 2. 啟用從庫半同步
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
-- 3. 重啟 IO 線程以註冊半同步身份(關鍵步驟!)
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
SHOW STATUS LIKE 'Rpl_semi_sync_master%';
-- 關鍵指標:
-- Rpl_semi_sync_master_status = ON -- 半同步啟用
-- Rpl_semi_sync_master_clients = 1 -- 連接的半同步從庫數
-- Rpl_semi_sync_master_yes_tx = N -- 成功半同步提交事務數
-- Rpl_semi_sync_master_no_tx = N -- 退回非同步提交事務數
-- Rpl_semi_sync_master_tx_wait_time = N -- 總等待從庫確認時間(微秒)
SHOW STATUS LIKE 'Rpl_semi_sync_slave%';
-- 關鍵指標:
-- Rpl_semi_sync_slave_status = ON -- 從庫半同步狀態
-- Rpl_semi_sync_slave_received_heartbeats -- 收到心跳包數量
-- 主庫插入測試資料
INSERT INTO t1 VALUES('cc');
-- 觀察主庫狀態變化
SHOW STATUS LIKE 'Rpl_semi_sync_master%';
-- Rpl_semi_sync_master_yes_tx 應增加 1
-- Rpl_semi_sync_master_tx_wait_time 顯示等待延遲
| 參數 | 建議值 | 說明 |
|---|---|---|
| rpl_semi_sync_master_timeout | 1000-5000 | 網路延遲較大環境建議調大,避免頻繁退回非同步 |
| rpl_semi_sync_master_wait_point | AFTER_SYNC (5.7+) | AFTER_COMMIT 效能較好,AFTER_SYNC 數據安全性更高 |
| sync_binlog | 1 | 配合半同步必須設為 1,確保 Binlog 刷盤 |
| innodb_flush_log_at_trx_commit | 1 | 確保 Redo Log 刷盤,配合半同步提供雙重保障 |
STOP/START SLAVE IO_THREAD 重新註冊。plugin_dir 路徑正確,且 .so 檔案存在且版本匹配。