Rsync实时同步工具

发布时间 2023-08-16 11:28:02作者: ArMinLi

一、rsync是什么

rsync(remote synchronize)是Liunx/Unix下的一个远程数据同步工具。它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。

rsync算法并不是每一次都整份传输,而是只传输两个文件的不同部分,因此其传输速度相当快。

除此之外,rsync可拷贝、显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。

二、rsync的工作原理

客户端构造FileList,FileList包含了需要与服务器同步的所有文件信息对name->id(id用来唯一表示文件例如MD5)。

客户端将FileList发送到服务器。

服务器上rsync处理客户端发过来的FileList,构建新的NewFileList。其中根据MD5值比较,删除服务器上已经存在的文件信息对,只保留服务器上不存在或变化的文件。

客户端得到服务器发送过来的NewFileList,然后把NewFileList中的文件重新传输到服务器。

三、rsync优点

可以镜像保存整个目录树和文件系统。

可以很容易做到保持原来文件的权限、时间、软硬连接等。

无需特殊权限即可安装。

拥有优化的流程和比较高的文件传输效率。

可以使用shell(rsh、ssh)方式来传输文件。

支持匿名运行。

与scp相比,rsync传输速度绝对远远超过scp的传输速度。

在局域网中经常用rsync和scp传输大量mysql数据库文件,发现rsync传输文件速度至少要比scp快20倍以上。

所以如果需要在Liunx/Unix服务器之间互传海量数据时,建议选择rsync进行传输。

四、rsync两种认证方式

rsync有两种常用的认证方式,一种是rsync-daemon方式,另外一种是ssh方式。在平时使用过程,我们使用最多的是rsync-daemon方式。 注意:在使用rsync时,服务器和客户端都必须安装rsync程序。

4.1 rsync-daemon认证

rsync在rsync-daemon认证方式下,默认监听TCP的873端口。

rsync-daemon认证方式是rsync的主要认证方式,这个也是我们经常使用的认证方式。并且也只有在此种模式下,rsync才可以把密码写入到一个文件中。

注意:rsync-daemon认证方式,需要服务器和客户端都安装rsync服务,并且只需要rsync服务器端启动rsync,同时配置rsync配置文件。客户端启不启动rsync服务,都不影响同步的正常进行。

4.2 ssh认证

rsync在ssh认证方式下,可通过系统用户进行认证,即在rsync上通过ssh隧道进行传输,类似于scp工具。此时同步操作不在局限于rsync中定义的同步文件夹。

ssh认证方式,不需要服务器和客户端配置rsync配置文件,只需双方都安装rsync服务,并且也不需要双方启动rsync。

五、rsync 常用选项

若使用普通用户身份运行 rsync 命令,同步后的文件的属主将改变为这个普通用户身份。

若使用超级用户身份运行 rsync 命令,同步后的文件的属主将保持原来的用户身份。

选项 说明
-a, ––archive #归档模式,表示以递归方式传输文件,并保持所有文件属性,等价于 -rlptgoD (注意不包括 -H)
-v, ––verbose #详细输出模式
-z, ––compress #在传输文件时进行压缩处理
-r, ––recursive #对子目录以递归模式处理
-H, ––hard-links #保持硬链接文件
-p, ––perms #保持文件权限
-t, ––times #保持文件时间信息
-g, ––group #保持文件属组信息
-o, ––owner #保持文件属主信息 (super-user only)
-D #保持设备文件和特殊文件 (super-user only)
––exclude=PATTERN #指定排除一个不需要传输的文件匹配模式
––exclude-from=FILE #从 FILE 中读取排除规则
––include=PATTERN #指定需要传输的文件匹配模式
––include-from=FILE #从 FILE 中读取包含规则
––copy-unsafe-links #拷贝指向SRC路径目录树以外的链接文件
––safe-links #忽略指向SRC路径目录树以外的链接文件(默认)
––existing #仅仅更新那些已经存在于接收端的文件,而不备份那些新创建的文件
––ignore-existing #忽略那些已经存在于接收端的文件,仅备份那些新创建的文件
-b, ––backup #当有变化时,对目标目录中的旧版文件进行备份
––backup-dir=DIR #与 -b 结合使用,将备份的文件存到 DIR 目录中
––link-dest=DIR #当文件未改变时基于 DIR 创建硬链接文件
––delete #删除那些接收端还有而发送端已经不存在的文件,让目标目录和源目录数据保持一致
––delete-before #接收者在传输之前进行删除操作 (默认)
––delete-during #接收者在传输过程中进行删除操作
––delete-after #接收者在传输之后进行删除操作
––delete-excluded #在接收方同时删除被排除的文件
-e, ––rsh=COMMAND #指定替代 rsh 的 shell 程序
––ignore-errors #即使出现 I/O 错误也进行删除
––partial #保留那些因故没有完全传输的文件,以是加快随后的再次传输
––progress #在传输时显示传输过程
-P #等价于 ––partial ––progress
––delay-updates #将正在更新的文件先保存到一个临时目录(默认为 “.tmp”),待传输完毕再更新目标文件
-l, ––links #保持符号链接文件
-q, ––quiet #精简输出模式
-h, ––human-readable #输出文件大小使用易读的单位(如,K,M等)
-n, ––dry-run #仅测试哪些文件将被传输
––list-only #仅仅列出文件而不进行复制
––rsyncpath=PROGRAM #指定远程服务器上的 rsync 命令所在路径
––password-file=FILE #从 FILE 中读取口令,以避免在终端上输入口令,通常在 cron 中连接 rsync 服务器时使用
-4, ––ipv4 #使用 IPv4
-6, ––ipv6 #使用 IPv6
––version #打印版本信息
––help #显示帮助信息

