rsync

1、什么是rsync

rsync是一个远程数据同步工具,可以通过LAN/WAN快速同步多台主机之间的文件。

它使用所谓的"Rsync演算法"来是本地和远程两个主机之间的文件大道同步,这个算法只传送两个文件之间不同部分,而不是每次都整份传送,因此速度相当快。所以通常可以作为备份工具来使用。

运行Rsync server的机器叫backup server,一个Rsync server可以同时备份多个client的数据;也可以多个Rsync serve备份一个client的数据。

Rsync可以搭配ssh甚至使用daemon模式。

Rsync server会打开一个873的服务端口,等待地方Rsync连接。连接时,Rsync server 会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送两个文件之间不同的部分。

基本特点:

1、可以镜像保存整个目录树和文件系统;

2、可以很容易做到保持原来文件的权限、时间、软硬链接等;

3、无须特殊权限即可安装;

4、优化的流程,文件传输效率高;

5、可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接;

6、支持匿名传输。

命令语法:

rsync的命令格式可以分为以下六种:

rsync [OPTION]...SRC DEST

rsync [OPTION]...SRC [USER@HOST:DEST]

rsync [OPTION]...[USER@]HOST:SRC DEST

rsync [OPTION]...[USER@]HOST::SRC DEST

rsync [OPTION]...SRC [USER@]HOST::DEST

rsync [OPTION]...rsync://[USER@]HOST[:PORT]/SRC [DEST]

对应于以上六种命令格式,我们可以总结rsync有2种不同的工作模式:

.shell模式:使用远程shell程序(如ssh或rsh)进行连接。当源路径或目的路i纪念馆的主机名后面包含一个冒号分隔符时使用这种模式,rsync安装完成后就可以直接使用了。

daemon模式:使用TCP直接连接rsync daemon。当源路径或目的路径的主机名后面包含两个冒号,或者使用rsync://URL时使用这种模式,无需远程shell,但必须在一台机器上启动rsync daemon,默认端口873,这里可以通过 rsync --daemon使用独立进程的方式,或者通过xinetd超级进程来管理rsync后台进程。

当rsync作为daemon运行时,它需要一个用户身份。如果你希望启动chroot ,则必须以root的身份来运行daemon,监听端口,或设定文件属性;

如果不启动chroot,也可以不使用root用户来运行daemon,但该用户必须对相应的模块拥有读写数据、日志和lock file的权限。

当rsync以daemon模式运行时,它还需要一个配置文件----rsyncd.conf。修改这个配置后不必重启rsync daemon,因为每一次client连接都会去重新读取该文件。

一般将DEST远程服务器端称为 rsync Server ,运行Rsync命令的一端SRC称为Client。

2、同步测试

2.1 本机文件夹同步

#rsync -auvrtzopgP --progress /root/ /tmp/rsync_bak/

会看到从/root/传输文件到/tmp/rsync_bak/的列表和速率,再运行一次会看到sending incremental file list下没有复制内容,可以在/root/下touch某一个文件再运行看到只同步修改过的文件。

上面需要考虑以下问题:

.删除/root/下的文件不会同步删除/tmp/rsync_bak,除非加入 --delete选项

.文件访问时间等属性、读写等权限、文件内容等有任何变动,都会被认为修改

.目标目录下如果文件比源目录还新、则不会同步

.源路径的最后是否有斜杠有不同的含义:有斜杠,只是复制目录中的文件;没有斜杠的话,不但要复制目录中的文件,还要复制目录本身

3、同步到远程服务器

在服务器间rsync传输文件,需要有一个是开着rsync的服务,而这一服务需要两个配置文件,说明当前运行的用户名和用户组,这个用户名和用户组在改变文件权限和相关内容的时候有用,否则有时候会出现提示权限问题。

配置文件也说明了模块、模块化管理服务的安全性,每个模块的名称都是自己定义的,可以添加用户名密码验证,也可以验证IP,设置目录是否可写等,不同模块用于同步不头痛需求的目录。

3.1服务端配置文件

----/etc/rsyncd.conf---------------------------

#2015-02-06 by ***

uid=root

gid=root

use chroot=no

max xonnections=10

timeout=600

strict modes=yes

port=873

pid file=/var/run/rsyncd.pid

lock file=/var/run/rsyncd.lock

log file=/var/log/rsyncd.log

[module test]

path=/tmp/rsync_bak

