Binlog 是 MySQL 數據恢復與主從復制的命脈。本文實踐基於 inotify 內核事件監聽 + rsync 增量同步 + SSH 加密傳輸,構建毫秒級 Binlog 實時異地備份,RPO 接近零,成本極低。
# Server A (源端)
yum -y install rsync inotify-tools openssh-clients
# Server B (目標端)
yum -y install rsync openssh-server
# 兩台服務器同步創建用戶
useradd rsync_backup
passwd rsync_backup # 設置強密碼
# Server A 生成密鑰對
su - rsync_backup
ssh-keygen -t rsa -b 4096 # 全程回車,無密碼短語
# 生成 ~/.ssh/id_rsa (私鑰) 和 ~/.ssh/id_rsa.pub (公鑰)
# 分發公鑰到 Server B
scp ~/.ssh/id_rsa.pub rsync_backup@192.168.1.121:~/
# Server B 部署公鑰
su - rsync_backup
mkdir -p ~/.ssh && chmod 700 ~/.ssh
mv ~/id_rsa.pub ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 重啟 SSH 服務 (雙端)
systemctl restart sshd
# 驗證免密登錄
ssh rsync_backup@192.168.1.121 # 應直接進入無需密碼
/usr/bin/inotifywait -mrq -e modify,delete,create,attrib /usr/local/mysql/binlog/
# -m 持續監聽 (不退出)
# -r 遞歸監聽目錄樹
# -q 安靜模式,僅輸出事件行
# -e 監聽事件: modify(寫入/追加), delete(刪除), create(創建), attrib(屬性變更)
# 輸出格式: 目錄 事件 文件名
# 例: /usr/local/mysql/binlog/ MODIFY mysql-bin.000027
#!/bin/bash
# 配置區
SRC_DIR="/usr/local/mysql/binlog/" # 末尾必須有斜杠,表示同步目錄內容
DST_USER="rsync_backup"
DST_HOST="192.168.1.121"
DST_DIR="/home/rsync_backup/mysql_binlog_backup/" # 目標目錄,需提前創建
LOG_FILE="/var/log/binlog_sync.log"
# rsync 參數解析
# -a 歸檔模式 (保留權限、屬主、時間戳、符號鏈接等)
# -h 人類可讀輸出
# -q 安靜模式
# -z 壓縮傳輸
# -t 保留修改時間
# --delete 刪除目標端源端不存在的文件 (保持鏡像一致)
# -e ssh 指定 SSH 傳輸
/usr/bin/inotifywait -mrq -e modify,delete,create,attrib "${SRC_DIR}" | while read DIR EVENT FILE; do
echo "$(date '+%F %T') [EVENT] ${DIR}${FILE} ${EVENT}" >> "${LOG_FILE}"
/usr/bin/rsync -ahqzt --delete -e ssh "${SRC_DIR}" "${DST_USER}@${DST_HOST}:${DST_DIR}" >> "${LOG_FILE}" 2>&1
if [ $? -eq 0 ]; then
echo "$(date '+%F %T') [SYNC OK] ${FILE}" >> "${LOG_FILE}"
else
echo "$(date '+%F %T') [SYNC FAIL] ${FILE}" >> "${LOG_FILE}"
fi
done
chmod +x /home/rsync_backup/binlog_sync.sh
# 後台常駐運行 (生產建議用 systemd 管理)
su - rsync_backup
nohup ./binlog_sync.sh &
# 或創建 systemd 服務 /etc/systemd/system/binlog-sync.service
[Unit]
Description=MySQL Binlog Real-time Sync
After=network.target
[Service]
User=rsync_backup
ExecStart=/home/rsync_backup/binlog_sync.sh
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=binlog-sync
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now binlog-sync
systemctl status binlog-sync
[mysqld]
log-bin=/usr/local/mysql/binlog/mysql-bin # 明確指定目錄與文件名前綴
binlog_format=ROW
expire_logs_days=7
max_binlog_size=1G
# 確保 rsync_backup 用戶對 /usr/local/mysql/binlog/ 有讀取權限
chown -R mysql:rsync_backup /usr/local/mysql/binlog/
chmod 750 /usr/local/mysql/binlog/
PURGE BINARY LOGS),目標端同步刪除 → 異地備份也丟失。
--backup --backup-dir=/path/to/archive/$(date +%F),刪除的文件自動歸檔保留。fs.inotify.max_user_watches 默認 8192,大量 Binlog 文件可能不夠。
echo 524288 > /proc/sys/fs/inotify/max_user_watches (永久寫入 /etc/sysctl.conf)rsync --timeout=30 --contimeout=10。--block-size=8192 或改用 xbstream 流式傳輸 (XtraBackup 生態)。usermod -s /sbin/nologin rsync_backup)。binlog-sync 服務狀態、目標磁盤空間、同步延遲 (對比源端最新 Binlog mtime 與目標端)。目標端 Server B 可同時接收多台 MySQL 主庫 Binlog,只需在不同子目錄下運行獨立同步腳本/服務,目錄結構如:
/home/rsync_backup/mysql_binlog_backup/
├── db-master-01/
│ ├── mysql-bin.000001
│ └── ...
├── db-master-02/
│ └── ...
└── archive/ # --backup-dir 歸檔區
該方案零授權成本、依賴系統原生工具、部署簡單、RPO 秒級,適合中小規模、單/雙主庫場景。大規模、高合規要求場景建議上專業備份平台 (如 Percona XtraBackup + MinIO/S3、Oracle ZDM、Veritas NetBackup)。