在开发中,经常会遇到想在两个机器之间进行同步内容,现在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