comment=rsync test logs

auth users=st

uid=st

gid=st

secrets file=/etc/rsyncd.secrets

read only=no

list=no

hosts allow=192.168.100.3

hosts deny=0.0.0.0/32

这里配置socket方式传输文件,端口873、[module_test]开始定义一个模块,指定要同步的目录(接收)path,授权用户,密码文件,允许那台服务器IP同步(发送)等

上述配置文件每行后面不能使用#来注释

-----/etc/rsyncd.secrets:-------------

st:passwd

一行一个用户,用户名:密码。请注意这里的用户名和密码与操作系统的用户名密码无关,可以随意指定,

与/etc/rsyncd.conf中的auth users对应。

修改权限:chmod 600 /etc/rsyncd.d/rsync_server.pwd

3.2服务器启动rsync后台服务

修改/etc/xinetd.d/rsync  文件,disabled 改为no

#default:off

#description:the rsync server is a good addition to an ftp server, as it \

#allows crc checksummin etc.

service rsync

{

disabled = no

flags = IPv6

socket_type = stream

wait = no

user = root

server = /usr/bin/rsync

server-args = --daemon

log_on_failure += USERID

}

执行 service xinetd restart 会一起重启 rsync 后台进程,默认使用配置文件/etc/rsyncd.conf 。

也可以使用/usr/bin/rsync --daemon --config=/etc/rsyncd.conf

为了以防rsync写入过多的无用日志到/var/log/message,建议注释掉 /etc/xinetd.conf 的 sucess:

#log_on_sucess = PID HOST DURATION EXIT

如果使用了防火墙,要添加允许IP到873端口的规则

#iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT

#iptables -L 查看防火墙是否打开了 873端口

#netstat -anp | grep 873

关闭selinux

3.3客户端测试同步

单向同步时,客户端只需要一个包含密码的文件。

/etc/rsync_client.pwd:

passwd

chmod 600 /etc/rsync_client.pwd

命令:

将本地/root/目录同步到远程192.168.100.4 的/tmp/rsync_bak 目录(module_test指定):

/usr/bin/rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd /root/ st@193.168.100.4::module_test

当然你也可以将远程的/tmp/rsync_bak目录同步到本地目录/root/tmp:

/usr/bin/rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd st@192.168.100.4::module_test /root/

从上面两个命令可以看到,其实这里的服务器与客户端的概念是很模糊的,rsync daemon都运行在远程 192.168.100.4上,第一条命令是本地主动推送目录到远程,远程服务器是用来备份的;第二条命令是本地主动想远程索取文件,本地服务器用来备份,也可以认为是本地服务器恢复的一个过程。


rsync +sersync安装配置及调试

操作系统:Centos6.4

源服务器:192.168.100.3

目标服务器:192.168.100.4

目的:使用root用户,把源服务器上/data/htdocs/ 目录实时同步到目标服务器的/data/htdocs/下


具体操作:

一、目标服务器(rsync):192.168.100.4

1、开启防火墙TCP 873端口(rsync默认端口)

#vi /etc/sysconfig/iptables#编辑防火墙配置文件添加下面一句话:

-A -INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT

#service iptables restart#最后重启防火墙使配置生效

2、安装rsync

#yum install rsync#安装rsync

3、创建rsyncd.conf配置文件

#vi /etc/rsyncd.conf

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

uid = root

gid = root

max connections = 3600

read only = no

log file = /var/log/rsyncd.log

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsyncd.lock

[share]#模块自定义名称 ---这个需要与源服务器Sersync对应

path = /share#需要同步的目录

comment = Mirror to share test

gnore errors

read only = no

hosts allow = 192.168.100.3#允许访问源服务器IP

hosts deny = 0.0.0.0/32#拒绝所有IP连接,先允许后拒绝

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

4、启动服务:

#ulimit -SHn 65535

#/usr/bin/rsync --daemon /etc/rsyncd.conf

5、设置开机启动

#echo "ulimit -SHn 65535" >> /etc/rc.local

#echo "/usr/bin/rsync --daemon /etc/rsyncd.conf" >> /etc/rc.local

/*注意:

linux下用ulimit设置连接数最大值,默认1024

在高负载下要设置为更高,但最高只能为65535

ulimit只能临时修改,重启后失效

终极解除linux系统的最大进程数和最大文件打开数限制:

#vi /etc/security/limits.conf

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

#添加如下的行

* soft nproc 11000

* hard nproc 11000

* soft nofile 6553500

* hard nofile 6553500

*/

