rsync 远程同步


正确有效的备份方案是保障系统及数据安全的重要手段,在服务器中通常会结合计划任务,shell脚本来执行本地备份。


rsync(Remote Sync,远程同步)是一个开源的快速安全高效的异地备份工具,可以在不同的主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,

采用优化的同步算法,传输前执行压缩。适合异地备份,镜像服务等应用,是一种常用的文件备份工具。


官方站点:http://rsync.samba.org 

维护人员:Waync Davison

版本:3.0.9


负责发起rsync同步操作的客户机称为发起端

负责响应来自客户机的rsync同步操作的服务器称为备份源


下载:在下行同步中,备份源负责提供文档的原始位置,发起端应对文件具有读取权限

上传:在上行同步中,备份源负责提供文档的目标位置,发起端应对文件具有写入权限


rsync 两种源模式:


SSH备份源

rsync备份源




配置SSH备份源


优点:远程连接安全,增强备份的保密性,容易实现。


配置过程:

a、确认备份源文件夹位置

b、准备备份操作用户


案例:

A机器的网站目录/var/www/html作为备份源

用户rget做下行(下载)备份

用户rput做上行(上传)备份



A机器为rsync服务端 IP:192.168.200.128

B机器为rsync客户端 IP:192.168.200.129



A机器上的操作:192.168.200.128:


yum -y install httpd  

rpm -q rsync


rsync-3.0.6-9.el6_4.1.x86_64


useradd rget

echo "123456" |passwd --stdin rget

useradd rput

echo "123456" |passwd --stdin rput


vi /etc/ssh/sshd_config

122 UseDNS no

#110 AllowUsers rget rput


关闭UseDNS加速SSH登录

限定登录用户


service sshd restart


调整/var/www/html目录权限,使rget用户有读取权限,rput用户有写入权限,建议将目录的属主修改为备份用户,另外需要为web服务的运行用户指定额外的权限,


cd /var/www/html

mkdir upload


chown -R rput:rput /var/www/html/

setfacl -R -m user:apache:rwx /var/www/html/upload

getfacl /var/www/html/upload


acl访问控制机制参数详解


setfacl 设置acl权限

getfacl 查看acl权限

-R 递归

-m 制定权限

-x 个别删除

-b  全部删除



* 下面两行不需要执行,作为了解

setfacl -R -b /var/www/html 表示删除所有ACL属性

setfacl -R -x user:apache /var/www/html/upload 只删除某一项

---------------------------------------------


凡是以后在/var/www/html/upload/新建立的文档,apache用于都具有rwx权限

setfacl -m default:user:apache:rwx /var/www/html/upload

getfacl /var/www/html/upload |grep default






配置rsync备份源


rsync 不仅用作远程同步发起端(客户端),也可以作为守护进程(服务端),为其他客户机提供备份源。

1、建立/etc/rsyncd.conf配置文件

2、为备份账户创建数据文件

3、启动rsync服务进程


1、建立/etc/rsyncd.conf配置文件,以源目录 /var/www/html/,备份帐号 backuper作为事例:


[root@rsync-master html]# vim /etc/rsyncd.conf


uid = nobody

gid = nobody

use chroot = yes

address = 192.168.200.128

port = 873

log file = /var/log/rsyncd.log

pid file = /var/run/rsyncd.pid

hosts allow = 192.168.200.0/24

[wwwroot]

        path = /var/www/html

        comment = Document Root os www.crushlinux.com

        read only = yes

        dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z

        auth users = backuper

        secrets file = /etc/rsyncd_users.db


uid = nobody //用户名

gid = nobody //组名

use chroot = yes //禁锢在源目录

address = 192.168.200.128 //监听地址

port = 873 //监听端口

log file = /var/log/rsyncd.log //日志文件位置

pid file = /var/run/rsyncd.pid //存放进程ID文件位置

hosts allow = 192.168.200.0/24 //允许访问的客户端地址

[wwwroot] //共享模块名称

        path = /var/www/html //源目录的实际路径

        comment = Document Root os www.crushlinux.com //描述信息

        read only = yes //是否为只读

        dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z //同步时不再压缩的文件类型

        auth users = backuper //备份授权用户

        secrets file = /etc/rsyncd_users.db //存放账户信息的数据文件


对于rsync的备份源最好仅允许以只读的方式做下行同步

若需要做上行同步时,建议用SSH备份源

下行同步可采用匿名的方式,只要去掉auth users 、secrets file 配置记录即可

2、为备份账户创建数据文件,以冒号分割,密码信息在文件中以明文方式存放,为避免信息泄漏,需要调整权限

[root@rsync-master ~]# vim /etc/rsyncd_users.db

backuper:pwd123


chmod 600 /etc/rsyncd_users.db 


备份用户backuper也需要对/var/www/html/有相应的读取权限


ll /var/www/html/