六、rsync三种工作模式

rsync 是一个功能非常强大的工具,其命令也有很多功能选项。rsync 的命令格式为:

1)本地使用:
rsync [OPTION...] SRC... [DEST]

2)通过远程 Shell 使用:
拉: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
推: rsync [OPTION...] SRC... [USER@]HOST:DEST

3)访问 rsync 服务器:
拉: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
推: rsync [OPTION...] SRC... [USER@]HOST::DEST
拉: rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
推: rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

SRC: 是要复制的源位置

DEST: 是复制目标位置

若本地登录用户与远程主机上的用户一致,可以省略 USER@

使用远程 shell 同步时,主机名与资源之间使用单个冒号“:”作为分隔符

使用 rsync 服务器同步时,主机名与资源之间使用两个冒号“::”作为分隔符

当访问 rsync 服务器时也可以使用 rsync:// URL

'拉' 复制是指从远程主机复制文件到本地主机

'推' 复制是指从本地主机复制文件到远程主机

当进行“拉”复制时,若指定一个 SRC 且省略 DEST,则只列出资源而不进行复制

注意:无论是推送和拉取,rsync命令都是在客户端执行,只是命令的格式不同而已。

七、配置rsync

7.1 rsync服务端配置

sync服务器端需要两个配置文件:rsyncd.conf、rsyncd.password。

其中rsyncd.conf默认存放在/etc/目录下,同时它也是rsync服务器的主配置文件。该文件配置了rsync服务器的控制认证、访问、日志记录等等。而rsyncd.password主要用于存储rsync用户名和密码。

但是在rsync安装完毕后后是不会生成以上这两个配置文件的,需要我们手工进行创建。

rsyncd.conf配置文件内容如下:

[root@service ~]# vi /etc/rsyncd.conf
uid = nobody                                  #进行备份的用户,nobody 为任何用户
gid = nobody                                  #进行备份的组,nobody为任意组
user chroot = no                              #如果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以root权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true,但是这个一般不需要,我选择no或false
max connections = 200                         #最大连接数200
timeout = 600      #覆盖客户指定的IP超时时间,也就是说rsync服务器不会永远等待一个崩溃的客户端。
pid file = /var/run/rsyncd.pid                #pid文件的存放位置
lock file = /var/run/rsyncd.lock              #锁文件的存放位置
log file = /var/run/rsyncd.log                #日志文件的存放位置

[backup]                              #这里是认证模块名,即跟samba语法一样,是对外公布的名字
path = /backup/                               #这里是参与同步的目录
ignore errors                                 #可以忽略一些无关的IO错误
read only = no                                #默认允许可读可写
list = no                                     #不允许列清单
hosts allow = 192.168.2.0/255.255.255.0  #这里跟samba的语法是一样的,只允许192.168.1.0/24的网段进行同步,拒绝其它一切
auth users = test                             #认证的用户名
secrets file = /etc/rsyncd.password           #密码文件存放地址

#注意: 一个rsync配置文件中可以包含多个认证模块,同时一个密码文件中也可以存放多个用户和其对应的密码。其中每一个认证模块可以对应不同的客户端。

配置文件创建完毕后,我们来创建密码文件。如下:

