Rsync实时同步工具
一、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