数据同步利器: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
2
3
4
5
6
7
# 将 /data/www/ 目录下的所有内容同步到 /backup/www/
# 注意:源目录末尾的斜杠 / 表示只同步该目录下的内容
rsync -avz --progress /data/www/ /backup/www/

# 将整个 /data/www/ 目录同步到 /backup/
# 目标路径会变为 /backup/www/
rsync -avz --progress /data/www /backup/

关键点:源目录末尾的斜杠 / 至关重要,它决定了是同步目录内的内容还是同步目录本身

模式二:远程同步 (通过 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
2
3
4
5
6
7
8
9
10
11
12
13
# /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 10

[log_backup]
path = /data/log_backup
comment = Log Backup Module
read only = false
list = yes
auth users = rsync_user
secrets file = /etc/rsyncd.secrets
  • 配置用户名和密码文件 /etc/rsyncd.secrets
1
2
# 格式:用户名:密码
rsync_user:your_secure_password
  • 启动rsync守护进程:
1
2
3
4
5
6
7
8
9
rsync --daemon 
# 或指定配置文件路径,默认就是以下路径
sudo rsync --daemon --config=/etc/rsyncd.conf
# 前台运行
sudo rsync --daemon --config=/etc/rsyncd.conf --no-detach

# 或由systemd管理启动
sudo systemctl start rsync
sudo systemctl enable rsync # 开机自动启动
  • 客户端同步命令

    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 上,并保留历史备份。

解决方案:

  1. 在 Web 服务器上创建备份脚本:

    • 创建 backup.sh 脚本文件,写入以下内容:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash

    # 定义源目录和目标目录
    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"
  2. 设置定时任务(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,其基本结构分为两个部分:

  1. 全局配置(Global Configuration):影响整个 rsync 服务的通用设置,必须放在文件开头。
  2. 模块配置(Module Configuration):定义具体的同步目录,每个模块用 [] 括起来,可以有自己的独立配置。

全局配置参数 (Global Parameters)

这些参数影响整个 rsync 守护进程的行为。

  • uid = nobodygid = nobody
    • 作用: 指定 rsync 守护进程运行的身份。出于安全考虑,强烈建议使用一个权限受限的非特权用户(如 nobodyrsync)。
    • 实例: uid = rsync_user
  • port = 873
    • 作用: 指定 rsync 服务监听的端口。默认就是 873。如果你想更改,客户端连接时也需要指定对应的端口号。
  • use chroot = yes
    • 作用: 限制 rsync 进程只能访问其模块定义的路径及其子路径,无法访问文件系统的其他部分。这是提高安全性的重要措施。如果 path 包含软链接,这个参数可能会导致问题,此时需设置为 no
  • 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
  • exclude = *.log *.tmp
    • 作用: 排除指定的文件或目录,多个规则用空格分隔。

rsyncd.conf 配置示例

下面是一个典型的生产环境配置,可以直接参考并修改:

TOML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# /etc/rsyncd.conf

# 全局配置
uid = rsync_user
gid = rsync_user
use chroot = yes
max connections = 5
log file = /var/log/rsync.log
pid file = /var/run/rsyncd.pid
motd file = /etc/rsyncd.motd

# 网站备份模块
[web_backup]
comment = Webserver Backup Directory
path = /data/backup/web/
read only = no
auth users = web_sync
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.1.0/24
hosts deny = *
exclude = .git/ .svn/ *.tmp

# 日志备份模块
[log_backup]
comment = Log Files Backup
path = /data/backup/logs/
read only = no
auth users = log_sync
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.2.0/24

对应的密码文件 /etc/rsyncd.secrets 内容:

1
2
3
# 文件权限必须是 600
web_sync:your_web_password
log_sync:your_log_password

权限设置:

1
chmod 600 /etc/rsyncd.secrets

客户端执行:

1
2
# 可以通过--password-file指定密码文件,就不用手动输入密码了,权限设置为600。一行只有密码,不像secrets文件包含用户名。
rsync -avz --password-file=./rsyncd.pass ./test rsync_user@192.168.31.159::my_bak
  • 命令形式:
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
2
3
4
5
6
7
8
9
10
#使用 ssh -L <local_port>:localhost:873 user@server
# 用 rsync --port=<local_port> 访问守护进程

ssh -L 8730:localhost:873 rsync_user@192.168.31.159
# 或 ssh -N -f -L 8730:localhost:873 rsync_user@192.168.31.159
# -N 不执行远程命令。这个选项只用于端口转发,它建立连接后不会打开一个远程 Shell。
# -f SSH 连接在后台运行。

rsync -avz --port=8730 ./test rsync_user@localhost::my_bak

  • rsync 守护进程仍工作,但数据通过 SSH 隧道加密

  • 如果是 局域网且对安全性要求不高,守护进程模式方便

  • 如果是 公网或敏感数据,一定要用 rsync over SSH