Rsync工作原理
一 Rsync
1)软件简介
Rsync 是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件。Rsync 本来是用以取代rcp 的一个工具,它当前由 Rsync.samba.org 维护。Rsync 使用所谓的“Rsync 演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。运行 Rsync server 的机器也叫 backup server,一个 Rsync server 可同时备份多个 client 的数据;也可以多个Rsync server 备份一个 client 的数据。
Rsync 可以搭配 rsh 或 ssh 甚至使用 daemon 模式。Rsync server 会打开一个873的服务通道(port),等待对方 Rsync 连接。连接时,Rsync server 会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。
Rsync 支持大多数的类 Unix 系统,无论是 Linux、Solaris 还是 BSD 上都经过了良好的测试。此外,它在windows 平台下也有相应的版本,比较知名的有 cwRsync 和 Sync2NAS。
Rsync 的基本特点如下:
可以镜像保存整个目录树和文件系统;
可以很容易做到保持原来文件的权限、时间、软硬链接等;
无须特殊权限即可安装;
优化的流程,文件传输效率高;
可以使用 rcp、ssh 等方式来传输文件,当然也可以通过直接的 socket 连接;
支持匿名传输。
2)核心算法
假定在名为 α 和 β 的两台计算机之间同步相似的文件 A 与 B,其中 α 对文件A拥有访问权,β 对文件 B 拥有访问权。并且假定主机 α 与 β 之间的网络带宽很小。那么 Rsync 算法将通过下面的五个步骤来完成:
β 将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。
β 对每一个分割好的数据块执行两种校验:一种是32位的滚动弱校验,另一种是128位的 MD4 强校验。
β 将这些校验结果发给 α。
α 通过搜索文件 A 的所有大小为 S 的数据块(偏移量可以任选,不一定非要是 S 的倍数),来寻找与文件B 的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。
α 发给 β 一串指令来生成文件 A 在 β 上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。
3) 文件级别的RSync(只传输变化的文件)工作过程:(我的理解)
* 机器A构造FileList,FileList包含了需要与机器B sync的所有文件信息对name->id,(id用来唯一表示文件例如MD5);
* 机器A将FileList发送到机器B;
* 机器B上运行的后台程序处理FileList,构建NewFileList,其中根据MD5的比较来删除机器B上已经存在的文件的信息对,只保留机器B上不存在或变化的文件;
* 机器A得到NewFileList,对NewFileList中的文件从新传输到机器B;
4)进一步的优化存储和传输
文件级别的Rsync + Rsync对单个文件分块比较和传输 : 实现了文件的高效传输。
如果Server上存储有所有文件的MD5码索引的数据库 + hardlink技术 : 实现Server的重复文件删除,单个文件只存储一份的技术。
如果server有单个文件只存储一份的技术,(有所有文件的MD5数据库),则在Rsync传输的过程中只传输Rsync Server没有的文件,如果Rsync Server由此文件直接使用。
二 安装配置
首先下载rsync安装文件
我用的是rsync-3.0.7.tar.gz
下载地址:http://rsync.samba.org/ftp/rsync/rsync-3.0.7.tar.gz
第一步解压:
tar -zvxf rsync-3.0.7.tar.gz
cd rsync-3.0.7
./configure --prefix=/usr/local/rsync
到这里出现了个小问题,就是G++/GCC都没有安装,那么我们作为系统架构师来讲,这个是小意思,依照
错误进行修复即可。
安装GCC/G++
rpm -ihv kernel-headers-2.6.18-164.el5.i386.rpm
rpm -ihv glibc-headers-2.5-42.i386.rpm
rpm -ihv glibc-devel-2.5-42.i386.rpm
rpm -ihv libgomp-4.4.0-6.el5.i386.rpm
rpm -ihv gcc-4.1.2-46.el5.i386.rpm
rpm -ivh gcc-c++-4.1.2-42.el5.i386.rpm
继续配置
./configure --prefix=/usr/local/rsync
make && make install
ln -s bin/rsync /usr/bin #做个快捷到bin目录,这样以后直接输入rsync就能执行
#加入xinetd.d,并设置权限为执行。
ln -s bin/rsync /etc/xinetd.d
chmod +x /etc/xinetd.d/rsync
启动rsync服务端
#rsync --daemon
添加配置文件,注意这个配置文件需要自己手动添加。
vim /etc/rsyncd.conf
以下为配置文件的参考:
uid = nobody
gid = nobody
use chroot = no #不使用chroot
max connections = 4 # 最大连接数为4
pid file = /var/run/rsyncd.pid #pid文件的存放位置
lock file = /var/run/rsync.lock #锁文件的存放位置
log file = /var/log/rsyncd.log #日志记录文件的存放位置
模块参数
[web_test] # 这里是认证的模块名,在client端需要指定
path = /home/web_test/ # 需要做镜像的目录,不可缺少!
comment = This is a test #这个模块的注释信息
ignore errors # 可以忽略一些无关的IO错误
read only = yes # 只读
list = no # 不允许列文件
auth users = test # 认证的用户名,如果没有这行,则表明是匿名,此用户与系统无关
secrets file = /etc/backserver.pas # 认证文件名
hosts allow = 1.1.1.1,2.2.2.2 #允许主机
hosts deny = 0.0.0.0/0 #禁止主机
transfer logging = yes
log format = "%a %f %l"
#log format = "%o %h [%a] %m (%u) %f %l"
以下是我的rsyncd.conf配置:
max connections = 2 #最大连接数
log file = /var/log/rsync.log #日志文件路径
timeout = 300 #超时时间
[backup]
comment = backup
path = /usr/local/rsync/backup #本模块实际路径
read only = no
list = yes
uid = root #文件夹的用户ID
gid = root #文件夹的组
auth users = test #授权用户
secrets file = /etc/rsyncd.secrets #密码文件
服务器端特殊设置:
echo "test:123456" > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.conf /etc/rsyncd.secrets
echo "all:192.168.203.113" > /etc/hosts.allow #让主机允许113服务器的所有请求服务。
客户端特殊设置:
echo "123456" > /etc/rsync.pas
chmod 600 /etc/rsync.pas
客户端传送测试:
rsync -auv --password-file=/etc/rsync.pas test@192.168.203.112::backup /data/test
意思是传送客户端的/data/test里的内容到服务端backup文件夹里
以下这个语句和上面的稍有差异,但是功能不同。
rsync -auv --password-file=/etc/rsync.pas /data/test test@192.168.203.112::backup(这样会把
整个test文件夹传送给服务端的backup里,注意不是test的内容,而是包含文件夹)
注意:关闭iptables,不然容易错误误导整个配置过程。
完!