rsync远程同步

rsync(Remote Sync) 是一个Unix/linux系统下的文件同步和传输工具。Rsync通过“rsync算法”提供了一个客户机和远程文件服务器的文件同步的快速方法。每次只传送两个文件的不同部分(即支持增量备份),而不是每次都整份传送

rsync 包括如下的一些特性:

能更新整个目录树和文件系统;
有选择性的保持符号链链、硬链接、文件属性、权限、设备以及时间等;

传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。
能用rsh、ssh 或直接端口做为传输端口;
支持匿名rsync 同步文件,是理想的镜像工具;

Rsync可以通过rshssh使用,也能以daemon模式去运行,在以daemon方式运行时Rsyncserver会打开一个873端口,等待客户端去连接。

Rsync的官方站点位于http://rsync.samba.org

rsync 服务器架设比较简单,可能我们安装好rsync后,并没有发现配置文件,以及rsync服务器启动程序,因为每个管理员可能对rsync 用途不一样,所以一般的发行版只是安装好软件就完事了,让管理员来根据自己的用途和方向来自己架设rsync服务器;因为这个rsync应用比较广,能在同一台主机进行备份工作,还能在不同主机之间进行工作。在不同主机之间的进行备份,是必须架设rsync 服务器的。

在远程同步任务中,负责发起rsync同步操作的客户机称为发起端,而负责响应来自客机的rsync同步操作的服务器称为备份源。在下行同步(下载)中,备份源负责提供文档的原始位置,发起端应对该位置具有读取权限;在上行同步(上传)中,备份源负责提供文档的目标位置,发起端应对该位置具有写入权限。如下图所示:

125736640.jpg

使用rsync同步工具时,备份源既可以是SSH服务器,也可以是以服务器模式运行的rsync程序,下面分别讲解配置SSH备份源、rsync备份源的方法。

本文以RHEL6系统中的rsync-3.0.6-5为例)

125808939.jpg

1、配置SSH备份源:

使用SSH协议的好处是能够基于更安全的远程连接,增强备份的保密性。这种方式的备份源最容易配置,只要确认源文件夹的位置,并准备一个备份操作用户即可,以服务A(备份源)为例,若要将网站目录/var/www/html作为备份源,允许用户rget做下行备份,用户rput做上行备份,操作步骤如下:

在备份源服务器(IP地址为:192.168.0.1)上新建备份用户rgetrput,分别用来实现下载、上传操作:

[root@localhost~]# useradd rget

[root@localhost~]# passwd rget
[root@localhost~]# useradd rput

[root@localhost~]# passwd rput

确认sshd服务正常运行,且允许用户rgetrput能访问ssh服务器。/etc/ssh/sshd_config文件中添如下配置项,只允许rgetrput能远程登录ssh服务器。并重启sshd服务,确保修改生效。

[root@localhost~]# vim /etc/ssh/sshd_config //添加

125827360.jpg

调整备份源所提供文档所在目录的权限(如/var/www/html目录),使rget用户有权读取、rput用户有权写入。在linux系统中,正常创建的目录权限为755,文件权限为644,因此对于rget用户来说,默认权限已经满足下行备份的要求。

125858912.jpg

但是对于rput用户来说,要能够写入才有权限做上行备份,建议使用ACL访问控制机制设置用户rput/var/www/html的写入权限。

125909905.jpg

其中”-R”选项表示递归操作,”-m”选项表示修改权限,default表示在html/目录新建的文档用户rput也具有rwx权限。当需要清除所设置的ACL属性时,setfacl命令的-x-b选项,分别表示用来个别删除和全部删除。到此SSH备份源配置完毕。

有了备份源服务器以后,就可以使用rsync工具来执行远程同步了。本文讲解的备份操作均在客户机(发起端,IP为:192.168.0.3)执行。实际上备份源与发起端可以是同一台主机,其效果相当于本地备份而不是异地备份。

rsync命令的基本用法:

格式:rsync 【选项】 源文件 目标文件

常见的选项:

-a,--archive 归档模式,表示以递归的方式传输文件,并且保持文件属性,等同于-rlptgoD

-r,–recursive 对子目录以递归模式处理

-l,--links 表示拷贝链接文件

-p , --perms 表示保持文件原有权限

-t , --times 表示保持文件原有时间

-g , --group 表示保持文件原有属用户组