[root@service ~]# echo "test:123123">>/etc/rsyncd.password
[root@service ~]# cat /etc/rsyncd.password 
test:123123
#注意:该密码文件中的用户和密码可以进行自定义,同时该用户不一定要在服务器中的系统用户存在。

#密码文件创建完毕后,要把其权限要设置为600,否则会在以后同步时提示验证出错。
[root@service ~]# chmod 600 /etc/rsyncd.password

以上两个文件创建完毕后,我们来创建其对应的目录并授权,如下:权限必须是777

[root@service ~]# mkdir /backup
[root@service ~]# chmod -R 777 /backup

启动Rsync服务

[root@service ~]# systemctl start rsyncd ; systemctl enable rsyncd
[root@service ~]# netstat -tunlp |grep 873
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      16099/rsync     
tcp6       0      0 :::873                  :::*                    LISTEN      16099/rsync

以上就是rsync服务端的配置。

7.2 rsync客户端配置

rsync客户端配置与服务器端相比差别还是比较大的。

在客户端安装完毕rsync服务后,是不需要启动rsync服务的。我们只需要在客户端创建连接rsync服务器时,验证码用户所需要的密码文件即可。

该密码文件中的密码要与rsync服务器上的密码文件中的密码对应,并且也要与rsync服务器rsyncd.conf配置文件中的认证模块中的用户匹配。

当然该密码文件不创建也是可以的,不创建的话。我们在执行rsync操作时,就需要输入rsync的对应用户的密码。如下:

[root@client ~]# echo "123123">>/etc/rsyncd.password
[root@client ~]# chmod 600 /etc/rsyncd.password
[root@client ~]# ll /etc/rsyncd.password
-rw------- 1 root root 7 5月  12 09:39 /etc/rsyncd.password
[root@client ~]# cat /etc/rsyncd.password
123123

#注意:该密码文件中只能存放一个用户的密码,并且该文件与rsync服务器端的密码文件一样也需要把其权限设置为600。

以上就是rsync客户端的配置。

八、rsync的启动与关闭

在前面我们讲过rsync-daemon认证方式,需要服务器和客户端都安装rsync服务,并且只需要rsync服务器端启动rsync,同时配置rsync配置文件,客户端启动不启动rsync服务。

rsync-daemon认证方式的启动,如果是源码方式安装的rsync,我们可以使用rsync –daemon来启动rsync。如下:

echo PATH=$PATH:/usr/local/bin/>>/etc/profile

source /etc/profile

rsync --daemon

ps aux |grep rsync

netstat -tunlp |grep 873
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      16099/rsync
tcp6       0      0 :::873                  :::*                    LISTEN      16099/rsync

#注意:上述命令中,只有rsync --daemon才是启动rsync的命令。并且该命令启动时,会默认加载/etc/rsyncd.conf文件。所以如果rsync的配置文件不在/etc目录下或者rsync配置文件名不为rsyncd.conf,那么我们在启动rsync服务时,就要手工加上该配置文件的完整路径。方法如下:rsync --daemon --config=/etc/rsyncd.conf

九、rsync同步示例

9.1 ssh认证用法

这种用法最好配置免登,不然每次都要输入密码

#全量,跟scp意思一致
rsync -avz anaconda-ks.cfg root@192.168.2.1:/root/        #推送
rsync -avz root@192.168.2.1:/root/anaconda-ks.cfg /root   #拉取
#增量示例1
rsync -avz --delete /opt/ root@192.168.1.1:/opt/      #让服务端与客户端保持一致性

图示:服务的1.1 客户端1.2

#增量示例2    【--exclude-from=:排除单个或多个文件】
#让服务端除了lemon.bak 和 lm.bak这两个文件;其他文件都与客户端保持一致
echo -e "lemon.bak\nlm.bak">>/root/file.txt
rsync -avz --delete --exclude-from=/root/file.txt /opt/ root@192.168.2.1:/opt/   #多个文件排除

图示:服务的1.1 客户端1.2

#增量示例3   【--exclude=:只能排除单个文件】
#让服务端除了lemon.bak这个文件;其他文件都与客户端保持一致
rsync -avz --delete --exclude=lemon.bak /opt/ root@192.168.2.1:/opt/      #单个文件排除

图示:服务的1.1 客户端1.2

9.2 daemon认证用法 (常用)

#从服务器上下载文件(拉取)
rsync -avz --password-file=/etc/rsyncd.password test@192.168.2.1::backup /home/