二、源服务器(sersync):192.168.100.3

1、安装rsync,此步骤是为了手工测试配置是否正常,问题查找处理需要,以便部署sersync时无法查看原因而迷茫。

#yum install rsync

#rsync -avzP /share/ root@192.168.100.4::share/

/*

/share/同步目录

root

192.168.100.4目的服务器,安装并配置完毕rsync

share模块自定义名称

*/

在源服务器192.168.100.3的/share目录下新建

#cd /share

#touch "1" > 1

#rsync -avzP /share/  root@192.168.100.4::share/对新文件开始同步测试

在目的服务器192.168.100.4查看/share

#cd /share

#ls 查看是否有新的文件同步过来

2、安装sersync工具,实时触发rsync进行同步

#cd /usr/local/src

#wget http://sersync.googlecode.com/files/sersync****.tar.gz

#tar -zxvf sersync***.tar.gz

GNU-Linux-x86/

GNU-Linux-x86/sersync2

GNU-Linux-x86/confxml.xml

#mv /usr/local/src/GNU-Linux-x86/ /usr/local/sersync

#vi /usr/local/sersync/confxml.xml

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

-------------confxml.xml----------------------------------

<?xml version="1.0" encoding="ISO-8859-1"?>

<head version="2.5">

<host hostip="localhost" port="8008"></host>

<debug start="false"/>

<fileSystem xfs="false"/>

<filter start="false">

<exclude expression="(.*)\.svn"></exclude>

<exclude expression="(.*)\.gz"></exclude>

<exclude expression="^info/*"></exclude>

<exclude expression="^static/*"></exclude>

</filter>

<inotify>

<delete start="true"/>

<createFolder start="true"/>

<createFile start="false"/>

<closeWrite start="true"/>

<moveFrom start="true"/>

<moveTo start="true"/>

<attrib start="false"/>

<modify start="false"/>

</inotify>


<sersync>

<localpath watch="/share">

<!--<remote ip="127.0.0.1" name="tongbu1"/>-->

<!--<remote ip="192.168.8.39" name="tongbu"/>-->

<!--<remote ip="192.168.8.40" name="tongbu"/>-->

<remote ip="192.168.100.4" name="share"/>

</localpath>

<rsync>

<commonParams params="-artuz"/>

<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>

<userDefinedPort start="false" port="874"/><!-- port=874 -->

<timeout start="false" time="100"/><!-- timeout=100 -->

<ssh start="false"/>

</rsync>

<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->

<crontab start="false" schedule="600"><!--600mins-->

<crontabfilter start="false">

<exclude expression="*.php"></exclude>

<exclude expression="info/*"></exclude>

</crontabfilter>

</crontab>

<plugin start="false" name="command"/>

</sersync>


<plugin name="command">

<param prefix="/bin/sh" suffix="" ignoreError="true"/><!--prefix /opt/tongbu/mmm.sh suffix-->

<filter start="false">

<include expression="(.*)\.php"/>

<include expression="(.*)\.sh"/>

</filter>

</plugin>


<plugin name="socket">

<localpath watch="/opt/tongbu">

<deshost ip="192.168.138.20" port="8009"/>

</localpath>

</plugin>

<plugin name="refreshCDN">

<localpath watch="/data0/htdocs/cms.xoyo.com/site/">

<cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>

<sendurl base="http://pic.xoyo.com/cms"/>

<regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>

</localpath>

</plugin>

</head>

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

启动sersync

#/usr/local/sersync/sersync2 -r -d -o /usr/local/sersync/confxml.xml

设置开机自启动

#echo "/usr/local/sersync/sersync2 -r -d -o /usr/local/sersync/confxml.xml" > /etc/rc.local


inotify-tools

1、什么是inotify

inotify是一种强大的、细粒度的、异步的文件系统时间监控机制,Linux内核从2.6.13开始引入,允许监控程序打开一个独立文件描述符,并针对事件监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。

查看系统支持inotify

Centos

#ls -l /proc/sys/fs/inotify

total 0

-rw-r--r-- 1 root root 0 Dec 11 15:23 max_queued_events

-rw-r--r-- 1 root root 0 Dec 11 15:23 max_user_instances

-rw-r--r-- 1 root root 0 Dec 11 15:23 max_user_watches