-o , --owner 表示保持文件原有属主

-D , --devices 表示块设备文件信息

-z , --compress 表示压缩传输

-H 表示硬连接文件

-A 保留ACL属性信息

-P 显示传输进度

-u, --update 仅仅进行更新,也就是跳过所有已经存在于目标位置,并且文件时间晚于要备份的文件。(不覆盖更新的文件)

--port=PORT 指定其他的rsync服务端口

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

--password-file=FILE FILE中得到密码
--bwlimit=KBPS
限制I/O带宽,KBytes /second

--filter - 文件名”需要过滤的文件

--exclude= :需要过滤的文件

-v 显示同步过程的详细信息

rsync备份操作示例:

下行同步SSH备份源:

将服务器192.168.0.1中的/var/www/html文件夹与客户机(192.168.0.3)本地的/wwwroot文件夹进行同步,保持文件权限和属性、软/硬链接、ACL属性、删除/wwwroot目录中多余的文件,并在传输过程中进行压缩。

确保备份源服务器中/var/www/html目录下有文件

125935407.jpg

在客户机本地创建目标目录:

125946279.jpg

在客户机上执行rsync命令实现下行同步

125956199.jpg

验证同步结果:

130014598.jpg

上行同步SSH备份源

将客户机中的/usr/share/doc/HTML/目录中的内容上传同步到SSH服务器的/var/www/html目录下,由于备份用户rput并非root用户,因此”-g””-o”等选项将无法使用。

130028538.jpg

验证结果:在192.168.0.1主机上显示/var/www/html目录下的列表

130109518.jpg

编写rsync备份脚本

实际生产环境中的备份工作通常是按计划重复执行的,例如每晚上22:30对服务器网站目录做一次下行同步,定期任务可以交给 crond服务来完成,而实际的备份操作则可以写到shell脚本中。

由于计划备份中的脚本在后台执行,无法根据提示来输入密码,因此编写rsync备份脚本时如何解决交互验证的问题就成为关键所在。

SSH备份源的无交互验证:

对于SSH服务器来说,采用密钥验证是避免交互式登录的最佳方法,只要在客户机中创建无私钥短语的密钥对,然后将公钥文件分发给服务器中的备份用户,就可以实现无密码自动登录了。

在客户机上创建密钥对:

130123738.jpg

[root@localhost~]# 回车

将公钥文件分发给服务器:

130145822.jpg

在客户机测试SSH的密钥验证:

130200731.jpg

成功实现免交互自动登录后,再次使用rsync访问SSH备份源时,也就不再提示需要密码验证了,注意,执行脚本的必须是在客户机中创创建密钥对的用户。

130215650.jpg

编写SSH备份源的shell脚本:

130226613.jpg

脚本内容如下:

130241306.jpg

对建好的备份脚本设置适当权限:

130257970.jpg

创建crond计划任务:

[root@localhost~]# crontab -e

130308861.jpg

[root@localhost~]# service crond start

[root@localhost~]# chkconfig crond on

至此SSH备份源的rsync远程备份搭建完毕。

下面接着介绍有关rsync备份源的方法

2、配置rsync备份源

rsync不仅仅用作远程同步的发起端(客户端),也可以作为守护进程运行,为其他客户机提供备份源,配置rsync备份源需要建立配置文件rsync.conf,创建备份账户,然后将rsync程序以”- -daemon”选项运行。

建立/etc/rsyncd.conf配置文件:

配置文件rsyncd.conf位于/etc/目录下,需自行建立,配置内容的格式与samba服务器类似,具体可以参考man手册页,下面将以源目录/var/www/html、备份账号backuper为例,介绍其配置方法。

在备份源服务器上创建rsyncd.conf文件。该文件要手工创建。

rsync配置文件介绍:

全局参数:对整个rsync服务器生效,如果模块参数和全局参数冲突,针对冲突模块的模块参数生效

模块参数:定义需要通过rsync输出的目录定义的参数

下面是常见的全局配置参数,

port:指定后台程序使用的端口号,默认为873

uid该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是" nobody"

gid:该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为" nobody"

max connections指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。

lock file:指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock

motd file" motd file" 参数用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认是没有motd文件的。

log file" log file" 指定rsync的日志文件,而不将日志发送给syslog

