首页 > 其他分享 >Rsync实时同步工具

Rsync实时同步工具

时间:2023-08-16 11:35:39浏览次数:41  
标签:文件 Rsync 同步 -- rsync 实时 rsyncd root 客户端

一、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 [email protected]:/root/        #推送
rsync -avz [email protected]:/root/anaconda-ks.cfg /root   #拉取
#增量示例1
rsync -avz --delete /opt/ [email protected]:/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/ [email protected]:/opt/   #多个文件排除

图示:服务的1.1 客户端1.2

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

图示:服务的1.1 客户端1.2

9.2 daemon认证用法 (常用)

#从服务器上下载文件(拉取)
rsync -avz --password-file=/etc/rsyncd.password [email protected]::backup /home/

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

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

#除了lemon.txt文件;其他的数据文件客户端和服务端都保持一致性【单个文件】
rsync -avz --delete --exclude=lemon.txt --password-file=/etc/rsyncd.password /home [email protected]::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 [email protected]::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/ [email protected]:/opt/"
$inotifywait | while read files
do
  $rsync
done

6、配置免登
ssh-keygen -t rsa
ssh-copy-id [email protected]
ssh [email protected]
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

标签:文件,Rsync,同步,--,rsync,实时,rsyncd,root,客户端
From: https://www.cnblogs.com/ArMinLi/p/17633581.html

相关文章

  • JS实现播放音乐时歌词同步展示
    效果如下:实现过程:监听音频播放时间,使用歌词的出现时间与其比较,展示对应时间歌词内容,代码如下<audioid="audio-player"src="每个眼神都只身荒野.m4a"controls></audio><divclass="lyrics-container"><divid="lyrics"></div></div&g......
  • 并发与同步
    进程间的作用P、V操作不能实现共享PV操作不足不易读懂不利于修改和维护正确性难以保证可以用于线程tm的进程间的同步同步:一个进程在等待另一个进程给它发送消息一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定速度执行的过程称为进程间的同步 进......
  • 使用Logstash同步Mysql到Easysearch
    从Mysql同步数据到ES有多种方案,这次我们使用ELK技术栈中的Logstash来将数据从Mysql同步到Easysearch。方案前提Mysql表记录必须有主键,比如id字段。通过该字段,可将Easysearch索引数据与Mysql表数据形成一对一映射关系,支持修改。Mysql表记录必须有时间字段,......
  • 使用Logstash同步Mysql到Easysearch
    从Mysql同步数据到ES有多种方案,这次我们使用ELK技术栈中的Logstash来将数据从Mysql同步到Easysearch。方案前提Mysql表记录必须有主键,比如id字段。通过该字段,可将Easysearch索引数据与Mysql表数据形成一对一映射关系,支持修改。Mysql表记录必须有时间字段,以支持......
  • WAVE SUMMIT2023六大分会场同步开启,飞桨+文心大模型加速区域产业智能化!
    由深度学习技术及应用国家工程研究中心主办、百度飞桨和文心大模型承办的WAVESUMMIT深度学习开发者大会2023将于8月16日重磅来袭!届时上海、广州、深圳、成都、南昌和宁波六大分会场将同步开启!分会汇聚区域产业大咖、科研机构专家、知名学者和技术大牛,通过主题演讲和深度交流等形式......
  • Python 优雅的使用 subprocess.Popen 获取实时输出,以及中止 subprocess
    #-*-coding:utf-8-*-importshleximportosimportsignalimporttimeimportthreadingfromsubprocessimportPopen,PIPEdefrun_command(command):process=Popen(shlex.split(command),stdout=PIPE)st=time.time()whileTrue:ou......
  • 实时阴影技术
    实时阴影硬阴影对于点光源来说,它只会产生硬阴影。shadowmaping基本原理点光源的ShadowMap算法,分为两个PASSPASS0:从光源位置看向场景,并且计算出光源到能看到的最近的物体的深度图,并将深度存起来作为ShadowMap//shadowVertex.glsl//...voidmain(void){......
  • Vue3 中的v-model实现父子组件数据同步通信
    v-model在vue2中也就是双向绑定作用,但是在vue3中除了实现双向绑定外,还可以进行组件的通信父子组件的数据同步,接下来看看例子:<template><h1>{{num}}</h1><child-eventv-model="num"></child-event></template><scriptlang="ts"setup......
  • 伙伴云CEO戴志康:让数据和业务更好的互通展现,数字化与可视化同步进行
    近日,零代码平台伙伴云产品「页面」功能正式上线,在【小伙开麦】直播间,CEO戴志康和产品经理共同为在线观众展示「页面」的功能与使用技巧,让小伙伴们大呼过瘾!好玩、好用、好看的「页面」,到底有哪些亮点?让我们跟随戴总和产品经理的讲解,一起看看吧!01「页面」的诞生——化繁为简,超出想象......
  • Linux文件实时同步配置
    今天接到需求说要实现mysql与指定目录的文件实时双向热备,mysql的上篇已经解决,linux文件的在这篇展开讨论。Linux主机之间文件实时自动同步备份,使用rsync+inotify组合的方式来实现,避免由于硬件或者软件导致的Linux系统死机或损坏造成的损失。一、rsync+inotify简介......