drwxrwxr-x+ 2 rput rput 4096 1月  18 23:06 upload



3、启动服务,运行参数为"--daemon",关闭rsync可采用kill命令


rsync --daemon

netstat -anpt |grep rsync


关闭服务

kill $(cat /var/run/rsyncd.pid)


4、异地备份的特殊性,不需要全天不间断运行,配置成只有客户机连接的时候才启动(交给xinetd管理)


[root@rsync-master ~]# vim /etc/xinetd.d/rsync 

6  disable = no #将原有的yes改成no

11 server_args     = --daemon #确认有--daemon选项即可


yum -y install xinetd

service xinetd start




使用rsync备份工具(在客户机,发起端执行)


本地备份:备份源和发起端可以是一台机器


rsync /etc/fstab /opt/

rsync -rl /etc/fstab /boot/grub/ /opt/


rsync的常用格式:

rsync [选项] 原始位置 目标位置


-r:递归模式,包含目录及子目录中所有文件

-l:对于符号链接文件仍然复制为符号链接文件

-p:保留文件的权限标记

-t:保留文件的时间标记

-g:保留文件的属组标记(仅超级用户使用)

-o:保留文件的属主标记(仅超级用户使用)

-D:保留设备文件及其他特殊文件


-a:归档模式,递归并保留对象属性,等同于 -rlptgoD

-v:显示同步过程的详细(verbose)信息

-z:在传输文件时进行压缩(compress)

-H:保留硬连接文件

-A:保留ACL属性信息

--delete:删除目标位置有而原始位置没有的文件

--checksum:根据对象的校验和来决定是否跳过文件



异地备份:B机器上的操作:192.168.200.129:


配置源的表示方法:

rsync命令需要指定备份源服务器中的资源位置

下行备份操作:备份源对应 “原始位置”

上行备份操作:备份源对应 “目标位置”


SSH备份源表示为:


用户名@主机地址:目标路径,用一个冒号分割

访问SSH备份源,下载到本地/opt目录

rsync -avz rget@192.168.200.128:/var/www/html/ /opt/



rsync备份源表示为:


用户名@主机地址::共享模块名称

rsync://用户名@主机地址/共享模块名称


rsync -avz backuper@192.168.200.128::wwwroot /root

rsync -avz rsync://backuper@192.168.200.128/wwwroot /root



1、下行同步ssh备份源

将服务器A的/var/www/html 文件夹与B本地/wwwroot文件夹同步(保持文件权限属性,

软硬连接,ACL属性,删除/wwwroot中多余文件,传输过程进行加密)


mkdir -p /wwwroot

rsync -avzH --delete rget@192.168.200.128:/var/www/html/ /wwwroot 

ls /wwwroot/



对于同一项远程同步任务,再次执行时,自动做增量更新,同名的文件将不再重复复制


A机器上的操作:192.168.200.128:

cd /var/www/html/

rm -rf index.html upload/

for i in {1..10}; do touch $i.txt; done


B机器上的操作:192.168.200.129:

rsync -avzH --delete rget@192.168.200.128:/var/www/html/ /wwwroot 

ls /wwwroot/



2、下行同步rsync备份源

当备份源为rsync服务器时,只要将同步操作中的原始位置修改为规范格式,其他操作基本一样

将备份源服务器中的 wwwroot 下载到本地的 /myweb目录

B机器上的操作:192.168.200.129:

mkdir /myweb

rsync -avzH --delete backuper@192.168.200.128::wwwroot /myweb 

ls /myweb



3、上行同步ssh备份源

将客户机中的文件上传到备份源服务器的/var/www/html目录下,由于用户是rput并非root用户,因此 -g -o 等选项无法使用


cd /root

rsync -rlvz --delete install.log rput@192.168.200.128:/var/www/html



编写rsync备份脚本:


生产环境中的备份工作通常是按计划重复执行的,结合shell和crond服务来完成


1、ssh备份源的无交互验证,由于脚本根据crond时间来执行,用户没办法按时根据提示输入密码

B机器上的操作:192.168.200.129:创建密钥对,将公钥文件发给A服务器中的备份用户,实现无交互登录


创建密钥对:

ssh-keygen -t rsa


复制密钥对:

ssh-copy-id rget@192.168.200.128

ssh-copy-id rput@192.168.200.128


连接测试:

ssh rget@192.168.200.128

ssh rput@192.168.200.128


rsync -avzH --delete rget@192.168.200.128:/var/www/html/ /wwwroot 



2、rsync备份源的无交互验证,可以使用export RSYNC_PASSWORD保存密码,脚本执行时,可以自动读取该变量的值,在需要时发送给rsync服务器来进行燕子


export RSYNC_PASSWORD=pwd123

rsync -avzH --delete backuper@192.168.200.128::wwwroot /wwwroot/