./proc/sys/fs/inotify/max_queued_events表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的时间将被丢弃,但会处罚IN_Q_OVERFLOW事件。

./proc/sys/fs/inotify/max_user_instances 表示每一个real user ID可创建的inotify instances的数量上线。

./proc/sys/fs/inotify/max_user_watches 表示每个inotify instances可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小。

inotify-tools:

inotify-tools 是linux 下inotify文件监控工具提供的一套C的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。

inotify-tools 是用c编写的,除了要求内核支持inotify外,不依赖于其他。

inotify-tools 提供了两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数。

inotify+rsync

系统环境:Centos6.4

更新源:192.168.100.3

目的服务器:192.168.100.2 192.168.100.4

1、目的服务器:192.168.100.2   192.168.100.4 (rsync服务端):

#rpm -qa | grep  rsync

#yun install rsync -y 

配置rsync配置文件/etc/rsyncd.conf

@192.168.100.2

udi = nobody

gid = nobody

use chroot = no

max connections = 100

time out = 600

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsyncd.lock

log file = /var/log/rsyncd.log

[share2]

path = /share/2/

ignore errors

read only = no

list = no

hosts allow = 192.168.100.0/255.255.255.0

auth users = share2

secrets file = /etc/share2.pwd

@192.168.100.4

udi = nobody

gid = nobody

use chroot = no

max connections = 100

time out = 600

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsyncd.lock

log file = /var/log/rsyncd.log

[share1]

path = /share/1/

ignore errors

read only = no

list = no

hosts allow = 192.168.100.0/255.255.255.0

auth users = share1

secrets file = /etc/share1.pwd

rsync配置文件详解

uid = nobody //运行RSYNC守护进程的用户

gid = nobody//运行RSYNC守护进程的组

use chroot = 0  //不使用chroot

max connections = 0 //最大连接数,0为不限制

port = 873//默认端口873

以下为安装RSYNC服务后自动生成的文件

pid file = /var/run/rsyncd.pid//pid文件的存放位置

lock file = /var/run/rsyncd.lock//锁文件的存放位置。指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock

log file = /var/log/rsyncd.log  //日志记录文件

timeout = 300

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

log format = %t %a %m %f %b 

通过该选项用户在使用transfer logging可以自己定制日志文件的字段,其格式是一个包含格式定义符的字符串,可以使用的格式定义符如下所示:

%h 远程主机名

%a 远程IP地址

%l 文件长度字符数

%p 该此rsync会话的进程ID

%o 操作类型:“send"或"recv"

%f 文件名

%P 模块路径

%m 模块名

%t 当前时间

%u 认证的用户名(匿名时是null)

%b 实际传输的字节数

%c 当发送文件时,该字段记录该文件的校验码

默认log格式为:”%o %h [%a] %m (%u) %f %l“,一般来说,在每行的头上会添加”%t [%p]“,在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件。

#transfer logging = yes

使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。

syslog facility = local3

指定rsync发送日志消息给syslog时的消息级别,常见的消息级别是:uth ,authpriv,cron,daemon,ftp,kern,lpr,mail,news,security,sys-log,user,uucp,local0,local1,local2,local3,local4,local5,local6和local7 默认值是daemon

模块参数

[share1]//这里是认证模块名,在client端需要指定

path = /share/1///需要做镜像的目录,不可缺少

comment = backup share //模块的注释信息

ignore errors //可以忽略一些无关的IO错误

read only = yes //该选项设定是否允许客户上传文件,如果为true那么任何上载请求都会失败,如果false并且服务器目录读写权限允许那么上载是允许的,默认是true。

list = no //不允许列文件

auth users = bak//认证的用户名,如果没有这行则表明是匿名,此用户与系统无关

该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块,这里的用户和系统用户没有任何关系,

如果“auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份,这里使用challenge/response认证协议。

用户的名和密码以明文方式存放在"secrets file"该选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)

secrets file = /etc/share1.pwd//密码和用户名对比表,密码文件自己生成

该选项指定一个包含定义用户民:密码对的文件,只有在"auth users"被定义时,该文件才有作用;

文件每行包含一个username:passwd对,一般来说密码最好不要超过8个字符,没有默认的secures file名,需要限式指定一个(例如:/etc/share1.pwd)

注意:该文件的权限一定要是600,否则客户端将不能连接服务器

hosts allow = 192.168.100.0/255.255.255.0 //允许主机或网段

