在 CentOS 中,通常把“Trigger”理解为基于事件的触发式备份。常见做法有三类:基于 inotify 的 rsync 实时触发、使用 lsyncd 封装的近实时同步、以及定时触发(cron/systemd timer)作为兜底。下面给出可直接落地的配置示例与要点。
服务端(备份机,IP 示例:10.10.1.9)配置 rsync 守护进程
# /etc/rsyncd.conf
pid file = /var/run/rsyncd.pid
port = 873
address = 10.10.1.9
use chroot = no
read only = no
hosts allow = 10.10.1.6
[ htdocs ]
path = /data0/htdocs
comment = htdocs backup
auth users = backup
secrets file = /etc/rsyncd/rsyncd.secrets
echo "backup:YourStrongPass" > /etc/rsyncd/rsyncd.secrets
chmod 600 /etc/rsyncd/rsyncd.secrets
rsync --daemon
客户端(源机,IP 示例:10.10.1.6)监听并触发同步
#!/usr/bin/env bash
SRC="/data0/htdocs/"
HOST="10.10.1.9"
MODULE="htdocs"
USER="backup"
PASS="/etc/rsyncd/rsyncd.secrets" # 仅含密码
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' \
-e modify,delete,create,attrib "$SRC" | while read line; do
/usr/bin/rsync -vzrtopg --delete --password-file="$PASS" \
"$SRC" "${USER}@${HOST}::${MODULE}" >>/var/log/rsync.log 2>&1
echo "$line was rsynced" >>/var/log/rsync.log
done
chmod +x /root/shell/rsync.sh
setsid /root/shell/rsync.sh &
echo "/root/shell/rsync.sh" >> /etc/rc.local
firewall-cmd --add-port=873/tcp --permanent && firewall-cmd --reload
说明:首次全量,后续仅传变更;如需更细粒度事件可调整 inotify 事件集合。
安装与配置
-- /usr/local/lsyncd/etc/lsyncd.conf
settings {
logfile = "/usr/local/lsyncd/var/lsyncd.log",
statusFile = "/usr/local/lsyncd/var/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 8,
delay = 15,
}
sync {
default.rsync,
source = "/home/wwwroot/attachments",
target = "rsync137@192.168.1.137::rsyncd",
delete = true,
exclude = { ".*" },
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
password_file = "/etc/rsyncd.pwd",
_extra = { "--bwlimit=200" },
}
}
echo "YourStrongPass" > /etc/rsyncd.pwd
chmod 600 /etc/rsyncd.pwd
lsyncd /usr/local/lsyncd/etc/lsyncd.conf
说明:delay 可合并短时大量事件,减少频繁 rsync;支持 rsync/rsyncssh/direct 多种模式。
# 每天 03:30 执行
0 3 * * * /usr/bin/rsync -az --delete -e ssh /data/ user@backup:/backup/data-$(date +\%F)/
# /usr/lib/systemd/system/backup.service
[Unit]
Description=Daily backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /usr/lib/systemd/system/backup.timer
[Unit]
Description=Run backup daily at 03:30
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
Unit=backup.service
[Install]
WantedBy=timers.target
启用:
systemctl daemon-reload
systemctl enable --now backup.timer
说明:cron 简单通用;systemd timer 更便于按日历时间管理与查看状态。