找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1503

积分

0

好友

197

主题
发表于 昨天 04:49 | 查看: 4| 回复: 0

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. 主要特点

  1. 支持镜像保存整个目录树和文件系统。
  2. 能够完美保持原文件的权限、时间、软硬链接等属性。
  3. 安装和使用通常不需要特殊权限。
  4. 传输流程经过优化,效率高。
  5. 支持通过 RSH、SSH 或直接 Socket 连接进行传输。
  6. 支持匿名传输,便于公开资源的分发。

二、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

五、实现数据实时同步 (Rsync + Inotify-tools)

定时同步有延迟,对于要求实时性高的场景,可以使用 inotify-tools 监控文件系统事件,然后触发 Rsync 同步。

1. Inotify-tools 简介

inotify-tools 是 Linux 下 inotify 文件监控机制的接口工具集,包含两个主要工具:

  • inotifywait:阻塞进程,等待并输出文件系统发生的事件。
  • inotifywatch:收集文件系统的访问统计信息。

2. 安装 Inotify-tools

在源服务器 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




上一篇:归纳偏置在 Vision Transformer 设计中的应用与平衡之道
下一篇:OpenAI星际之门AI基建项目搁浅:一年过去数据中心仍未动工
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-25 09:11 , Processed in 1.603108 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表