一、什么是rsync
rsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用于多个平台。从软件名称可以看出来是远程同步的意思(remote sync)。可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。
在同步备份时,默认情况下,rsync通过其独特的“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。
提示:传统的cp,scp工具拷贝每次均为完整拷贝,而rsync除了完整拷贝,还具备增量拷贝的功能,因此从此性能及效率上更胜一筹。
Rsync的特性如下:
1)支持拷贝特殊文件如链接,设备等
2)可以有排除指定文件或目录同步的功能,相当于打包命令tar
3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。
4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高
5)可以使用rcp,rsh,ssh等方式来配合传输文件,也可以通过直接的socker链接
6)支持匿名的或认证的进程模式传输,方便进行数据备份及镜像。
[1]核心算法介绍:
假定在名为α和β的两台计算机之间同步相似的文件 A 与 B ,其中α对文件 A 拥有访问权,β对文件 B 拥有访问权。并且假定主机α与β之间的网络带宽很小。那么 rsync 算法将通过下面的五个步骤来完成:
1. β将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。
2. β对每一个分割好的数据块执行两种校验:一种是 32 位的滚动弱校验,另一种是 128 位的 MD4 强校验。
3. β将这些校验结果发给α。
4. α通过搜索文件 A 的所有大小为 S 的数据块 ( 偏移量可以任选,不一定非要是 S 的倍数 ) ,来寻找与文件 B 的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。
5. α发给β一串指令来生成文件 A 在β上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。
-------------------------------------小结------------------------------------------------
rsync就是会同步我们指定的两端目录之间的数据,这个数据可以是特殊的数据。同步之前就先进行两端的数据的比对,只会同步两者之间不同的部分,并保留文件原本的属性。并且支持匿名的方式进行同步传输。所以rsync在备份,同步上就会较为快速。
-----------------------------------------------------------------------------------------
二、软件安装
1)编译安装
很简单那就直接解压
tar zxf rsync-3.1.0.tar.gz
cd rsync-3.1.0
./configure
make
make install
提示:服务器和客户端均要安装rsync
三、服务器端rsync部署
rsync的启动
1、 守护进程启动rsync
[root@www rsync-2.4.6]# /usr/local/bin/rsync --daemon
即可启动。rsync默认服务端口为873,服务器在该端口接收客户的匿名或者认证方式的请求。
2、开机启动
2.1)inetd.conf
编辑/etc/services,加入行rsync 873/tcp,指定rsync的服务端口是873。编加/etc/inetd.conf,加入rsync stream tcp nowait root /bin/rsync rsync --daemon
注:对于xinetd,设置方法类似。
2.2)加入rc.local
将启动命令加入rc.local中:/usr/local/bin/rsync --daemon
rsync的两种工作方式:
1) 传输本地文件
2)传输服服务端和客户端之间的数据
传输本地文件
具体的rsync命令参数后续会讲
[root@CT5_6-32-220-NFS01tmp]# rsync -avz /tmp/dir01/ /tmp/dir02/
building file list ... done
./
test01
sent 105 bytes received 48 bytes 306.00bytes/sec
total size is 0 speedup is 0.00
[root@CT5_6-32-220-NFS01 tmp]# tree
.
|-- dir01
| `--test01
|-- dir02
| `--test01
##可以看到已经成功的拷贝了。并且要注意/dir01/表示目录下的所有内容 /dir01表示的目录本身
次例子是拷贝目录下的内容所以要加上/dir01/如果是要将/dir01整个目录拷贝到/dir02下,那么就要写/dir01 --->注意后面没有/
[root@CT5_6-32-220-NFS01 tmp]# rsync -avz /tmp/dir01 /tmp/dir02/##这样拷贝的是目录本身
building file list ... done
dir01/
dir01/test01
sent 111 bytes received 48 bytes 318.00bytes/sec
total size is 0 speedup is 0.00
[root@CT5_6-32-220-NFS01 tmp]# tree
|-- dir01
| `--test01
|-- dir02
| |-- dir01
| | `-- test01
| `--test01