在主從複制架構中,從庫會即時同步主庫的變更。若發生誤操作(如 DROP TABLE、DELETE 無 WHERE),錯誤會同步至所有從庫,導致資料全數遺失。延遲從庫會在設定的時間窗口內「暫停」同步,保留一份「時間機器」版本的資料,讓我們有機會在災難發生後從延遲從庫找回資料。
此外,高併發下即時同步會對主庫造成網路與 I/O 壓力,延遲同步可透過控制檢查頻率,減輕主庫負載。
| 角色 | 主機名 | IP | 說明 |
|---|---|---|---|
| Master | serv01 | 192.168.1.11 | 主庫,寫入來源 |
| Slave (即時) | serv08 | 192.168.1.18 | 即時同步,提供讀取服務 |
| Slave (延遲) | serv09 | 192.168.1.19 | 延遲 3 分鐘同步,作為備份保護 |
作業系統:RHEL 6.1 x64
MySQL:5.5.29
工具:percona-toolkit 2.1.7 (含 pt-slave-delay)
三台主機 /etc/my.cnf 分別設定 server-id = 1/2/3,確保唯一。
# Master
mysql> RESET MASTER;
# Slave 兩台
mysql> RESET MASTER;
GRANT REPLICATION SLAVE ON *.* TO 'larry'@'192.168.1.%' IDENTIFIED BY 'larry';
CHANGE MASTER TO
MASTER_HOST='192.168.1.11',
MASTER_USER='larry',
MASTER_PASSWORD='larry',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;
START SLAVE;
SHOW SLAVE STATUS\G
確認 Slave_IO_Running: Yes、Slave_SQL_Running: Yes、Seconds_Behind_Master: 0。
步驟同 serv08,此時兩台 Slave 均為即時同步。
在 Master 建立測試資料庫 justdb,確認 serv08、serv09 均同步成功。
scp percona-toolkit-2.1.7-1.noarch.rpm 192.168.1.11:/opt
yum install percona-toolkit-2.1.7-1.noarch.rpm -y
# 在 serv09 執行
GRANT ALL ON *.* TO 'rep'@'192.168.1.%' IDENTIFIED BY 'larry';
pt-slave-delay --user='rep' --password='larry' \
--delay=3m --interval=20s --run-time=30m 192.168.1.19
參數說明:
--delay=3m:延遲 3 分鐘同步--interval=20s:每 20 秒檢查一次同步狀態--run-time=30m:工具運行 30 分鐘後自動結束 (生產環境建議加 --daemonize 常駐)192.168.1.19:延遲 Slave IP在 Master 執行:
USE justdb;
CREATE TABLE test(id INT);
INSERT INTO test VALUES(1);
結果:
Table 'justdb.test' doesn't exist工具日誌會顯示 STOP SLAVE / START SLAVE 切換過程,確認機制運作正常。
#!/bin/bash
# chkconfig: - 88 12
# description: mysql ab delay scripts
host=192.168.100.54
user=rep
password=larry
delay=2m
in=15s
prog=/usr/bin/pt-slave-delay
. /etc/init.d/functions
start() {
echo -n "Starting `basename $prog`..."
daemon $prog --host=$host --user=$user --password=$password \
--delay=$delay --interval=$in --daemonize --log=/var/log/mysql-delay.log
echo
}
stop() {
echo -n "Stopping `basename $prog`..."
killproc $prog
echo
}
case "$1" in
start) start ;;
stop) stop ;;
restart) stop; start ;;
*) echo "Usage: $0 {start|stop|restart}"; exit 1
esac
將腳本放入 /etc/init.d/mysql-delay,chkconfig --add mysql-delay 即可開機自啟。
pt-slave-delay 進程存活,避免意外結束導致延遲失效。xtrabackup 定期全量備份,構建多層防護體系。