rsync同步
rsync
一、介绍
rsync
是一个功能强大的、高效的用于数据镜像(备份)、文件传输和同步的工具。它可以在本地主机和远程主机之间进行快速同步,并且只传输两个机器之间不同的部分。
基本用法
rsync [选项] 源目录 目标目录
- 源目录:要同步的源文件或目录。
- 目标目录:同步的目标文件或目录。
常用选项
-a
:归档模式,保留所有文件属性,包括权限、时间、组、所有者等。等同于-rlptgoD
。-r
:递归处理目录。-l
:保留软链接。-p
:保留权限。-t
:保留修改时间。-g
:保留组。-o
:保留所有者。-D
:保留设备文件和特殊文件。-v
:详细模式,显示详细的传输过程。-z
:压缩传输数据,可以加快传输速度,尤其是对于文本文件。-e
:指定远程 shell,通常为ssh
。--delete
:删除目标目录中不存在于源目录的文件。--exclude=PATTERN
:排除符合 PATTERN 的文件或目录。--include=PATTERN
:仅包含符合 PATTERN 的文件或目录。
二、安装配置
1. 检查是否安装
[root@234-12 ~]# rpm -qa | grep rsync
rsync-3.1.2-12.el7_9.x86_64
如果命令结果为空,可以使用以下命令安装:
yum install -y rsync
2. 配置文件解析
查看 rsync 安装文件情况
[root@234-12 ~]# rpm -ql rsync
/etc/rsyncd.conf # 配置文件
/etc/sysconfig/rsyncd # 守护进程配置
/usr/bin/rsync # 命令所在目录
/usr/lib/systemd/system/rsyncd.service # systemctl 服务管理
/usr/lib/systemd/system/rsyncd.socket # 进程生成的套接字文件
/usr/lib/systemd/system/rsyncd@.service
/usr/share/doc/rsync-3.1.2
/usr/share/doc/rsync-3.1.2/COPYING
/usr/share/doc/rsync-3.1.2/NEWS
/usr/share/doc/rsync-3.1.2/OLDNEWS
/usr/share/doc/rsync-3.1.2/README
/usr/share/doc/rsync-3.1.2/support
/usr/share/doc/rsync-3.1.2/support/Makefile
/usr/share/doc/rsync-3.1.2/support/atomic-rsync
/usr/share/doc/rsync-3.1.2/support/cvs2includes
/usr/share/doc/rsync-3.1.2/support/deny-rsync
/usr/share/doc/rsync-3.1.2/support/file-attr-restore
/usr/share/doc/rsync-3.1.2/support/files-to-excludes
/usr/share/doc/rsync-3.1.2/support/git-set-file-times
/usr/share/doc/rsync-3.1.2/support/instant-rsyncd
/usr/share/doc/rsync-3.1.2/support/logfilter
/usr/share/doc/rsync-3.1.2/support/lsh
/usr/share/doc/rsync-3.1.2/support/lsh.sh
/usr/share/doc/rsync-3.1.2/support/mapfrom
/usr/share/doc/rsync-3.1.2/support/mapto
/usr/share/doc/rsync-3.1.2/support/mnt-excl
/usr/share/doc/rsync-3.1.2/support/munge-symlinks
/usr/share/doc/rsync-3.1.2/support/rrsync
/usr/share/doc/rsync-3.1.2/support/rsync-no-vanished
/usr/share/doc/rsync-3.1.2/support/rsync-slash-strip
/usr/share/doc/rsync-3.1.2/support/rsyncstats
/usr/share/doc/rsync-3.1.2/support/savetransfer.c
/usr/share/doc/rsync-3.1.2/tech_report.tex
/usr/share/man/man1/rsync.1.gz
/usr/share/man/man5/rsyncd.conf.5.gz
rsync 配置文件详解
# rsync 配置文件详解
# uid = nobody # 指定 rsyncd 运行时的用户
# gid = nobody # 指定 rsyncd 运行时的组
# use chroot = yes # 启用 chroot 功能,提高安全性
# max connections = 4 # 限制同时可以连接到 rsyncd 的最大连接数
# pid file = /var/run/rsyncd.pid # 指定 rsyncd 进程的 PID 文件
# exclude = lost+found/ # 排除 lost+found 目录
# transfer logging = yes # 启用传输日志记录
# timeout = 900 # 设置连接超时时间
# ignore nonreadable = yes # 忽略无法读取的文件
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # 不压缩某些类型的文件
# [ftp]
# path = /home/ftp # 指定 "ftp" 模块的同步根目录
# comment = ftp export area # 注释,说明 "ftp" 模块的作用
三、本地同步
以下是实现文件监控和自动同步的方案:
1. 安装 inotify-tools
inotify-tools
是一个 Linux 实时文件系统监控工具,可以监控目录的文件变动。首先,你需要在 CentOS 上安装它。
sudo yum install inotify-tools -y
2. 创建监控和同步脚本
编写一个脚本,当 /home/zhangsan
、/home/lisi
、/home/wangwu
目录发生变动时自动触发 rsync
同步到 /backup
目录。
脚本示例:rsync_inotify_sync.sh
#!/bin/bash
# 定义要监控的目录
SOURCE_DIRS=("/home/zhangsan" "/home/lisi" "/home/wangwu")
BACKUP_DIR="/backup"
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 监控目录并实时同步
for dir in "${SOURCE_DIRS[@]}"; do
# 获取当前目录的名称
BASENAME=$(basename "$dir")
echo "正在监控目录:$dir"
# 使用 inotifywait 监控创建、修改和删除事件
inotifywait -mrq -e modify,create,delete "$dir" | while read path action file; do
echo "检测到 $dir 中的变化,正在同步到 $BACKUP_DIR/$BASENAME"
# 使用 rsync 同步变化的目录
rsync -av --delete "$dir/" "$BACKUP_DIR/$BASENAME/"
echo "[$(date)] $dir 同步到 $BACKUP_DIR/$BASENAME 完成"
done &
done
赋予脚本执行权限
将脚本保存为 /usr/local/bin/rsync_inotify_sync.sh
,并赋予执行权限:
sudo chmod +x /usr/local/bin/rsync_inotify_sync.sh
3. 后台运行脚本
为了让监控和同步脚本长期运行,你可以将其放在后台执行。例如,使用 nohup
或 &
让脚本在后台运行:
nohup /usr/local/bin/rsync_inotify_sync.sh > /var/log/rsync_inotify_sync.log 2>&1 &
这里使用 nohup
确保脚本在你退出终端后仍然运行。日志将记录在 /var/log/rsync_inotify_sync.log
中。
4. 使用 systemd 实现自动启动
如果你希望系统启动时自动开始文件监控,可以创建一个 systemd 服务。
创建 systemd 服务文件
创建一个服务文件 /etc/systemd/system/rsync_inotify.service
:
[Unit]
Description=Rsync Inotify File Sync
After=network.target
[Service]
ExecStart=/usr/local/bin/rsync_inotify_sync.sh
Restart=always
[Install]
WantedBy=multi-user.target
启用并启动服务
执行以下命令以启用并启动该服务:
sudo systemctl daemon-reload
sudo systemctl enable rsync_inotify.service
sudo systemctl start rsync_inotify.service
5. 日志管理
脚本运行时会产生日志。你可以使用 logrotate
来管理日志文件,以防日志过大。创建 logrotate
配置文件 /etc/logrotate.d/rsync_inotify_sync
:
/var/log/rsync_inotify_sync.log {
weekly
rotate 4
compress
missingok
notifempty
create 640 root root
}
四、远端同步 服务器 A 和服务器 B 配置文档
服务器信息
服务器 | IP 地址 | 角色 | 安装的软件 |
---|---|---|---|
服务器 A | 192.168.234.11 | 源服务器:负责监控 /data/nfs_share 目录的变化,并通过 rsync 将变化同步到服务器 B |
nfs-utils , rsync , sersync |
服务器 B | 192.168.234.12 | 目标服务器:接收来自服务器 A 的文件同步,并存储在 /data/backup 目录中 |
nfs-utils , rsync |
服务器 A (192.168.234.11)
角色
- 源服务器:负责监控
/data/nfs_share
目录的变化,并通过rsync
将变化同步到服务器 B。
流程
-
安装必要的软件
nfs-utils
:用于设置 NFS 共享。rsync
:用于文件同步。sersync
:用于实时监控目录变化并触发rsync
同步。
-
设置系统参数
- 设置
inotify
参数以支持更多的文件系统事件监听。- 设置
inotify
参数:fs.inotify.max_user_watches=50000000
fs.inotify.max_queued_events=327679
- 设置
- 设置
-
配置 NFS 共享
- 创建共享目录
/data/nfs_share
。 - 编辑
/etc/exports
文件,允许服务器 B 访问共享目录。 - 启动 NFS 服务并导出共享目录。
- 创建共享目录
/data/nfs_share
并设置权限。 - 编辑
/etc/exports
文件,添加共享目录配置。 - 启动 NFS 服务并导出共享目录。
- 查看导出的目录。
- 创建共享目录
- 创建共享目录
-
配置
rsync
- 创建
rsync
密码文件/etc/rsync.password
。- 创建密码文件并设置权限。
- 创建
-
配置
sersync
- 解压
sersync
软件包并将其移动到/app/sersync2
。 - 编辑
sersync
配置文件/app/sersync2/confxml.xml
,配置监控目录和远程服务器信息。 - 启动
sersync
服务并设置开机自启动。- 编辑
sersync
配置文件。 - 启动
sersync
服务。 - 设置
sersync
开机自启动。
- 编辑
- 解压
安装的软件
nfs-utils
rsync
sersync
脚本A并执行
#!/bin/bash
# 设置系统参数
echo 50000000 > /proc/sys/fs/inotify/max_user_watches
echo 327679 > /proc/sys/fs/inotify/max_queued_events
# 永久设置系统参数
echo 'fs.inotify.max_user_watches=50000000' | sudo tee -a /etc/sysctl.conf
echo 'fs.inotify.max_queued_events=327679' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 解压 sersync 软件包并设置路径
cd /app
# 确保解压到正确的目录,并命名为 sersync2
tar -xzvf sersync2.5.4_64bit_binary_stable_final.tar.gz
# 检查解压后的文件夹
if [ -d "GNU-Linux-x86" ]; then
mv GNU-Linux-x86 sersync2
else
echo "sersync 解压失败,检查软件包路径或压缩文件。"
exit 1
fi
# 添加 sersync2 到 PATH
echo 'export PATH=$PATH:/app/sersync2' | sudo tee -a /etc/profile
source /etc/profile
# 安装和配置 NFS 服务
sudo yum install -y nfs-utils
# 创建共享目录
sudo mkdir -p /data/nfs_share
sudo chown -R nobody:nobody /data/nfs_share
sudo chmod -R 777 /data/nfs_share
# 编辑 NFS 配置文件
echo '/data/nfs_share 192.168.234.12(rw,sync,no_subtree_check)' | sudo tee -a /etc/exports
# 启动和配置 NFS 服务
sudo systemctl start rpcbind
sudo systemctl start nfs-server
sudo systemctl enable rpcbind
sudo systemctl enable nfs-server
# 导出共享目录
sudo exportfs -a
# 查看导出的目录
sudo showmount -e
# 安装 rsync
sudo yum install -y rsync
# 编辑 sersync 配置文件
sudo tee /app/sersync2/confxml.xml <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<head version="2.5">
<!-- 主机配置,监听本地的 8008 端口 -->
<host hostip="localhost" port="8008"></host>
<!-- 调试模式,关闭调试 -->
<debug start="false"/>
<!-- 文件系统配置,关闭对 XFS 文件系统的支持 -->
<fileSystem xfs="false"/>
<!-- 文件过滤规则,当前关闭文件过滤功能 -->
<filter start="false">
<exclude expression="(.*)\.svn"></exclude> <!-- 排除 .svn 目录 -->
<exclude expression="(.*)\.gz"></exclude> <!-- 排除 .gz 文件 -->
<exclude expression="^info/*"></exclude> <!-- 排除 info 目录下的文件 -->
<exclude expression="^static/*"></exclude> <!-- 排除 static 目录下的文件 -->
</filter>
<!-- inotify 事件监听配置,启用关键文件事件监听 -->
<inotify>
<delete start="true"/> <!-- 监听文件删除事件 -->
<createFolder start="true"/> <!-- 监听目录创建事件 -->
<createFile start="true"/> <!-- 监听文件创建事件 -->
<closeWrite start="true"/> <!-- 监听文件关闭写入事件 -->
<moveFrom start="true"/> <!-- 监听文件移动前事件 -->
<moveTo start="true"/> <!-- 监听文件移动后事件 -->
<attrib start="false"/> <!-- 关闭文件属性变更事件的监听 -->
<modify start="false"/> <!-- 关闭文件修改事件的监听 -->
</inotify>
<!-- sersync 配置 -->
<sersync>
<!-- 本地路径监听 -->
<localpath watch="/data/nfs_share">
<!-- 远程服务器配置,备份到远程服务器 -->
<remote ip="192.168.234.12" name="backup"/>
</localpath>
<!-- rsync 配置 -->
<rsync>
<commonParams params="-avz"/> <!-- rsync 常用参数,压缩并详细输出 -->
<auth start="true" users="rsync_user" passwordfile="/etc/rsync.password"/> <!-- 启用认证,使用密码文件 -->
<userDefinedPort start="false" port="874"/> <!-- 自定义端口,未启用 -->
<timeout start="false" time="100"/> <!-- 超时时间配置,未启用 -->
<ssh start="false"/> <!-- 不使用 SSH 进行同步 -->
</rsync>
<!-- 失败日志配置 -->
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/> <!-- 定期执行失败日志处理,每 60 秒执行一次 -->
<!-- 定时任务配置,当前未启用 -->
<crontab start="false" schedule="600">
<crontabfilter start="false">
<exclude expression="*.php"/> <!-- 排除 .php 文件 -->
<exclude expression="info/*"/> <!-- 排除 info 目录下的文件 -->
</crontabfilter>
</crontab>
<!-- 插件配置,当前未启用 -->
<plugin start="false" name="command"/>
</sersync>
</head>
EOF
# 创建密码文件
echo "123456" | sudo tee /etc/rsync.password
sudo chmod 600 /etc/rsync.password
# 启动 sersync 服务
if [ -f "/app/sersync2/sersync2" ]; then
/app/sersync2/sersync2 -r -d -o /app/sersync2/confxml.xml
else
echo "sersync2 程序文件不存在,请检查软件包解压路径。"
exit 1
fi
# 设置 sersync 开机自启动
sudo tee -a /etc/rc.local <<EOF
#!/bin/bash
/app/sersync2/sersync2 -r -d -o /app/sersync2/confxml.xml
EOF
sudo chmod +x /etc/rc.local
服务器 B (192.168.234.12)
角色
- 目标服务器:接收来自服务器 A 的文件同步,并存储在
/data/backup
目录中。
流程
-
安装必要的软件
nfs-utils
:用于挂载 NFS 共享。rsync
:用于接收文件同步。
-
挂载 NFS 共享
- 创建挂载点
/data/backup
。 - 编辑
/etc/fstab
文件,自动挂载 NFS 共享。 - 挂载 NFS 共享。
- 创建挂载点
-
配置
rsync
- 创建
rsync
密码文件/etc/rsync.password
。- 创建密码文件并设置权限。
- 创建
-
测试同步
- 手动运行
rsync
命令测试同步。 - 确认同步成功后,可以通过
sersync
自动同步。
- 手动运行
安装的软件
nfs-utils
rsync
脚本B并执行
#!/bin/bash
# 设置系统参数
echo 50000000 > /proc/sys/fs/inotify/max_user_watches
echo 327679 > /proc/sys/fs/inotify/max_queued_events
# 永久设置系统参数
echo 'fs.inotify.max_user_watches=50000000' | sudo tee -a /etc/sysctl.conf
echo 'fs.inotify.max_queued_events=327679' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 安装和配置 NFS 客户端
sudo yum install -y nfs-utils
# 创建挂载点
sudo mkdir -p /mnt/nfs_share
# 挂载 NFS 共享目录
sudo mount 192.168.234.11:/data/nfs_share /mnt/nfs_share
# 验证挂载是否成功
df -h
# 安装 rsync
sudo yum install -y rsync
# 编辑 rsync 配置文件
sudo tee /etc/rsyncd.conf <<EOF
uid = root
gid = root
use chroot = no
max connections = 4
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsync.log
[backup]
path = /data/backup
comment = backup data
read only = no
auth users = rsync_user
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.234.11
EOF
# 创建密码文件
echo "rsync:123456" | sudo tee /etc/rsyncd.secrets
sudo chmod 600 /etc/rsyncd.secrets
# 创建备份目录
sudo mkdir -p /data/backup
sudo chown -R nobody:nobody /data/backup
sudo chmod -R 777 /data/backup
# 创建 rsync 的 systemd 服务文件
sudo tee /etc/systemd/system/rsync.service <<EOF
[Unit]
Description=rsync daemon
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/rsync --daemon --config=/etc/rsyncd.conf
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启动并启用 rsync 服务
sudo systemctl start rsync
sudo systemctl enable rsync
# 设置 rsync 开机自启动
sudo tee -a /etc/rc.local <<EOF
#!/bin/bash
systemctl start rsync
EOF
sudo chmod +x /etc/rc.local
在服务器 B 上验证同步结果
# 检查 `/data/backup` 目录中的文件是否与服务器 A 的 `/data/nfs_share` 目录一致
ls -l /data/backup
总结
- 安装 rsync 和 inotify-tools:用
yum
安装。 - 编写脚本:用
inotifywait
监控文件变化,并用rsync
实时同步。 - 后台运行:使用
nohup
或systemd
将脚本作为后台服务运行。 - 日志管理:通过
logrotate
管理日志文件,避免日志过大。 - 远端同步:配置服务器 A 和服务器 B,实现文件的实时同步。
- 测试同步:手动触发同步并验证结果,确保配置正确。
这样,你就可以实现基于文件变化的实时同步了。每当 zhangsan
、lisi
或 wangwu
目录有文件更改时,会自动同步到备份目录。同时,服务器 A 和服务器 B 之间的文件也可以实现远端同步。