#从本地上传到服务器上去(推送)
rsync -avz --password-file=/etc/rsyncd.password /home test@192.168.2.1::backup

#上传并让客户端和服务端的数据文件保持一致性
rsync -avz --delete --password-file=/etc/rsyncd.password /home test@192.168.2.1::backup

#除了lemon.txt文件;其他的数据文件客户端和服务端都保持一致性【单个文件】
rsync -avz --delete --exclude=lemon.txt --password-file=/etc/rsyncd.password /home test@192.168.2.1::backup

#除了lemon.txt和lm.txt文件其他的数据文件客户端和服务端都保持一致性,【多个文件】
echo -e "lemon.txt\nlm.txt">>/file.txt
rsync -avz --delete --exclude=/file.txt --password-file=/etc/rsyncd.password /home test@192.168.2.1::backup

十、rsync + inotify实时同步

10.1 Inotify是什么?

Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统 中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样 的一个第三方软件。inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

10.2 案例实操

安装inotify:
tar xf inotify-tools-3.13.tar.gz -C /usr/src/ && cd /usr/src/inotify-tools-3.13/
./configure --prefix=/usr/local/inotify && make && make install
cd /usr/local/inotify/bin/ && ll
总用量 108
-rwxr-xr-x 1 root root 52552 5月  12 01:13 inotifywait
-rwxr-xr-x 1 root root 54648 5月  12 01:13 inotifywatch

#inotifywait选项:
    -m               #始终保持事件监听状态
    -q               #打印监控事件的信息 
    -r               #递归查询目录
    --excludei       #排除文件或目录时,不区分大小写。
    --timefmt        #指定时间输出的格式
    --format         #打印使用指定的输出类似格式字符串
    -e               #通过此参数可以指定需要监控的事件;
      Events:
     	     modify          #文件或目录内容被修改。
    	     create          #文件或目录被创建在当前目录
     	     attrib          #文件或目录属性被改变。
    	     move            #文件或目录被移动另一个目录或从另一个目录移动至当前目录。
    	     delete          #文件或目录被删除
    	     access          #文件或目录被读取。
     	     close           #文件或目录封闭,无论读/写模式。
    	     open            #文件或目录被打开。
    	     moved_to        #文件或目录被移动至另外一个目录。
             unmount         #文件系统被卸载


1、通过rsync协议加inotify实现实时同步
服务端:192.168.2.1
客户端:192.168.2.2


2、修改配置文件如下
vi /etc/sysctl.conf
fs.inotify.max_queued_events = 16384      #监控队列大小
fs.inotify.max_user_instances = 1024      #最多监控实例数
fs.inotify.max_user_watches = 1048576     #每个实例最多监控文件数
wq!保存退出

sysctl -p    #查看


3、在2.2上新建源地址
mkdir /backup
chown -R nobody:nobody /backup


4、创建一个排除的文件
echo -e "lemon.txt\nroot.txt">>/root/file.bak


5、在2.2上建一个脚本如下:
vi rsync_inotify.sh
#!/bin/bash
#注释:服务端除了lemon.txt和root.txt文件其他的都与客户端保持一致
#注意:这种ssh认证方式需要在客户端要先完成免登,如果不想做免登的话就是用daemon认证方式
inotifywait="/usr/local/inotify/bin/inotifywait -mrq -e modify,create,attrib,move,delete /backup/"
rsync="rsync -azH --delete --exclude-from=/root/file.bak /backup/ root@192.168.2.1:/opt/"
$inotifywait | while read files
do
  $rsync
done

6、配置免登
ssh-keygen -t rsa
ssh-copy-id root@192.168.2.1
ssh root@192.168.2.1
Last login: Tue May 12 09:24:06 2020 from 192.168.2.254
exit
登出
Connection to 192.168.2.1 closed.


7、在客户端将脚本放置后台运行,然后测试
setsid bash /root/rsync_inotify.sh
ps -aux|grep rsync_inotify.sh
root       7128  0.0  0.1 113132  1212 ?        Ss   09:54   0:00 bash /root/rsync_inotify.sh
root       7130  0.0  0.0 113132   388 ?        S    09:54   0:00 bash /root/rsync_inotify.sh
cd /backup 
touch {1..5}.txt 


8、去服务端查看是否同步过去
ls
1.txt  2.txt  3.txt  4.txt  5.txt  lemon.txt  root.txt


9、设置开机自动脚本运行
chmod -R 700 /etc/rc.d/rc.local
vi /etc/rc.local
setsid bash /root/rsync_inotify.sh