相对于 SSH 源的免交互措施来说,使用变量存放密码显得不够安全,因此可在脚本中使用,并将脚本的权限严格控制,避免密码泄漏。


vi rsync_get_wwwroot.sh 

-------------------------------------

#!/bin/bash

CMD="/usr/bin/rsync"

RSYNC_USER="backuper"

export RSYNC_PASSWORD="pwd123"

ARGS="-az --delete"

SRC="192.168.200.128::wwwroot"

DST="/wwwroot"

mkdir -p $DST


$CMD $ARGS $RSYNC_USER@$SRC $DST

------------------------------------


chmod 700 rsync_get_wwwroot.sh

crontab -e

30 20 * * * /root/rsync_get_wwwroot.sh


service crond restart

chkconfig crond on






rsync+inotify实时同步 (B机器上的操作)


Linux 从2.6.13版内核开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件的存取,删除,移动,修改等。利用这个机制,可以实现文件异动警告,增量备份,针对目录或文件的变化及时做出响应。


rsync+inotify 可以实现触发式备份,只要原始位置的文档发生变化,则立即启动增量备份,否则处于静默等待状态,避免了按固定周期备份时存在的延迟性,周期过密等问题。



inotify 主要做本机监控,在触发式备份应用中更适合上行同步


inotify机制提供了三个调控参数:


max_queued_events //表示监控事件队列

max_user_instances //最多监控实例数

max_user_watches //每个实例最多监控文件数


cat /proc/sys/fs/inotify/max_queued_events //表示监控事件队列(16384)

16384

cat /proc/sys/fs/inotify/max_user_instances //最多监控实例数(128)

128

cat /proc/sys/fs/inotify/max_user_watches //每个实例最多监控文件数(8192)

8192


当要监控的目录,文件数量较多或者变化频繁时,建议加大这三个参数的值


vi /etc/sysctl.conf 

fs.inotify.max_queued_events = 16384

fs.inotify.max_user_instances = 1024              

fs.inotify.max_user_watches = 1048576


sysctl -p




安装 inotify-tools 主要提供inotifywait,inotifywatch等工具,用来监控,汇总改动情况


官方站点:http://inotify-tools.sourceforge.net


tar xf inotify-tools-3.14.tar.gz 

cd inotify-tools-3.14

./configure && make && make install


以监控网站目录/var/www/html为例,执行inotifywait命令后,在另外一个终端中改动/var/www/html目录下的内容

mkdir /var/www/html -p

inotifywait -mrq -e modify,create,move,delete /var/www/html/


-e 指定要监控的事件

-m 表示持续监控

-r 表示递归整个目录

-q 简化输出信息


另一个终端:在/var/www/html/目录下添加文件、移动文件、跟踪屏幕输出结果


mkdir /var/www/html/a

mkdir /var/www/html/b

mv /var/www/html/b /var/www/html/bb

rm -rf /var/www/html/a


[root@rsync-client ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html/

fy,create,move,delete /var/www/html/

/var/www/html/ CREATE,ISDIR a

/var/www/html/ CREATE,ISDIR b

/var/www/html/ MOVED_FROM,ISDIR b

/var/www/html/ MOVED_TO,ISDIR bb

/var/www/html/ DELETE,ISDIR a


inotifywait 可监控modify(修改),create(创建),move(移动),delete(删除),attrid(属性更改)等各种事件,一有变动立即输出结果,inotifywait可用于收集系统变动情况,并在运行结束后输出汇总的变化情况。



编写触发式同步脚本


inotifywait 输出的监控结果中,每行记录中包括目录,事件,文件,据此可以识别变动情况,只要检测到变动时执行rsync上行同步操作即可。


注意:当更新较频繁时,避免并发执行rsync备份,若rsync进程已经存在则忽略本次同步,或者根据rsync进程数量来决定是否同步


vi inotify_rsync.sh 


#!/bin/bash

INOTIFY_CMD="inotifywait -mrq -e modify,create,move,attrib,delete /var/www/html/"

RSYNC_CMD="rsync -azH --delete /var/www/html/ rput@192.168.200.128:/var/www/html"

$INOTIFY_CMD | while read DIRECTORY EVENT FILE

do

        if [ $(pgrep rsync | wc -l) -le 0 ]

        then

                $RSYNC_CMD

        fi

done



chmod +x inotify_rsync.sh 

bash inotify_rsync.sh

echo "/bin/bash /root/inotify_rsync.sh" /etc/rc.local 


脚本用来测试本机/var/www/html目录的变动,一旦有更新立刻出发rsync同步操作,上传至服务器192.168.200.128的/var/www/html目录,用户验证采用SSH方式。


1、使用rsync工具执行一次上行同步

2、在本机运行inotify_rsync.sh脚本

3、在本机的/var/www/html目录下,执行创建,删除,修改等操作

4、查看服务器中的/var/www/html目录中的变化