该选项指定哪些IP客户允许连接该模块,客户模式定义可以是以下形式:

单个IP地址:192.168.100.2 

整个网段:192.168.100.0/24

多个IP或网段需要用空格隔开,"*" 则表示所有,默认是允许所有主机连接

hosts deny = 0.0.0.0/0 //禁止主机

建立认证文件

/etc/share1.pwd ,此文件必须与配置文件中指定文件名保持一一致

格式:username:password,安全问题,并不建议实际中使用root用户

192.168.100.2:

#echo "share1:123456" >> /etc/share1.pwd

192.168.100.4:

#echo "share2:123456" >> /etc/share2.pwd

设置权限600

#chmod 600 /etc/share1.pwd

#chmod 600 /etc/share2.pwd

#chmod 600 /etc/rsyncd.conf

建立motd文件

rsync.motd记录了rsync服务的欢迎信息,你可以在其中输入任何文本信息

#echo "Welcome to use the rsync services"  >> /var/rsyncd.motd 

启动rsync

#/usr/bin/rsync --daemon 

#echo "/usr/bin/rsync --daemon" >> /etc/rc.local

2、更次年源服务器配置:192.168.100.3 (rsync客户端)

inotify可以监视的文件系统事件

IN_ACCESS,即文件被访问

IN_MODIFY,文件被write

IN_ATTRIB,文件属性被修改,如 chmod  chown touch等

IN_CLOSE_WRITE,可写文件被close

IN_CLOSE_NOWRITE,不可写文件被close

IN_OPEN,文件被open

IN_MOVED_FROM,文件被移走

IN_MOVED_TO,文件被移来

IN_CREATE,创建新文件

IN_DELETE,文件被删除

IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己

IN_MOVVE_SELF,自移动,即一个可执行文件在执行时移动自己

IN_UNMOUNT,宿主文件系统被umount

IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE| IN_CLOSE_NOWRITE)

IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)

注:上面所说的文件也包括目录

安装 inotify-tools

在安装 inotify-tools 前请先确认你的linux内核是否2.6.13,并且在编译是开启了CONFIG_INOTIFY选项,也可以通过以下命令检测

#ls /proc/sys/fs/inotify

#wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz 

#tar -xvf inotify-tools-3.14.tar.gz

#cd inotify-tools-3.14

#./configure

#make && make install

编写Rsync监控脚本

#vi /root/rsync.sh

-m,即 --monitor,表示始终保持时间监听状态

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

#!/bin/bash  

host1=192.168.100.2  

host2=192.168.100.4  

src=/data/share/     

des1=share1 

des2=share2 

user1=share1 

user2=share2 

 

/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f' \  

-e modify,delete,create,attrib \  

${src} \  

| while read  file  

       do  

rsync -vzrtopg --delete --progress ${src} ${user1}@${host1}::${des1} --password-file=/etc/www1.pwd &&  

rsync -vzrtopg --delete --progress ${src} ${user2}@${host2}::${des2} --password-file=/etc/www2.pwd &&  

echo "${files} was rsynced" >> /tmp/rsync.log 2>&1  

               echo "---------------------------------------------------------------------------"  

       done 

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

-m,即 --monitor,表示始终保持时间监听状态

-r,即 --recursive,表示递归查询目录

-q,即 --quiet,表示打印出监控事件

-e,即 --event,通过此参数可以指定要监控的事件,常见的事件有modify ,delete ,create,attrib等

--timefmt:指定时间的输出格式

--format:指定变化文件的详细信息

建立认证文件(Rsync客户端认证文件只用加入密码)

#echo "123456" >> /etc/share1.pwd

#echo "123456" >> /etc/share2.pwd

#chmod 600 /etc/share1.pwd

#chmod 600 /etc/share2.pwd

#/bin/sh -n /root/rsync.sh//语法检查

#chmod +x /root/rsync.sh

#nohup sh /root/rsync.sh & 

#echo "nohup sh /root/rsync.sh &" >> /etc/rc.local

同步测试

在更新源服务器上新建一个文件,运行以下的命令,看文件是否可以正常同步,有无报错信息

#rsync -vzrtopg --delete --progress /share/share1/ share1@192.168.100.3::share1 --password file=/etc/share1.pwd

将要更新的文件提交到更新源服务器中,这样就通过inotify+rsync批量的将更新文件同步到所有的目的服务器中。