Rsync,全称 remote synchronize,是一款在 Linux/Unix 系统中广泛使用的远程数据同步工具。它能够通过局域网或广域网,在多台主机间高效地同步文件。其核心在于独特的“Rsync算法”,该算法在同步时仅传输两个文件之间的差异部分,而非每次传送完整文件,从而极大地提升了传输速度,尤其适合增量备份和镜像同步等场景。
一、Rsync 基础认识
1. 简介
Rsync 支持绝大多数类 Unix 系统,包括 Linux、Solaris 和 BSD。同时,在 Windows 平台也有相应的实现,例如 cwRsync 和 Sync2NAS。
2. 工作原理
Rsync 最初被设计用于替代 rcp 工具,目前由 rsync.samba.org 维护,因此其配置文件 rsyncd.conf 的格式与 Samba 主配置文件类似。
它支持两种主要的运行方式:
- 通过 RSH 或 SSH:利用现有远程 Shell 协议的安全性。
- 守护进程(Daemon)模式:Rsync 服务端独立监听 873 端口,等待客户端连接。连接时进行身份验证,验证通过后即可开始文件传输。首次同步会传输完整文件,后续则只进行增量传输。
3. 主要特点
- 支持镜像保存整个目录树和文件系统。
- 能够完美保持原文件的权限、时间、软硬链接等属性。
- 安装和使用通常不需要特殊权限。
- 传输流程经过优化,效率高。
- 支持通过 RSH、SSH 或直接 Socket 连接进行传输。
- 支持匿名传输,便于公开资源的分发。
二、SSH 模式实战
SSH 模式利用系统现有的 SSH 服务进行身份验证和数据加密,无需额外配置 Rsync 服务端,适合临时的或安全性要求较高的同步任务。
1. 本地目录同步
在主机 172.16.22.12 上进行操作:
# 创建测试目录和文件
mkdir src
touch src/{1,2,3,4}
mkdir dest
# 同步 src 目录内的所有文件到 dest 目录(不包含 src 目录本身)
rsync -av src/ dest/
# 同步 src 目录及其内部所有内容到 dest 目录
rsync -av src dest/
# 使用 -R 参数,即使 src 后有 /,效果同上,同步整个目录
rsync -avR src/ dest/
注意 src/ 与 src 的区别:尾部有斜线表示目录内的内容,无斜线表示目录本身。
2. 局域网间同步(使用 root 账户)
环境说明:本地主机 172.16.22.11,远程主机 172.16.22.12。
# 在 172.16.22.11 上操作
mkdir src
touch src/{a,b,c,d}
mkdir dest
# 将远程主机 /data/test/src/ 下的文件同步到本地 dest/ (需要输入远程 root 密码)
rsync -av 172.16.22.12:/data/test/src/ dest/
# 将本地 src/ 下的文件同步到远程主机
rsync -av src/ 172.16.22.12:/data/test/dest/
# 将整个本地 src 目录同步到远程主机
rsync -av src 172.16.22.12:/data/test/dest/
# 删除本地 src 目录下的一个文件,然后使用 --delete 参数同步
rm -rf src/d
# --delete 参数会使目标目录(远程)与源目录(本地)严格一致,删除目标端多余的文件
rsync -av --delete src/ 172.16.22.12:/data/test/dest/
3. 局域网指定用户同步
首先,在远程主机 172.16.22.12 上创建一个用于同步的普通用户。
# 在 172.16.22.12 上操作
useradd george
passwd george # 为用户设置密码
mkdir /home/george/test
touch /home/george/test/g{1,2,3,4}
然后,在本地主机 172.16.22.11 上,使用 -e 参数指定 SSH 登录用户。
# 将本地 src 目录同步到远程 george 用户的家目录
rsync -av src/ '-e ssh -l george' 172.16.22.12:/home/george
# 从远程 george 用户的家目录同步特定文件到本地 dest 目录
rsync -av 172.16.22.12:/home/george/test/g* '-e ssh -l george -p 22' dest/
三、Daemon 模式详解
Daemon 模式适合需要长期提供同步服务的场景,可以配置独立的认证和模块化路径。
1. 服务启动方式
在服务端 192.168.22.11 操作。
1.1 独立运行方式
适用于负荷较重的 Rsync 服务器。
# 安装必要软件
yum install rsync xinetd -y
# 直接以守护进程方式启动
/usr/bin/rsync --daemon
1.2 通过 xinetd 托管运行
适用于负荷较轻的场景,由超级守护进程管理。
# 安装软件
yum install rsync xinetd -y
# 编辑 Rsync 的 xinetd 配置文件
vim /etc/xinetd.d/rsync
将文件中的 disable = yes 改为 disable = no,然后启动服务。
# 启动 xinetd 服务
/etc/init.d/xinetd start
# 设置 Rsync 服务开机自启
chkconfig rsync on
# 检查 873 端口是否监听
netstat -ntpl | grep 873
2. 配置文件详解
无论是独立运行还是托管运行,都需要配置 /etc/rsyncd.conf 文件。
全局参数:对整个服务生效,也可作为模块参数的默认值。
address:独立运行时绑定的 IP 地址(xinetd 方式无效)。
port:监听端口,默认 873(xinetd 方式无效)。
pid file:指定存放进程 PID 的文件路径。
lock file:指定锁文件路径。
log file:指定日志文件路径,而非发送到 syslog。
timeout:连接超时时间,例如 timeout = 600。
模块参数:定义可供客户端同步的目录路径,格式为 [模块名]。
基本参数:
path:必须指定。服务器上用于同步的真实目录路径。
comment:模块描述信息。
模块控制参数:
use chroot:是否在传输前将进程锁定在 path 目录下。默认为 yes,更安全但要求 root 权限且无法同步外部软链接。
uid/gid:指定传输文件时使用的用户/组身份,默认为 nobody。
max connections:最大并发连接数,0 表示无限制。
read only:是否只读,默认为 true(客户端不可上传)。
write only:是否只写,默认为 false。
hosts allow/hosts deny:定义允许/拒绝访问的客户端 IP。
auth users:允许连接该模块的用户名列表(非系统用户)。
secrets file:存放 auth users 对应用户密码的文件路径,权限必须为 600。
list:客户端请求列表时是否显示此模块,默认为 true。
文件筛选参数:
exclude:排除的文件或目录模式(空格分隔)。
include:包含的文件或目录模式(即使被 exclude 规则匹配)。
3. 服务端配置实例
在 192.168.22.11 上编辑 /etc/rsyncd.conf:
vim /etc/rsyncd.conf
写入以下配置:
uid = root
gid = root
use chroot = no
max connections = 5
timeout = 600
pid file = /var/run/rsyncd.pid
lockfile = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
[web1]
path = /data/test/src
ignore errors = yes
read only = no
write only = no
hosts allow = 192.168.22.12
hosts deny = *
list = yes
auth users = web
secrets file = /etc/web.passwd
然后创建相关目录和密码文件:
mkdir -p /data/test/src/george
touch /data/test/src/{1,2,3}
# 密码文件格式为“用户名:密码”
echo "web:123" > /etc/web.passwd
chmod 600 /etc/web.passwd
# 重启 xinetd 使配置生效(若为独立运行模式则重启 rsync 服务)
service xinetd restart
四、客户端测试
1. 环境准备
在客户端 192.168.22.12 上安装 Rsync 并创建测试目录。
yum -y install rsync
mkdir /data/test
2. 常用命令参数测试
首先,我们了解常用参数:
-a:归档模式,相当于 -rlptgoD。
-r:递归。
-l:保留符号链接。
-p/-t/-g/-o:保留权限/修改时间/属组/属主。
-D:保留设备文件和特殊文件。
-z:传输时压缩。
-v:详细输出。
-P:显示进度信息,并保持部分传输的文件以供断点续传。
--delete:使目标目录与源目录严格一致,删除目标端多余文件。
--exclude:排除模式。
开始测试:
# 同步服务器 web1 模块数据到本地,会提示输入密码‘123’
rsync -avzP web@192.168.22.11::web1 /data/test/
# 保持客户端与服务器完全一致,使用 --delete
rsync -avzP --delete web@192.168.22.11::web1 /data/test/
# 上传本地文件到服务端
rsync -avzP --delete /data/test/ web@192.168.22.11::web1
# 上传文件到服务端的指定子目录
rsync -avzP --delete /data/test/ web@192.168.22.11::web1/george
# 仅列出服务端文件
rsync -ir web@192.168.22.11::web1
# 排除包含‘3’的文件或目录进行同步
rsync -avzP --exclude="*3*" web@192.168.22.11::web1 /data/test/
3. 使用密码文件免交互
为了避免手动输入密码,可以使用 --password-file 参数。
# 将密码(仅密码,不含用户名)写入文件
echo "123" > /tmp/rsync.password
chmod 600 /tmp/rsync.password
# 使用密码文件进行同步
rsync -avzP --delete --password-file=/tmp/rsync.password web@192.168.22.11::web1 /data/test/
4. 配置定时自动同步
通过 Crontab 配置定时任务,实现自动化备份或同步。
crontab -e
在末尾添加一行,例如每天凌晨0点10分执行同步:
10 0 * * * rsync -avzP --delete --password-file=/tmp/rsync.password web@192.168.22.11::web1 /data/test/
保存后可以列出当前定时任务确认:
crontab -l
定时同步有延迟,对于要求实时性高的场景,可以使用 inotify-tools 监控文件系统事件,然后触发 Rsync 同步。
inotify-tools 是 Linux 下 inotify 文件监控机制的接口工具集,包含两个主要工具:
inotifywait:阻塞进程,等待并输出文件系统发生的事件。
inotifywatch:收集文件系统的访问统计信息。
在源服务器 192.168.22.11 上下载并编译安装。
# 安装编译依赖
yum install -y gcc
# 创建安装目录
mkdir /usr/local/inotify
# 假设源码包已下载,解压并编译安装
tar -xf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify/
make && make install
3. 配置环境变量
# 编辑用户环境变量文件
vim /root/.bash_profile
# 在 PATH 中添加 inotify 的 bin 目录
export PATH=/usr/local/inotify/bin/:$PATH
# 使配置生效
source /root/.bash_profile
# 添加库文件路径并使其生效
echo '/usr/local/inotify/lib' >> /etc/ld.so.conf
ldconfig
# 创建头文件软链接(如需开发)
ln -s /usr/local/inotify/include /usr/include/inotify
4. Inotifywait 常用参数
-m:持续监控(默认事件触发后退出)。
-r:递归监控目录。
-q:静默模式,减少不必要输出。
-e:指定监听的事件类型,如 modify,create,move,delete,attrib。
5. 实时同步脚本示例
场景:将 192.168.22.11 (源) 的 /data/test/src/ 目录实时同步到 192.168.22.12 (目标) 的 /data/test/dest 目录。
前提:确保源服务器到目标服务器已配置 SSH 免密登录。
# 在目标机 192.168.22.12 上创建目标目录
mkdir -p /data/test/dest/
# 在源机 192.168.22.11 上创建源目录,并测试 rsync 命令
mkdir -p /data/test/src/
rsync -av --delete /data/test/src/ 192.168.22.12:/data/test/dest
在源机 192.168.22.11 上编写监控脚本 /data/test/sync.sh:
#!/bin/bash
/usr/local/inotify/bin/inotifywait -mrq -e modify,create,move,delete,attrib /data/test/src | while read events
do
rsync -av --delete /data/test/src/ 192.168.22.12:/data/test/dest
echo "`date +'%F %T'` 出现事件:$events" >> /tmp/rsync.log 2>&1
done
给脚本执行权限并后台运行:
chmod 755 /data/test/sync.sh
/data/test/sync.sh &
可以将其加入开机启动(注意方法因系统而异,以下为示例):
echo '/data/test/sync.sh &' >> /etc/rc.local
chmod +x /etc/rc.local
双向同步思路:若需要双向同步,在目标机上也部署一个类似的监控脚本,监控 /data/test/dest/ 目录,并反向同步到源机即可。这通常需要更严谨的冲突处理机制。
总结与思考
通过本文的梳理,我们从基础的 SSH 模式到企业级 Daemon 模式,再到结合 inotify-tools 实现实时同步,完整地掌握了 Rsync 这个强大的数据同步工具。它在系统运维和自动化脚本编写中扮演着重要角色。实际生产环境中,你可能需要根据网络状况、数据量、实时性要求来选择合适的模式和参数组合。例如,对于海量小文件,调整 --bwlimit(限速)和 -W(整文件传输)参数可能会带来意想不到的效果。持续探索和实践,是掌握任何运维工具的不二法门。如果在配置过程中遇到问题,欢迎在技术社区如云栈社区与同行交流探讨。
作者:一个小运维
来源:https://www.cnblogs.com/george-guo/p/7718515.html