rsync
数据同步利器:rsync
1. rsync 是什么?
rsync(remote synchronize)是一款在 Linux 系统中用于文件和目录同步的强大工具。它最大的特点是采用**“增量同步”**技术,只传输源文件与目标文件之间有差异的部分,极大地提高了同步效率,尤其在处理大型文件或通过网络传输时,优势非常明显。
2. rsync 命令基本格式
1 | rsync [OPTIONS] SOURCE DESTINATION |
- SOURCE:源文件或目录。
- DESTINATION:目标文件或目录。
3. 核心参数详解 (必备)
以下是运维工作中最高频使用的参数,掌握它们就等于掌握了 rsync 的精髓。
- **
-a(archive)**:归档模式。这是一个组合参数,等同于-rlptgoD,它能以递归方式同步目录,并完整保留文件的所有属性,包括:- **
-r**:递归同步子目录。 - **
-l**:同步软链接。 - **
-p**:保留文件权限。 - **
-t**:保留文件时间戳。 - **
-g**:保留文件属组。 - **
-o**:保留文件属主。 -D(devices): 同步设备文件(慎用)
- **
- **
-v(verbose)**:详细模式。显示同步过程中的文件列表和进度。 - **
-z(compress)**:传输时压缩文件,可有效节省网络带宽。 - **
--progress**:显示详细的传输进度,对于大文件非常有用。 --delete:删除目标目录中,源目录没有的文件。这是一个高风险但很重要的参数,使用前务必三思。- **
--exclude=PATTERN**:排除指定的文件或目录,PATTERN可以是通配符。 --dry-run或-n:空运行模式。它会模拟同步过程,但不会执行任何实际操作。强烈建议在执行--delete等危险操作前,先用此参数进行测试。
4. 三种工作模式与实例
理解 rsync 的三种工作模式,是熟练使用的关键。
模式一:本地同步
在同一台服务器的不同目录之间同步文件。
1 | # 将 /data/www/ 目录下的所有内容同步到 /backup/www/ |
关键点:源目录末尾的斜杠 / 至关重要,它决定了是同步目录内的内容还是同步目录本身。
模式二:远程同步 (通过 SSH)
这是最常见的运维场景,通过 SSH 协议在远程主机之间同步。
- 本地到远程:
1
rsync -avz --progress /data/website/ root@192.168.1.100:/backup/
- 远程到本地:
1
rsync -avz --progress root@192.168.1.100:/data/logs/ /local/backups/
模式三:守护进程模式 (Daemon)
当需要频繁、大规模同步时,可以使用 rsync 守护进程。它会监听特定端口,提供服务。
- 配置:在服务器上创建
/etc/rsyncd.conf并启动rsync --daemon。
1 | # /etc/rsyncd.conf |
- 配置用户名和密码文件
/etc/rsyncd.secrets:
1 | # 格式:用户名:密码 |
- 启动rsync守护进程:
1 | rsync --daemon |
客户端同步命令:
1
2
3
4
5
6# 使用 :: 访问 rsync 守护进程
rsync -avz /data/logs/ rsync_user@192.168.1.100::log_backup
# 使用密码文件进行认证,-a 参数保证完整性,--delete 保持一致
# rsync_user 是用户名,rsync_pass_file 指定密码文件路径
rsync -avz --delete --progress --password-file=/etc/rsync_client.pass /var/log/ rsync_user@192.168.1.200::log_backup
5. 进阶参数与高级技巧
- **
--bwlimit=KBPS**:限制同步带宽。在业务高峰期,可以防止 rsync 占用过多网络资源。例如--bwlimit=1024将带宽限制在 1MB/s。 --partial或 **-P**:启用断点续传功能。对于大文件同步,如果传输中断,下次可以从中断处继续,而不是从头开始。- **
--exclude-from=FILE**:从文件中读取排除列表,用于处理复杂的排除规则。 - **
--append**:追加模式。当同步日志文件等只追加内容的文件时,此模式效率更高,它只追加差异部分,不进行块校验。 - 结合
cron实现定时备份:将 rsync 命令写入 shell 脚本,然后通过crontab -e设置定时任务,实现自动化备份。
6. 运维最佳实践
- 先测试,再执行:在执行任何可能导致数据丢失的命令(如
--delete)时,务必先用--dry-run参数进行模拟,确认无误后再执行。 - 注意末尾斜杠:源目录
/的有无,会直接影响同步结果。 - 使用
-a参数:几乎所有的备份和同步任务都应该使用-a参数,以确保文件的所有属性都被完整保留。
场景: 你负责维护一台 Web 服务器,需要每天凌晨 2 点将 /var/www/html 目录下的所有网站文件(不包括缓存文件 .cache)完整备份到另一台备份服务器 192.168.1.200 上,并保留历史备份。
解决方案:
在 Web 服务器上创建备份脚本:
- 创建
backup.sh脚本文件,写入以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
# 定义源目录和目标目录
SOURCE_DIR="/var/www/html/"
DEST_DIR="root@192.168.1.200:/data/website_backups/$(date +%Y-%m-%d)/"
# 使用 rsync 进行同步,排除 .cache 目录,并保留所有权限和时间戳
# --exclude='.cache' 是关键,可以排除你不想同步的文件或目录
# --delete-excluded 选项可以删除目标端被排除的目录中的文件
rsync -avz --progress --exclude='.cache' --delete-excluded $SOURCE_DIR $DEST_DIR
# 打印备份完成信息
echo "Website backup completed to $DEST_DIR"- 创建
设置定时任务(crontab):
crontab -e打开定时任务编辑界面。添加一行,让脚本每天凌晨 2 点执行:
1 | 0 2 * * * /bin/bash /path/to/your/backup.sh > /var/log/website_backup.log 2>&1 |
在每天的 2:00 执行 /path/to/your/backup.sh 脚本,并将所有输出重定向到 /var/log/website_backup.log 文件中,方便你后期排查问题。rsync 与 Linux 的其他工具(如 crontab)结合,实现自动化运维。
你好,很高兴你对 rsync 守护进程的配置有了更深入的兴趣。rsyncd.conf 文件是配置 rsync 服务端行为的核心,理解它的每一个部分对于构建安全、高效的数据同步系统至关重要。
我将为你详细介绍 rsyncd.conf 文件的结构、关键参数及其作用,并提供一个完整的配置示例。
rsync daemon配置
rsyncd.conf 文件是 rsync 守护进程的配置文件,它定义了 rsync 服务器可以提供哪些目录(模块)供客户端同步,以及对这些模块的访问权限和行为。
该文件通常位于 /etc/rsyncd.conf,其基本结构分为两个部分:
- 全局配置(Global Configuration):影响整个 rsync 服务的通用设置,必须放在文件开头。
- 模块配置(Module Configuration):定义具体的同步目录,每个模块用
[]括起来,可以有自己的独立配置。
全局配置参数 (Global Parameters)
这些参数影响整个 rsync 守护进程的行为。
uid = nobody和gid = nobody:- 作用: 指定 rsync 守护进程运行的身份。出于安全考虑,强烈建议使用一个权限受限的非特权用户(如
nobody或rsync)。 - 实例:
uid = rsync_user
- 作用: 指定 rsync 守护进程运行的身份。出于安全考虑,强烈建议使用一个权限受限的非特权用户(如
port = 873:- 作用: 指定 rsync 服务监听的端口。默认就是
873。如果你想更改,客户端连接时也需要指定对应的端口号。
- 作用: 指定 rsync 服务监听的端口。默认就是
use chroot = yes:- 作用: 限制 rsync 进程只能访问其模块定义的路径及其子路径,无法访问文件系统的其他部分。这是提高安全性的重要措施。如果
path包含软链接,这个参数可能会导致问题,此时需设置为no。
- 作用: 限制 rsync 进程只能访问其模块定义的路径及其子路径,无法访问文件系统的其他部分。这是提高安全性的重要措施。如果
max connections = 10:- 作用: 限制同时连接到服务器的客户端数量,防止服务器因连接过多而崩溃。
log file = /var/log/rsync.log:- 作用: 指定 rsync 服务的日志文件路径。这对问题排查非常重要。
pid file = /var/run/rsyncd.pid:- 作用: 指定进程 ID (PID) 文件的路径,用于管理 rsync 守护进程(如启动、停止)。
模块配置参数 (Module Parameters)
每个模块都用一个 [] 括起来,模块名可以自定义。
path = /path/to/sync/directory:- 作用: 这是每个模块必须的参数。指定该模块在服务器上对应的实际文件系统路径。
- 实例:
path = /data/wwwroot/
comment = This is a website backup module:- 作用: 模块的描述信息,方便自己识别。当客户端列表服务时会显示该信息。
read only = yes:- 作用:
yes表示客户端只能从服务器下载文件,不能上传。no则允许上传。 - 实例:
read only = no
- 作用:
list = yes:- 作用:
yes表示当客户端连接时,允许列出所有可用的模块。如果设置为no,客户端必须知道模块名才能连接。
- 作用:
auth users = user1, user2:- 作用: 指定允许连接到该模块的用户名,多个用户用逗号分隔。
secrets file = /etc/rsync.secrets:- 作用: 指定存储用户名和密码的文件路径。该文件的格式是
username:password,且权限必须设为 600 (chmod 600),以防密码泄露。
- 作用: 指定存储用户名和密码的文件路径。该文件的格式是
hosts allow = 192.168.1.0/24 10.0.0.1:- 作用: 基于 IP 地址进行访问控制。只允许列表中指定的 IP 地址或网段连接。
hosts deny = 192.168.1.100:- 作用: 拒绝列表中指定的 IP 地址连接。
hosts allow的优先级高于hosts deny。
- 作用: 拒绝列表中指定的 IP 地址连接。
exclude = *.log *.tmp:- 作用: 排除指定的文件或目录,多个规则用空格分隔。
rsyncd.conf 配置示例
下面是一个典型的生产环境配置,可以直接参考并修改:
1 | # /etc/rsyncd.conf |
对应的密码文件 /etc/rsyncd.secrets 内容:
1 | # 文件权限必须是 600 |
权限设置:
1 | chmod 600 /etc/rsyncd.secrets |
客户端执行:
1 | # 可以通过--password-file指定密码文件,就不用手动输入密码了,权限设置为600。一行只有密码,不像secrets文件包含用户名。 |
- 命令形式:
1 | rsync -avz --password-file=./rsyncd.pass ./test rsync_user@192.168.31.159::my_bak |
如何加密传输
::my_bak双冒号表示 rsync 守护进程模式客户端直接连接 rsync 守护进程 TCP 端口(默认 873),数据和密码都是明文传输
仅凭
--password-file自动发送密码,不会加密密码和文件内容在网络上是明文的
局域网内部使用风险低
公网或不可信网络传输有被抓包风险
方法 A:rsync over SSH(推荐)
- 使用 SSH 隧道加密传输:
1 | rsync -avz -e ssh ./test rsync_user@192.168.31.159:/data/back/my_bak |
特点:
- SSH 自动加密(数据+密码)
- 可以使用 SSH key 免密码登录
- 不需要守护进程模式,不用
::module
方法 B:SSH 隧道连接 rsync 守护进程
- 可以在本地建立 SSH 隧道到 rsync 守护进程端口:
使用 SSH 本地端口转发(Local Port Forwarding)
1 | #使用 ssh -L <local_port>:localhost:873 user@server |
rsync 守护进程仍工作,但数据通过 SSH 隧道加密
如果是 局域网且对安全性要求不高,守护进程模式方便
如果是 公网或敏感数据,一定要用 rsync over SSH
