Rsync(remote synchronize)是一个远程数据同步工具,可经过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不一样部分,而不是每次都整份传送,所以速度至关快。node
Rsync原本是用于替代rcp的一个工具,目前由rsync.samba.org维护,因此rsync.conf文件的格式相似于samba的主配 置文件。Rsync能够经过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时Rsync server会打开一个873端口,等待客户端去链接。链接时,Rsync server会检查口令是否相符,若经过口令查核,则能够开始进行文件传输。第一次连通完成时,会把整份文件传输一次,之后则就只需进行增量备份。算法
1.能够镜像保存整个目录树和文件系统;
2.能够很容易作到保持原来文件的权限、时间、软硬连接等;
3.无须特殊权限便可安装;
4.优化的流程,文件传输效率高;
5.可使用rsh、ssh等方式来传输文件,固然也能够经过直接的socket链接;
6.支持匿名传输。安全
一、Rsync同步算法
Rsync只因此同步文件的速度至关快,是由于“Rsync同步算法”能在很短的时间内计算出须要备份的数据,关于Rsync的同步算法描述以下:bash
假定在1号和2号两台计算机之间同步类似的文件A与B,其中1号对文件A拥有访问权,2号对文件B拥有访问权。而且假定主机1号与2号之间的网络带宽很小。那么rsync算法将经过下面的五个步骤来完成:服务器
一、2号将文件B分割成一组不重叠的固定大小为S字节的数据块,最后一块可能会比S 小。网络
二、2号对每个分割好的数据块执行两种校验:一种是32位的滚动弱校验,另外一种是128位的MD4强校验ssh
三、2号将这些校验结果发给1号。socket
四、1号经过搜索文件A的全部大小为S的数据块(偏移量能够任选,不必定非要是S的倍数),来寻找与文件B的某一块有着相同的弱校验码和强校验码的数据块。这项工做能够借助滚动校验的特性很快完成。ide
五、1号发给2号一串指令来生成文件A在2号上的备份。这里的每一条指令要么是对文件B经拥有某一个数据块而不须重传的证实,要么是一个数据块,这个数据块确定是没有与文件B的任何一个数据块匹配上的。函数
[root@cdh-namenode rsync-3.1.2]# ./configure --prefix=/usr/loca/rsync-3.1.2 [root@cdh-namenode rsync-3.1.2]# make [root@cdh-namenode rsync-3.1.2]# make install
[root@cdh-namenode rsync-3.1.2]# tree /usr/local/rsync-3.1.2/usr/local/rsync-3.1.2├── bin │ └── rsync ├── conf │ ├── rsyncd.conf │ ├── rsyncd.motd │ └── rsyncd.secrets -->这里权限须为600 └── share └── man ├── man1 │ └── rsync.1 └── man5 └── rsyncd.conf.56 directories, 6 files
rsyncd.conf:rsync以daemon模式运行时的配置文件名称
rsync服务器配置(Daemon模式) 说明: 1. rsync的配置文件为rsyncd.conf,可使用–config选项指定要使用的配置文件。默认状况下,并无提供该配置文件,须要手动建立。 2. 该配置文件由两部分组成,模块和参数。 3. 模块的格式:[Module] 4. 参数的格式:属性 = 值 5. 以#开头的表示注释。值的部分能够是yes、no、0、一、true或false。 全局参数 motd file:指定motd(message of the day)的位置。当客户端每一次链接时都会显示该文件中的内容,没有默认值。 pid file:指定rsync的pid文件存储位置。 lock file:指定lock文件的位置,确保不会达到最大链接数。默认为/var/run/rsyncd.lock log file:指定rsync的log文件存储位置。这个文件会在chroot函数被调用前打开 port:指定rsync监听的端口。默认为873 address:指定rsync监听的地址。address = 0.0.0.0表示监听在本机上的全部地址。 syslog facility:指定rsync将log发送到syslog时的log级别。 模块选项以下 comment:指定模块的描述信息 path:指定模块所映射的目录路径 max connections:模块所容许的最大链接数。若是是0则表示没有限制,若是是负值则表示关闭该模块。若是用于全局,则表示全部模块的最大链接数。 read only:是否容许客户端上传。yes表示不容许上传,no表示容许上传。默认为yes。若是设置为yes,则表示只能下载。 write only:是否容许客户端下载。yes表示不容许客户端下载,no容许客户端下载。默认为no。若是设置为yes,表示只能上传。 list:是否容许客户端列出该模块下的内容。yes容许,no不容许。 uid:username或user ID。指定该模块传输文件时(上传或下载),守护进程应该具备的UID权限,默认为nobody。当以root权限启动服务时,uid和gid则表示修改上传的文件的uid和gid。 gid:groupname或group ID。指定该模块传输文件时(上传或下载),守护进程应该具备的GID权限,默认为nobody。 exclude:指定多个文件或目录(相对路径)不被同步,并将其添加到 exclude 列表中.多个文件(目录)用空格分隔.做用等同于在客户端命令中使用–exclude来指定模式. include:该选项针对于exclude,即同步exclude中的哪一个文件(目录),并将其添加到include列表中,覆盖了exclude指定的文件或目录。多个文件(目录)用空格分隔.做用等同于在客户端命令中使用–include来指定模式. exclude from:和exclude的做用同样,只不过是exclude是将排除的文件或目录做为value的,而exclude from则是将排除的文件和目录写在文件中的,一行一个文件或目录。 include from:和include的做用同样,将包括的文件写在文件中。 incoming chmod:修改服务器收到的文件的权限。如:incoming chmod = D2775,F664。(D表示目录,F表示文件) outcoming chmod:修改服务器发送的文件的权限。 auth users与secrets file:这两个选项只能组合使用 auth users指定由空格或逗号分隔的用户名列表,只有这些用户才容许链接该模块,这里的用户和系统用户没有任何关系,用户名和口令以明文方式存放在 secrets file 参数指定的文件中,格式为username:password,经常使用的文件名为:/etc/rsyncd.secrets,password不能超过8个字符。 注意:secrets file文件的权限只能是启动rsyncd服务的用户具备rw权限,其余用户不能具备任何权限,即600. 示例: auth users = joe:deny @guest:deny admin:rw @rsync:ro susan joe sam 说明:用户joe以及在guest组中的任何用户将不能访问指定的模块。admin用户将具备rw的权限(会忽略read only和write only的设置),rsync组中的用户将具备ro的权限,以及susan、joe和sam将会获取read only和write only的设置的权限。 timeout:经过该选项能够覆盖客户指定的IP超时时间。经过该选项能够确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来讲,一个理想的数字是600。 strict modes:指定是否检测口令文件的权限.若为 yes 则口令文件只能被 rsync 服务器运行身份的用户访问,其余任何用户不能够访问该文件,默认为yes。也就是该文件的权限为600或400。 hosts allow:用一个主机列表指定哪些主机客户容许链接该模块.不匹配主机列表的主机将被拒绝.也就是说若是指定hosts allow那么不在hosts allow指定中的主机都将都拒绝. hosts deny:用一个主机列表指定哪些主机不能链接rsync模块.若是hosts allow和hosts deny同时指定一台主机,则以hosts allow为准.hosts allow和hosts deny的格式能够是x.x.x.x或x.x.x.x/n 或x.x.x.x/x.x.x.x或*的形式,也能够是主机名,要求可以被解析。 ignore errors :能够忽略一些无关的IO错误 use chroot:若为 true,则 rsync 在传输文件以前首先 chroot 到 path 参数所指定的目录下.这样作的缘由是实现额外的安全防御,可是缺点是须要 root 权限,而且不能备份指向 path 外部的符号链接所指向的目录文件。 transfer logging:该选项开启则记录下载和上传操做。若是不配置该选项,则即便配置了log format时,也不会生效。 log format经过该选项用户在使用transfer logging能够本身定制日志文件的字段. 其格式是一个包含格式定义符的字符串,但要注意log format使用要在transfer logging选项开启的时候才能够. 经常使用的以下: %o表示服务端提供什么操做,好比是接收send仍是发送recv %a表示客户端的IP地址. %m表示服务端的模块名称 %P表示服务端模块指定的路径. %t 当前时间 %u 认证的用户名(匿名时是null) %b 实际传输的字节数 %f表示同步的文件. %l表示同步文件的大小. 如:log format = [op]:%o [ip]:%a [module]:%m [path]:%P [file]:%f [size]:%l
我是按照本身的需求来编写rsyncd.conf文件的,首先我但愿只有特定的网段能够链接到个人rsync备份服务器进行备份,我两个业务系统的文件要分两个目录进行存储这样方便管理,客户端传送过来的文件中排除特定文件后缀的文件,上传到服务器的文件只有root用户才能进行编辑修改其配置文件以下:
[root@cdh-namenode conf]# cat rsyncd.conf # Minimal configuration file for rsync daemon # See rsync(1) and rsyncd.conf(5) man pages for help # This line is required by the /etc/init.d/rsyncd script # #################### GLOBAL OPTIONS ####################################################### # uid = root gid = root use chroot = no max connections = 200 # limit access to private LANs hosts allow = 192.168.100.0/255.255.255.0 hosts deny = * # The default is for all modules to be read only read only = no write only = no incoming chmod = Du=rwx,Dgo=rx,Fu=rwx,Fgo=rx pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock # This parameter determines whether or not the permissions on the secrets file will be checked. If “strict modes” # is true, then the secrets file must not be readable by any user ID other than the one that the rsync daemon is running under. strict modes = yes secrets file = /usr/local/rsync-3.1.2/conf/rsyncd.secrets motd file = /usr/local/rsync-3.1.2/conf/rsyncd.motd log file = /var/log/rsyncd.log transfer logging = yes log format = [time]:%t [op]:%o [ip]:%a [module]:%m [path]:%P [file]:%f [size]:%l syslog facility = local3 timeout = 300 ###################################### MODULE OPTIONS ############################################### [xn_backup] path = /home/fbackup/xn_backup list=yes ignore errors auth users = xn comment = xn_backup home exclude = upload/ log/ logs/ data/ temp/ tmp/ bak/ *.log *.out *.csv *.txt *.dat *.tar *.zip *.tar.gz *.CSV *.rpm *.tgz *.cap *.bin *.iso *.pcap *.gz *.csv.gz *.CSV.gz [ot_backup] path = /home/fbackup/ot_backup list=yes ignore errors auth users = ot comment = ot_backup home exclude = upload/ log/ logs/ data/ temp/ tmp/ bak/ *.log *.out *.csv *.txt *.dat *.tar *.zip *.tar.gz *.CSV *.rpm *.tgz *.cap *.bin *.iso *.pcap
rsyncd.motd文件
[root@cdh-namenode conf]# cat rsyncd.motd +++++++++++++++++++++++++++ + rsync backup + +++++++++++++++++++++++++++
rsyncd.secrets文件
[root@cdh-namenode conf]# ls -l rsyncd.secrets -rw-------. 1 root root 26 7月 19 11:55 rsyncd.secrets [root@cdh-namenode conf]# cat rsyncd.secrets xn:redhat123 ot:redhat123
所有配置好了后,就能够启动rsync daemon服务了
[root@cdh-namenode conf]# /usr/local/rsync-3.1.2/bin/rsync --daemon --config=/usr/local/rsync-3.1.2/conf/rsyncd.conf [root@cdh-namenode conf]# ps -ef|grep rsync root 115113 1 0 12:10 ? 00:00:00 /usr/local/rsync-3.1.2/bin/rsync --daemon --config=/usr/local/rsync-3.1.2/conf/rsyncd.conf root 123185 97353 0 12:55 pts/1 00:00:00 grep rsync [root@cdh-namenode conf]#
备份cdh-datanode1(192.168.100.101)上的/home目录下的全部内容到rsync服务器(192.168.100.100)上
首先登陆到cdh-datandoe1上,切换到root用户下在/etc/目录下新建rsync.passwd文件,里面填写认证密码,认证密码先须要在服务端rsyncd.secrets上配置好,其文件权限须要设置为600.
[root@cdh-datanode1 home]# ls -l /etc/rsync.passwd -rw-------. 1 root root 10 7月 19 12:00 /etc/rsync.passwd [root@cdh-datanode1 home]# cat /etc/rsync.passwd redhat123 [root@cdh-datanode1 home]#
经常使用需求:备份应用数据到统一备份服务器
[root@cdh-datanode1 home]# /usr/bin/rsync -azvP --password-file="/etc/rsync.passwd" /home/ xn@192.168.100.100::xn_backup/cdh-datanode1 +++++++++++++++++++++++++++ + rsync backup + +++++++++++++++++++++++++++ sending incremental file list created directory cdh-datanode1 ./ kl/ kl/.bash_logout 100% 0.00kB/s 0:00:00 (xfer#1, to-check=73/76) kl/.bash_profile 100% 171.88kB/s 0:00:00 (xfer#2, to-check=72/76) kl/.bashrc 100% 121.09kB/s 0:00:00 (xfer#3, to-check=71/76) kl/.gnome2/ kl/ss/ kl/ss/auditd 100% 3.41MB/s 0:00:00 (xfer#4, to-check=68/76) kl/ss/blk-availability 100% 1.28MB/s 0:00:00 (xfer#5, to-check=67/76) kl/ss/crond 100% 1.35MB/s 0:00:00 (xfer#6, to-check=66/76) kl/ss/functions 100% 3.46MB/s 0:00:00 (xfer#7, to-check=65/76) kl/ss/halt
经常使用需求:某个应用服务器上的文件被误删了,如今须要恢复这个文件
客户端模拟重要文件被误删
[root@cdh-datanode1 kl]# cd ss/ [root@cdh-datanode1 ss]# ls auditd functions iptables killall mdmonitor netfs nfs-rdma postfix restorecond rsyslog saslauth blk-availability halt jexec lvm2-lvmetad messagebus network ntpd rdisc rhnsd salt-minion single crond ip6tables kdump lvm2-monitor netconsole newss ntpdate rdma rhsmcertd sandbox ss [root@cdh-datanode1 ss]# rm functions rm:是否删除普通文件 "functions"?y [root@cdh-datanode1 ss]# ls auditd ip6tables killall messagebus newss postfix rhnsd sandbox sshd blk-availability iptables lvm2-lvmetad netconsole nfs-rdma rdisc rhsmcertd saslauthd udev-post crond jexec lvm2-monitor netfs ntpd rdma rsyslog single halt kdump mdmonitor network ntpdate restorecond salt-minion ss [root@cdh-datanode1 ss]# pwd /home/kl/ss [root@cdh-datanode1 ss]#
到备份服务器端查看备份的文件,查询到后,直接在客户端利用rsync进行备份还原
[root@cdh-namenode ss]# pwd /home/fbackup/xn_backup/cdh-datanode1/kl/ss [root@cdh-namenode ss]# ls auditd functions iptables killall mdmonitor netfs nfs-rdma postfix restorecond rsyslog saslauthd sshd blk-availability halt jexec lvm2-lvmetad messagebus network ntpd rdisc rhnsd salt-minion single udev-post crond ip6tables kdump lvm2-monitor netconsole newss ntpdate rdma rhsmcertd sandbox ss [root@cdh-namenode ss]#
在客户端利用rsync进行备份还原,这里有一点要很是注意的就是源路径地址最后的/,加/表示同步数据的时候不包含ss目录只同步ss目录下面的文件,不加/表示包含ss目录
[root@cdh-datanode1 ss]# /usr/bin/rsync -azvP --password-file="/etc/rsync.passwd" xn@192.168.100.100::xn_backup/cdh-datanode1/kl/ss/ /home/kl/ss/ +++++++++++++++++++++++++++ + rsync backup + +++++++++++++++++++++++++++ receiving incremental file list ./ functions 100% 24.24MB/s 0:00:00 (xfer#1, to-check=65/70) sent 64 bytes received 8777 bytes 17682.00 bytes/sec total size is 332288 speedup is 37.58 [root@cdh-datanode1 ss]# ls auditd halt kdump mdmonitor network ntpdate restorecond salt-minion ss blk-availability ip6tables killall messagebus newss postfix rhnsd sandbox sshd crond iptables lvm2-lvmetad netconsole nfs-rdma rdisc rhsmcertd saslauthd udev-post functions jexec lvm2-monitor netfs ntpd rdma rsyslog single [root@cdh-datanode1 ss]#