主庫寫入壓力大,從庫單線程重放 (MySQL 5.6 前) 或多線程 (MTS) 仍落後。排除網絡、硬體、長事務後,核心參數 innodb_flush_log_at_trx_commit 往往是關鍵。
| 值 | 行為 | 持久性 | 效能 | 適用場景 |
|---|---|---|---|---|
| 1 (預設) | 每次 Commit:Log Buffer → OS Cache → **fsync 到磁碟** | 最高 (ACID 完整) | 最低 (每提交一次 fsync) | 核心業務、金融、不可丟失數據 |
| 2 | 每次 Commit:Log Buffer → OS Cache,**不 fsync**;後台線程每秒 fsync | 高 (OS Crash 可能丟 1 秒) | 高 (避免每提交 fsync) | **從庫推薦**、可容忍秒級丟失的業務 |
| 0 | Commit 不寫 Log Buffer;後台線程每秒寫入 OS Cache 並 fsync | 低 (MySQL Crash 丟 1 秒) | 最高 | 極高寫入、可重建數據 (日誌、監控) |
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
-- 通常顯示 1
SET GLOBAL innodb_flush_log_at_trx_commit = 2;
-- 或更激進
SET GLOBAL innodb_flush_log_at_trx_commit = 0;
vim /etc/mysql/conf.d/replica_perf.cnf
[mysqld]
innodb_flush_log_at_trx_commit = 2
# 配合增大 redo log 緩衝
innodb_log_buffer_size = 64M
# 如使用 MTS (多線程複製)
slave_parallel_workers = 8
slave_parallel_type = LOGICAL_CLOCK
systemctl restart mysqld
SHOW SLAVE STATUS\G
# 關注 Seconds_Behind_Master 持續下降趨勢
# 觀察 Innodb_log_waits、Innodb_log_write_requests 等狀態
#!/bin/bash
# check_replica_lag.sh
LAG=$(mysql -u root -p -N -e "SHOW SLAVE STATUS\G" | grep Seconds_Behind_Master | awk '{print $2}')
if [ "$LAG" -gt 300 ]; then
echo "⚠️ 從庫延遲 ${LAG}s,請檢查"
# 發送告警 (企業微信/釘釘/郵件)
fi
sql_log_bin=0 時修改此參數不寫入 Binlog,避免污染主庫 (若誤升主)。innodb_log_waits 應接近 0。一參數調優,從庫延遲從小時級降至秒級,複製鏈路暢通無阻。