linux 同步数据scp与rsync

在开发中,经常会遇到想在两个机器之间进行同步内容,现在linux中提供两个命令,基于ssh协议的scp和rsync、rsync可以通过remote shell也可以使用自身守护进程直接通过TCP。当使用TCP的时候,rsync在机器之间数据同步不用输入对端机器的密码;当你使用SSH协议作为底层协议,那么在同步数据的时候就必须输入密码才可以完成数据的同步。scp与rsync两个命令不仅仅是可以使用在机器之间同步数据,在一个机器内部也是可以进行数据的同步。但是对于scp来说,除了在机器之间和一个机器目录之间进行数据同步之外,还可以在两台不同机器之间进行数据同步。比如你在A机器,可以对B、C两台机器上的数据进行同步,但是rsync就不可以;也就是说当rsync进行跨机器同步数据的时候只可以在本机与另外一台机器之间进行数据的同步。

scp

scp命令就是拷贝,不过是在cp命令前多加了一个s,即security cp。从这可以看出它是一个安全的、加密过了的拷贝,因此它是可以使用在机器之间进行数据的拷贝。相对于scp命令,linux还提供了像rcp(remote cp)的数据拷贝命令,也是使用在机器之间的数据拷贝。因为scp命令参数比较少,比较容易掌握,在这里就不详细说明。

rsync

原理

rsync是为了在两个机器之间进行数据的同步,既然有了scp为何还要有这个协议那。该协议主要目的是在两台机器之间进行数据同步的时候,尽量少的传递数据。rsync可以聪明的在两台机器之间进行数据的同步,并通过合适的差分编码减少数据的传输。rsync的作用就是当要同步数据的对端已经存在部分要同步数据的情况下,通过使用rsync可以只传递对端没有的数据。假设一个文件100G,在文件末尾只加了一个句号。这时候要同步数据,如果使用scp那么要拷贝传输100G数据过去,而rsync只传输修改后的数据,也就是说只传递一个句号,整个任务就结束了。

rsync采用的是rolling check算法。当启动rsync数据同步的时候,对端会把数据做一个签名发送过来,然后接下来就进行数据的比对。

使用

对于rsync,需要你启动了rsync服务,而且你想同步的机器也需要启动了rsync服务。一般情况下机器都会主动启动的,一般都是以daemon的方式启动。另外,如果想使用TCP作为底层数据传输,启动方式也必须是daemon的方式。在启动rsync的时候,除了是否以后台守护进程的方式启动之外,还可以给--port参数,来决定监听哪个端口接受其他机器发出的同步请求。除了在启动的时候给出相应的参数,相应的其他配置都可以在/etc/rsyncd.conf配置文件中相应的修改。

下面就是一个配置文件的模版,需要了解的就是[data]红色标注的目录下面的配置。这个配置表示当有发起同步请求当这台机器的时候,当发送的是面向data的请求(这个下面会有说明)那么这个data对应的目录和允许的哪些IP发出同步请求,都在这下面进行配置。

motd file = /etc/rsyncd.motd
uid = uu
gid = users
 
use chroot = no
max connections = 300
timeout = 7200
address=10.168.9.30
transfer logging = yes
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
pid file = /var/run/rsyncd.pid 
lock file = /var/run/rsync.lock 
log file = /var/log/rsyncd.log
 
path = /data
comment = /data
ignore errors
read only = no
list = no
hosts allow = 127.0.0.1
 
[app]
path = /usr/local/app
comment = /usr/local/app
ignore errors
read only = no
list = no
hosts allow = 127.0.0.1

当所有工作都准备,现在就可以使用rsync进行数据的同步了。在之前介绍的时候,了解到rsync可以使用两种传输协议基于rsync守护进程的TCP和基于其他协议。下面两种不同的命令则是选择了两种不同的传输方式。

$>rsync a [email protected]:/data/tmp/    #ssh

$> rsync a [email protected]::data/tmp/  --port 8080 #TCP

可以看出,两个命令之间的区别是在IP和目录之间,对于TCP是多了一个冒号,而且少了一个斜线。在上面讲解配置文件的时候提到,当发起rsync请求,请求的是面向data的时候,则会根据data相关的配置进行处理和检查。这里的data就是在配置文件中配置的[data]。另外当你使用守护进程的时候因为是基于TCP的,所以需要连接对端rsync监听的接口。因为监听的端口可以在rsync启动的时候通过--port选项指定,所以并不是每台机器监听的端口都是8080。

当使用rsync的时候,可能会报出module is read only rsync。这个时候你就需要去查看一下rsyncd.conf下目录是否配置了read only =yes,如果十点话就需要把yes修改为no。

下面就对rsync常见用法进行说明

1:不同步那些数据到对端

rsync在参数可选项中提供了--exclude选项,当你不想机器上某些数据被同步,可以使用该选项。

在同步当前目录到对端,不同步以svn结尾的文件

$> rsync . [email protected]::data/tmp/  --port 8080 --exclude=".svn"

除了--exclude之外,还有--include选项。但是需要注意的是,在命令中参数出现的顺序会对最后的结果有不同的影响。最先出现的参数重要性会超过稍后出现的参数的重要性。

$> rsync . [email protected]::data/tmp/  --port 8080 --include="a.svn" --exclude=".svn"

上一条命令会把a.svn同步到另一台机器,就算exclude已经禁止了svn结尾的文件。因为--include出现的早,重要性高于exclude。

这两个参数都是可以使用正则表达式,而且也可以把不想同步的文件名放在单独的一个文件exclude.list。

$> rsync . [email protected]::data/tmp/  --port 8080 --include="a.svn" --exclude=exclude.list

2:删除操作同步

当需要删除对端的文件的时候,也可以使用rsync命令。

$> rsync . --delete [email protected]::data/tmp/  --port 8080

但是这个命令会不仅会把你当前目录下删除的文件在同步的对端删除掉之外,还会同时会做一次同步操作,即把对端不存在的而当前目录存在的文件同步到对端去。

转载:https://blog.csdn.net/zwan0518/article/details/45695939

猜你喜欢

转载自blog.csdn.net/mengzuchao/article/details/82011061