pid file:指定rsyncpid文件,通常指定为“/var/run/rsyncd.pid”,存放进程ID的文件位置

hosts allow = 单个IP地址或网络地址 //允许访问的客户机地址

下面是常见的模块配置参数

主要是定义服务器哪个目录要被同步输出。

其格式必须为“[共享模块名]”形式,这个名字就是在rsync客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过path来指定的。

Comment给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。

Path:指定该模块的供备份的目录树路径,该参数是必须指定的。

read only yes为只允许下载,no为可以下载和上传文件到服务器

exclude:用来指定多个由空格隔开的多个文件或目录(相对路径),将其添加到exclude列表中。这等同于在客户端命令中使用—exclude----filter来指定某些文件或目录不下载或上传(既不可访问)

exclude from指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exclude列表定义,每个文件或目录需要占用一行

include 用来指定不排除符合要求的文件或目录。这等同于在客户端命令中使用--include来指定模式,结合includeexclude可以定义复杂的exclude/include规则。

include from指定一个包含include模式的定义的文件名,服务器从该文件中读取include列表定义。

auth users:该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果" auth users" 被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在" secrets file" 选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)

secrets file:该选项指定一个包含定义用户名:密码对的文件。只有在" auth users" 被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名,注意:该文件的权限一定要是600,否则客户端将不能连接服务器。

hosts allow指定哪些IP的客户允许连接该模块。定义可以是以下形式:

单个IP地址,例如:192.167.0.1,多个IP或网段需要用空格隔开,

整个网段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0

*”则表示所有,默认是允许所有主机连接。

hosts deny指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。

list:该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true

Timeout通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600

创建rsyncd.conf文件:

130540393.jpg

内容如下:

130622702.jpg

注:如果以"use chroot = no"选项运行可写的rsync守护程序的话,***者就可能通过诱骗rsync在模块之外创建文件,所以出于安全考虑,建议将该选项设置为yes。

基于安全性考虑,对于rsync 的备份源最好仅允许以只读方式做下行同步,若确实需要做上行同步时,建议改用SSH备份源。另外,下行备份可以采用匿名的方式,只要将其中的”auth users””secrets file”配置记录去掉就可以了。

为备份账户创建数据文件:

根据上一步的设置,创建账号数据文件,添加一行用户记录,以冒号分隔,用户名称为backuper,密码为pwd123。由于账号信息采用明文存放,因此应调整文件权限,避免账号信息泄露。

130702400.jpg

在该文件中添加用户名和密码

130718510.jpg

设置rsyncd_users.db文件的权限为700600,权限设置不对的话身份验证会失败

130741690.jpg

与配置SSH备份源类似,备份用户backuper也需要对源目录/var/www/html/有相应的读取权限。实际上只要other组有读取权限,则备份用户backuper和运行用户nobody也就有了读取权限了。

启动rsync服务程序,执行”rsync --daemon”命令就可以启动rsync服务,以独立监听服务的方式运行,若要关闭rsync服务,可以采用kill进程的方式。

130753675.jpg

”rsync --daemon”保存到/etc/rc.local文件中,确保系统启动后自动启动rsync服务。

130813429.jpg

注:在iptables防火墙上创建规则允许873端口的通信:

130924223.jpg

上面启动rsync服务程序是通过”rsync --daemon”方式启动rsync服务。考虑到异地备份的特性,通常并不需要全天不间断运行,最好只是在有客户机连接的时候才启用,因此可以将rsync交给超级服务xinetd管理,只要修改相应配置并启动xinetd服务,就可以提供rsync服务了。也就是当xinetd服务接收到客户端的同步请求后,会把rsync同步请求转给rsync程序。

配置方法:

130909723.jpg

130910237.jpg

修改后内容如下:

注:将disable = yes 改为no;确信有- -daemon服务选项.

131848388.jpg

安装xinetd服务软件包:

131113894.jpg

启动xinetd服务:

131243158.jpg

selinux开启要修改selinux的布尔值:

131324680.jpg

至此rsync备份源配置完毕,下面使用rsync备份工具实现备份操作。

格式1

rsync 选项用户名@备份源服务器IP::共享模块名目标目录

格式2

rsync 选项 rsync://用户名@备份源服务器IP/共享模块名目标目录

在客户机上执行rsync命令实现下行同步操作:

132128104.jpg

132129554.jpg

编写rsync备份脚本:

