rsync是一个开源的快速备份工具,能够在不一样主机之间镜像同步整个目录树,支持增量备份,保持连接和权限,且采用优化的同步算法,传输前执行压缩,所以很是适合于异地备份,镜像服务器等应用。
php
rsync的官方为http://rsync.samba.org,能够去官网下载最新版本的rsync。系统默认就已经安装好了rsync软件了,若是没装的可使用yum或rpm安装便可。html
[root@localhost /]#rpm -q rsync rsync-3.0.6-5e16_0.i686
在远程同步任务中,负责发起rsync同步操做的客户机称为客户端,而负责响应来自客户端的rsync同步操做的服务器称为备份源。在下行同步(下载)中,备份源负责提供文档的原始位置,发起端应对该位置有读取权限;在上行同步中(上传)中,备份源负责提供文档的目标位置,发起端应对该位置具备写入权限。以下图所示:linux
使用rsync同步工具时,备份源既能够是SSH服务器,也能够是以服务模式运行的rsync程序。下面分别讲解配置SSH备份源和rsync备份源的方法。算法
1、配置SSH备份源vim
一、建立备份用户rget,rput分别用来下载,上传。安全
[root@localhost /]#useradd rget [root@localhost /]#passwd rget [root@localhost /]#useradd rput [root@localhost /]#passwd rput
二、确认sshd服务正常运行,容许用户rget,rput访问。bash
[root@localhost /]#vim /etc/ssh/sshd_config ...//省略部份内容 UseDNS no AllowUsers rget rput //启用此行,值容许用户rget和rput使用sshd服务。 [root@localhost /]#service sshd start
三、调整同步目录的权限,使rget有读取权限、rput有写入权限。服务器
这里做者以网站根目录为例,讲解如何设置rsync备份源的权限设置。并发
在linux文件系统中,正常建立的目录权限为755,文件权限为644,所以对于rget用户来讲,默认权限已经知足下行备份的要求了。可是对于rput用户来讲,要可以写入才有权限作上行备份。建议将目录的属主修改成备份用户;另外,为了避免影响网站服务器对相关目录的访问,须要为WEB服务的运行用户指定额外的权限。这时就须要使用“setfacl”了,有关于“setfacl”的详细文档请自行查阅相关文档,做者这里只作简单的介绍。ssh
[root@localhost /]#chown -R rput:rput /var/www/html [root@localhost /]#setfacl -R -m user:daemon:rwx /var/www/html //设置ACL
“setfacl”命令经常使用的参数解释以下:
-R:表示递归操做
-m:指定用户以及设置的权限
-x:删除某一项ACL属性
-b:删除全部的ACL属性
若是但愿创建的文件,子目录也具备相同的ACL属性,则应为指定目录设置默认ACL属性,即在“setfacl”权限模式中添加“default”参数。查看已设置好的ACL可使用“getfacl”命令。
[root@localhost /]#setfacl -m default:user:daemon:rwx /var/www/html //设置默认ACl [root@localhost /]#getfacl /var/www/html //查看设置好的ACL
2、配置rsync备份源
rsync不只仅用做远程同步发起端(客户端),也能够做为守护进程运行,为其余客户机提供备份源。配置rsync备份源须要创建配置文件rsync.conf,建立备份帐号。而后将rsync程序以“--daemon”选项运行。
一、建立rsync.conf配置文件
[root@localhost /]#vim /etc/rsyncd.conf uid = nobody gid = nobody use chroot = yes //禁锢在源目录 address = 192.168.1.10 //指定监听地址 port = 873 //指定监听的端口 log file = /var/log/rsyncd.kog //存放日志的位置 pid file = /var/run/rsyncd.pid //存放PID文件的位置 host allow = 192.168.1.0 //容许访问的客户机地址 [wwwroot] //共享模块名称 path = /var/www/html //源目录的实际路径 comment = Document Root of file.benet.com read only = yes //是否为只读 dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z //同步不压缩的类型 auth users = backup //受权用户 secrets file = /etc/rsyncd_users.db //存放用户的数据文件
基于安全性考虑,对于rsync的备份源最好仅容许只读方式作下行同步,若确实须要作上行同步时,建议改用SSH备份源。另外,下行备份能够采用匿名的方式,只要将其中的“autusers”和“secretsfile”配置记录去掉就能够了。
二、建立备份用户的数据文件
根据上一步的设置,建立帐号的数据文件,添加一行用户记录,以冒号分。列如:用户名为“backup”,密码为“pwd@back”。因为帐号信息采用明文存放,所以应调整文件权限,避免帐号信息泄露。
[root@localhost /]#vim /etc/rsync_users.db backup:pwd@back [root@localhost /]#chmod 600 /etc/rsync_users.db
与配置SSH备份源相似,备份用户backup也须要对源目录/var/www/html/有相应的读取权限。实际上只要other组有读取权限就能够了。
三、启动rsync服务程序
执行“rsync--daemon”命令就能够启动rsync服务,以独立监听服务的方式运行。若要关闭rsync服务,能够采起kill进程的方式。
[root@localhost /]#rsync --daemon [root@localhost /]#netstat -anpt | grep rsync tcp 0 0 192.168.1.10:873 0.0.0.0:* LISTEN 21182/rsync [root@localhost /]#kill $(cat /var/run/rsync.pid)
四、将rsync进程交给超级服务xinetd管理
考虑到异地备份的特殊性,一般并不须要全天不间断运行,最好是在有客户练接的时候才启用。所以可将rsync交给超级服务xinetd管理,只要修改相应配置并启动xinetd服务,就能够提供rsync服务了。
[root@localhost /]#yum -y install xinetd //安装xinetd软件包 [root@localhost /]#service xinetd start //启动xinetd服务 [root@localhost /]#vim /etc/xinetd.d/rsync service rsync { disable = no //将原有的yes改成no ...//省略部份内容 server = /usr/bin/rsync server_args = --daemon //确认有--daemon服务选项 log_no_failure += USERID }
3、客户端使用rsync备份工具
有了备份源服务器之后,就可使用rsync工具来执行远程同步了。如今咱们就在客户端执行备份命令。
一、rsync命令的基本用法
[root@localhost/]#rsync[选项][备份源地址][目标地址]
命令格式及备份选项解释以下:
-r:递归模式,包含目录及子目录中的全部文件。
-l:对于符号连接文件仍然复制为符号连接文件。
-v:显示同步过程的详细信息。
-a:归档模式,保留文件的权限,属性等信息,等同于组合选项“-rlptgoD”
-z:在传文件时进行压缩。
-p:保留文件的权限标记。
-t:保留文件的时间标记。
-g:保留文件的属组标记(仅root使用)。
-o:保留文件的属主标记(仅root使用)。
-H:保留硬连接文件。
-A:保留ACL属性信息。
-D:保留设备文件及其它特殊文件。
--delete:删除目标位置有而原始位置没有的文件。
--checksum:根据校验和(而不是文件大小,修改时间)来决定是否跳过文件。
二、配置源的表示方法
在执行远程同步任务时,rsync命令需指定源服务器中的资源位置,对于下行备份操做,备份源对应“原始位置”,对于上行备份操做,备份源对应“目标位置”,根据备份源的类型不一样,其资源表示方法也不一样。
SSH备份源:表示为“用户名@主机地址:目录路径”的形式,用一个冒号分隔,验证字串与SSH登陆相似。
例如:ssh的下行备份语法以下:
[root@localhost /]#rsync -avz rget@192.168.1.1:/var/www/html /opt
例如:ssh的上行备份语法以下:
[root@localhost /]#rsync -avz /var/www/html rget@192.168.1.1:/var/www/html
rsyn备份源:表示为“用户名@主机地址::共享模块名”或者“rsync://用户名@主机地址/共享模块名的形式,前者为两个冒号分隔,后者为URL路径。
例如:rsync的下行备份语法以下:
[root@localhost /]#rsync -avz backup@192.168.1.1::wwwroot /opt
或者
[root@localhost /]#rsync -avz rsync://backup@192.168.1.1/wwwroot /opt
四:配置rsync+inotify实时同步
Linux内核从2.6.13版本开始提供了inotify通知接口,用来监控文件系统的各类变化状况,如文件存取,删除,移动,修改等。利用这一机制,能够很是方便的实现文件异动告警,增量备份,并针对目录或文件的变化及时做出响应。
使用rsync工具与inotify机制想结合,能够实现触发式备份及实时同步,只要原始位置的文档发生变化,则当即启动增量备份操做,不然处于静态等待状态。这样一来,就避免了按固定周期备份时存在延迟性,周期过密等问题。
一、配置无密码自动登录的SSH备份用户
真由于inotify通知机制有Linux内核提供,所以主要作本机监控,在触发式备份中应用时更适合上行同步。所以使用SSH备份源比较合适,因为编写触发式脚本在后台运行,没法根据提示来输入密码。所以须要作无密码自动登陆的SSH用户。对于SSH服务器来讲,采用秘钥验证是避免交互式登陆的最佳方法。例如:只要在客户机中建立无私钥短语的秘钥对,而后将公钥文件发送给服务器中的备份用户,就能够实现无密码自动登陆了。
[root@localhost /]#ssh-keygen -t rsa //建立秘钥对 [root@localhost /]#ssh-copy-id rput@192.168.1.1 //将公钥发送给服务器 [root@localhost /]#ssh rput@192.168.1.1 //无密码自动登陆 [rput@localhost /]#
二、调整inotify内核参数
[root@localhost /]#vim /etc/sysctl.conf ......//省略部份内容 fs.inotify.max_queued_events = 16384 //监控事件队列 fs.inotify.max_user_instances = 1024 //最多监控实例数 fs.inotify.max_user_watches = 1048576 //每一个实例最多监控文件数 [root@localhost /]#sysctl -p
三、安装inotify-tools工具
使用inotify机制还须要安装inotify-tools,以便提供inotifywait,inotifywatch辅助工具程序,用来监控,汇总改动状况。inotify-tools可从http://inotify-tools.sourceforge.net下载。
[root@localhost media]#tar zxf inotify-tools-3.14.tar.gz -C /usr/src/ [root@localhost media]#cd /usr/src/inotify-tools-3.14 [root@localhost inotify-tools-3.14]#./configure [root@localhost inotify-tools-3.14]#make && make install
下面以监控网站目录“/var/www/html”目录为例,执行inotify命令,而后再另外一个终端向“/var/www/html”目录下添加文件,移动文件,跟踪屏幕输出结果。
[root@localhost /]#inotify -mrq -e modify,create,move,delete /var/www/html Setting up watches.Beware:since -r was given,this may take a while! Watches established. /var/www/html/ CREATE index.php //建立index.php文件 /var/www/html/ MODIFY index.php //修改index.php文件 /var/www/html/ MOVED_FROM index.php //重命名index.php文件 /var/www/html/ MOVED_TO test.php //更名为test.php文件 ......//省略部份内容
上述命令中“-m”表示持续监控,“-r”表示递归整个目录,“-q”表示简化输出信息,“-e”表示指定监控事件(如:“modify”修改,“create”建立,“move”移动,“delete”删除,“attrib”属性更改)等各类事件,一有变更当即输出结果。
四、编写触发式同步脚本
使用inotifywait输出的监控结果中,每行记录中依次包括目录,事件,文件,据此能够识别变更状况。为了简单起见,只要检测到变更时执行rsync上行同步操做便可。须要注意的是,当更新较频繁时,应避免并发执行rsync备份——若rsync进程已经存在则忽略本次同步,或者根据rsync进程数量(取决于实际任务)来决定是否同步。
[root@localhost /]#vim rsync.sh #!/bin/bash INOTIFT_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/" RSYNC_CMD="rsync -azH --delete /var/www/html rput@192.168.1.1:/var/www/html" $INOTIFY_CMD | while read DIRECTORY EVENT FILE do if [ $(pgrep rsync | wc -l) -le 0 ];then $RSYNC_CMD if done [root@localhost /]#chmod +x rsync.sh