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