rsync备份源的无交互验证,对于rsync备份源来说,可使用环境变量RSYNC_PASSWORD来存放密码。执行 rsync备份任务时,会自动读取该变量,并在需要时发送给rsync源服务器来进行验证。如下所示:

132258666.jpg

132258362.jpg

Rsync备份脚本如下:

132405722.jpg

内容如下:

132407254.jpg

设置x权限:

132451484.jpg

设置计划任务,在 crond计划任务中按指定计划执行脚本。

到此rsync备份源配置完毕。

3、配置rsync+inotify实时同步:

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

使用rsync工具与inotify机制相结合,可以实现触发式备份(实时同步),只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静态等侍状态,这样一来,就避免了按固定周期备份进存在的延迟性、周期过密等问题。

正因为inotify通知机制由linux内核提供,因此主要做本机监控,在触发式备份中应用时更适合上行同步,下面介绍其配置过程。

两台服务器,均为RHEL6系统,IP分别为:192.168.0.1192.168.0.3,把192.168.0.1服务器上的/var/www/html目录时实同步到192.168.0.3主机上的/wwwroot目录中。

在服务器192.168.0.1上执行下面的相关操作,实现实时同步:

查看是否支持inotify,从kernel 2.6.13开始正式并入内核。

看看是否有/proc/sys/fs/inotify/目录,以确定内核是否支持inotify

132511317.jpg

在linux内核中,默认的inotify机制提供了三个调控参数:max_queued_events、max_user_instances、max_user_watches。分别表示监控事件队列、最多监控实例数、每个实例最多监控文件数

132547613.jpg

当要监控的目录、文件数量较多或者变化较频繁时,建议加大这三个参数的值。例如可直接修改/etc/sysctl.conf配置文件,将管理队列设为32768,实例数设为1024,监控数设为1048576(建议大于监控目标的总文件数)。

/etc/sysctl.conf文件中添加如下内容:

132605401.jpg

执行sysctl -p使修改后的sysctl.conf文件生效。

安装inotify-tools工具,使用inotify机制还需要安装inotify-tools,以便提供inotifywaitinotifywatch辅助工具程序,用来监控、汇总改动情况。

编译安装inotify-tools软件包:

132656923.jpg

132724916.jpg

132819538.jpg

以监控网站目录/var/www/html为例,可以先执行inotifywait命令,然后在另一个终端向/var/www/html目录下添加文件、移动文件,跟踪屏幕输出结果。其中选项”-e”用来指定要监控哪些事件(create,move,delete,modify,attrib 是指监听创建移动删除写入属性更改事件),选项”-m”表示持续监控,”-r”表示递归整个目录,”-q”表示简化输出信息。

其他选项的含义:

-a 存档模式
-h
保存硬连接
-z
压缩文件数据在传输
-t
维护修改时间
--delete
删除于多余文件

192.168.0.1服务器上执行下面的命令,监控/var/www/html的变化情况:

132848268.jpg

在另一个终端登录,在/var/www/html目录进行相关的操作,回到原来的终端查看监控变化情况。

132912161.jpg

使用inotifywait输出的监控结果中,每行记录中依次包括目录、事件、文件。据此可以识别变动情况。

编写触发式同步脚本:

为了简单起见,只要检测到变动时执行rsync上行同步操作即可。需要注意的是,当更新较频繁时,应避免并发执行rsync备份(当rsync进程已经存在则忽略本次同步,或根据rsync进程数量来决定是否同步)

先配置好基于密钥身份验证的SSH服务,确保在服务器192.168.0.1主机上使用adminput用户能无交互式远程登录备份主机192.168.0.3192.168.0.3主机上创建adminput用户并确保adminput用户拥有对目标目录/wwwroot属主和属组权限。chownadminput:adminput /wwwroot,设置adminput用户针对/wwwrootacl权限。

132930411.jpg

132931152.jpg

脚本内容如下:

132957879.jpg

132957282.jpg

触发式上行同步的验证过程如下所述

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

2)192.168.0.1主机上运行/opt/inotify_rsync.sh脚本程序

3)切换到本机的/var/www/html目录,执行增加、删除、修改文件等操作

4)查看192.168.0.3备份主机的/wwwroot目录下的变化情况。

至此有关rsync远程同步的所有操作整理完毕,希望能对大家有所帮助。