rsync远程同步
-
rsync(remote synchronize)是Liunx/Unix下的一个远程数据同步工具,可以在不改变原有数据属性信息的前提下实现数据的备份迁移特性。
-
它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。
-
rsync算法并不是每一次都整份传输,而是只传输两个文件的不同部分,因此其传输速度相当快。
-
rsync可拷贝、显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝,它能本地复制,远程复制,或者远程守护进程方式复制,它提供了大量的参数来控制其行为的各个方面,并且允许非常灵活的方式来实现文件的传输复制。
工作原理:
-
客户端构造FileList,FileList包含了需要与服务器同步的所有文件信息对name->id (id用来唯一表示文件例如MD5)
-
客户端将FileList发送到服务器。
-
服务器上rsync处理客户端发过来的FileList,构建新的NewFileList。 其中根据MD5值比较,删除服务器上已经存在的文件信息对,只保留服务器上不存在或变化的文件。
-
客户端得到服务器发送过来的NewFileList,然后把NewFileList中的文件重新传输到服务器。
rsync优点:
-
可以镜像保存整个目录树和文件系统。
-
可以很容易做到保持原来文件的权限、时间、软硬连接等。
-
无需特殊权限即可安装。
-
快速:第一次同步时rsync复制全部内容,但在下一次值传输修改过的内容
-
压缩传输:rysnc在传输的过程中可以实行压缩及解压缩操作,可以使用更少的带宽
-
安全:可以使用scp、ssh等方式来进行文件传输
-
支持匿名传输,以方便进行网站镜像
-
rsync不仅可以远程同步数据(类似于scp),而且可以本地同步数据(类似于cp),做差异同步
rsync同步方式:
-
全量备份:原有的数据全部传送,把原来的文件和新的文件一起统一传送,全量复制,效率低
-
增量备份:在传输数据之前通过一些算法通过你有的数据和我有的数据进行对比,把不一样的数据通过网络传输增量复制,效率高
rsync认证方式
1.ssh认证
rsync在ssh认证方式下,可通过系统用户进行认证。
在rsync上通过ssh隧道进行传输,类似于scp工具。
此时同步操作不在局限于rsync中定义的同步文件夹。
ssh认证方式,不需要服务器和客户端配置rsync配置文件。
只需要双方都安装rsync服务,并且也不需要双方启动rsync。
若rsync服务端SSH为标准端口,使用方式如下:
rsync -avz /root/test root@192.168.100.20:/root/
若rsync服务端SSH为非标准端口,可通过rsync的-e参数进行端口指定,使用方式如下:
rsync -avz /root/test -e 'ssh -p1234' root@192.168.100.20:/root/
2.rsync-daemon 认证
rsync在rsync-daemon认证方式下,默认监听TCP的873端口。
并且也只有在此种模式下,rsync才可以把密码写入到一个文件中。
rsync-daemon认证方式,需要服务器和客户端都安装rsync服务,并且只需要rsync服务器端启动rsync,同时配置rsync配置文件。
客户端启动不启动rsync服务,都不影响同步的正常进行。
rsync选项
选项 说明
-v 显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P 显示文件传输的进度信息。
-n --dry-run 仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive 归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive 递归到目录中去。
-t --times 保持mtime属性。
-o --owner 保持owner属性(属主)。
-g --group 保持group属性(属组)。
-p --perms 保持perms属性(权限,不包括特殊权限)。
-D 是"–device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links 如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z 传输时进行压缩提高效率。
-R --relative 使用相对路径。
–size-only 默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update 仅在源mtime比目标已存在文件的mtime新时才拷贝。
-d --dirs 以不递归的方式拷贝目录本身。
–max-size 限制rsync传输的最大文件大小。
–min-size 限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
–exclude 指定排除规则来排除不需要传输的文件。
–delete 以SRC为主,对DEST进行同步。多则删之,少则补之。
-b --backup 对目标上已存在的文件做一个备份,备份的文件名后默认使用"~“做后缀。
–backup-dir 指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e 指定所要使用的远程shell程序,默认为ssh。
–port 连接daemon时使用的端口号,默认为873端口。
–password-file daemon 模式时的密码文件,可以从中读取密码实现非交互式。
-W --whole-file rsync 将不再使用增量传输,而是全量传输。
–existing 要求只更新目标端已存在的文件,目标端还不存在的文件不传输。
–ignore-existing 要求只更新目标端不存在的文件。
–remove-source-files 要求删除源端已经成功传输的文件。
常用选项: 说明
-v –verbose 详细模式输出。
-a –archive 归档模式,表示以递归方式传输文件,并保持所有文件属性不变。
-z –compress 对备份的文件在传输时进行压缩处理。
–delete: 删除那些DST中存在而在SRC中没有的文件。
rsync本地复制实例
rsync -avz abc/ /opt/ :只会拷贝abc目录下面的文件,而不会拷贝abc这个目录
cd /opt
mkdir /abc
cd /abc/
touch 1.txt 2.txt
cd /
rsync -avz abc/ /opt/
cd /opt/
ls
rsync -avz /abc /opt/:会连着目录一起拷贝到/opt下
cd /opt/
rm -rf *
rsync -avz /abc /opt/
ls
rsync 同步源
在远程同步任务中,负责发起 rsync 同步操作的客户机称为客户端,而负责响应来自客户端的 rsync 同步操作的服务器称为备份源,也称之为同步源。
在下行同步(下载)中,同步源负责提供文档的原始位置,发起端应对该位置有读取权限
在上行同步(上传)中,同步源负责提供文档的目标位置,发起端应对该位置具有写入权限
主机 | 操作系统 | IP 地址 | 主要软件 |
---|---|---|---|
Master | CentOS7 | 192.168.100.20 | rsync |
Slave | CentOS7 | 192.168.100.10 | rsync / inotify-tools-3.14.tar.gz |
将 Master 服务器数据备份到 Slave 服务器
Master:192.168.100.20
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
cd /opt
source ./yum.sh
#关闭防火墙及安装机制
yum install -y httpd rsync
vim /etc/rsyncd.conf
uid = root #用户id,表示共享权限能执行的身份
gid = root #组id
use chroot = yes #开启,禁锢在源目录,表示允许在访问我备份的目录或文件的时候,使用的角色是root,同时你访问本地目录时拥有的也是root权限
address = 192.168.100.20 #监听地址
port 873 #默认端口号为873
log file = /var/log/rsyncd.log #日志文件存放位置
pid file = /var/run/rsyncd.pid #存放进程id的文件位置
hosts allow = 192.168.100.0/24 #允许访问的主机网段,有点类似于黑白名单
[wwwroot] #共享模块的名称,rsync默认调用该模块,默认我调用的路径是该模块指定的路径
path = /var/www/html #源目录路径
comment = Document Root of www.yxp.com
read only = yes #是否为只读
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z #同步时不再压缩的文件类型,因为同步时,-avz已经进行压缩
auth users = backuper #授权用户,使用wwwroot模块的用户是哪个用户,多个账户以空格隔开
secrets file = /etc/rsyncd_users.db #存放账号信息的数据文件,一行一个
vim /etc/rsyncd_users.db
backuper:123123 #编辑用户账号文件,固定格式为[名称:密码],一行一个
chmod 600 /etc/rsyncd_users.db #官方要求,最好只是赋权600!
rsync --daemon #开启服务
netstat -natp | grep rsync #检测端口号,确认服务是否成功开启
cd /var/www/html #切换至共享目录下
touch 1.html 2.html
ls
slave:192.168.100.10
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
cd /opt
source ./yum.sh
#关闭防火墙及安装机制
yum install -y rsync #安装rsync
mkdir /abc cd /abc/ #创建一个目录/abc,用来同步
rsync -avz backuper@192.168.100.20::wwwroot /abc
#使用rsync同步备份源的同步文件
ls
#查看同步是否成功
vim /etc/server.pass
123123 #编辑免交互密钥文件,第一行为密码
chmod 600 /etc/server.pass #给密钥文件赋权600
rsync -az --delete --password-file=/etc/server.pass backuper@192.168.100.20::wwwroot /abc
#rsync,使用密钥文件/etc/server/pass对应backuper用户,IP地址为192.168.100.20的共享模块文件进行压缩,并归档同步至当前服务器的/abc目录下,同时删除差异内容,如果原目标有的,会增加,原目标没有的,会删除。保持一致性。
ls /abc
#查看下行同步是否成功
配置Rsync+Inotify 实时同步
-
使用inotify通知接口,可以用来监控文件系统的各种变化情况,如文件存取、删除、移动、修改等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。
-
将inotify机制与rsync工具相结合,可以实现触发式备份(实时同步),即只要原始位置的文档发生变化,则立即启动增量备份操作;否则处于静默等待状态。
-
因为 inotify 通知机制由 Linux 内核提供,因此主要做本机监控,在触发式备份中应用时更适合上行同步
Master 关闭只读模式并为共享目录赋权
Master(192.168.100.20)
vim /etc/rsyncd.conf
read only = no #关闭只读模式,否则将不可写入
kill `cat /var/run/rsyncd.pid`
#修改完配置文件需要重启服务,这里采用直接杀掉进程号的方式
netstat -natp | grep rsync
rsync --daemon netstat -natp | grep rsync #再次开启服务并检查端口号确认
优化 Slave 内核参数
Slave(192.168.100.10)
cat /proc/sys/fs/inotify/max_queued_events #监控事件队列
cat /proc/sys/fs/inotify/max_user_instances #最多监控实例数
cat /proc/sys/fs/inotify/max_user_watches #每个实例最多监控文件数
vim /etc/sysctl.conf #加大每个参数
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
#当要监控的目录、文件数据量较多或者变化频繁时,建议加大参数值
sysctl -p #刷新
客户端(192.168.100.10):
编译安装 inotify-tools
yum install -y gcc gcc-c++ #安装gcc gcc-c++
cd /opt #切换至/opt上传inotify-tools安装包
tar zxf inotify-tools-3.14.tar.gz #解压
cd /opt/inotify-tools-3.14/
./configure
make -j 4 && make install #编译安装
客户端启动监听
inotifywait -mrq -e modify,create,delete /abc #持续监听对/abc的modify,create,move,delete操作
master编写触发同步脚本
vim /opt/inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /opt/abc/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /opt/abc/ backuper@192.168.59.111::wwwroot"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ] ;then
$RSYNC_CMD
fi
done
cd /opt/ chmod +x inotify.sh #给脚本赋权
chmod +x /etc/rc.d/rc.local
echo "/opt/inotify.sh" >> /etc/rc.d/rc.local #设置开机自启动
sh -x inotify.sh #执行脚本
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)