Rsync + sersync实时同步服务器文件

  1. Rsync介绍
  2. sersync的介绍
  3. 安装Rsync
    1. rsyncd.conf服务器的配置详解:
  4. sersync 安装与配置
  5. 验证:
  6. 错误参考:
    1. 同步模块权限验证失败:
  7. 参考文章

Rsync介绍

rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。

Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

Rsync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配置文件。Rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时Rsync server会打开一个873端口,等待客户端去连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。

Rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试。此外,它在windows平台下也有相应的版本,如cwRsync和Sync2NAS等工具。

sersync的介绍

sersync主要用于服务器同步,web镜像等功能。基于boost1.43.0,inotify api,rsync command.开发。目前使用的比较多的同步解决方案是inotify-tools+rsync ,另外一个是google开源项目Openduckbill(依赖于inotify- tools),这两个都是基于脚本语言编写的。相比较上面两个项目,本项目优点是:
sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤(详细见附录,这个过滤脚本程序没有实现),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。

因为在墙外,我把它放在了百度网盘上:http://pan.baidu.com/s/1bndfcvX

安装Rsync

在使用sersync之前,我们必须安装配置好rsync服务器。这里我们需要注意的是,纯粹的使用rsync做单向同步时,rsync的守护进程是运行在文件推送的服务器上,而接收的服务器是运行rsync客户端。使用sersync做文件实时同步刚好相反,用于接收文件的服务器运行rsync守护进程。

一.安装rsync

# yum install rsync -y
# yum install xinetd -y

二.启动rsync依赖服务

# /etc/init.d/xinetd start
# chkconfig xinetd on

编辑配置文件/etc/rsyncd.conf

uid=root
gid=root
use chroot=no
max connections=10
strict modes=yes
port=873
address=192.168.1.205 #服务器端ip
[data]
path=/data/Upload/product
comment=mirror for test
ignore errors
read only=no
list=no
auth users=root
secrets file=/etc/rsync.pas
hosts.allow=*
pid file=/var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

rsyncd.conf服务器的配置详解:

A、全局定义

在rsync 服务器中,全局定义有几个比较关健的,根据我们前面所给的配置文件 rsyncd.conf 文件;

  

   注:用chroot,在传输文件之前,服务器守护程序在将chroot 到文件系统中的目录中,这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件,将会排除在外。也就是说,你在 rsync服务器上,如果有符号链接,你在备份服务器上运行客户端的同步数据时,只会把符号链接名同步下来,并不会同步符号链接的内容;这个需要自己来尝试。

  注:read only 是只读选择,也就是说,不让客户端上传文件到服务器上。还有一个 write only选项,自己尝试是做什么用的吧;

  注:在您可以指定单个IP,也可以指定整个网段,能提高安全性。格式是ip 与ip 之间、ip和网段之间、网段和网段之间要用空格隔开;

  注:motd file 是定义服务器信息的,要自己写 rsyncd.motd 文件内容。当用户登录时会看到这个信息。比如我写的是:

  ++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
2002——2009
  ++++++++++++++++++++++++++++++++++++++++++++++

  log file = /var/log/rsync.log 注:rsync 服务器的日志;

  transfer logging = yes 注:这是传输文件的日志

  log format = %t %a %m %f %b
  syslog facility = local3
  timeout = 300

B、模块定义

   模块定义什么呢?主要是定义服务器哪个目录要被同步。每个模块都要以[name]形式。这个名字就是在rsync 客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过path 指定的。我们可以根据自己的需要,来指定多个模块。每个模块要指定认证用户,密码文件、但排除并不是必须的

  下面是前面配置文件模块的例子:

[rhel4home] #模块它为我们提供了一个链接的名字,在本模块中链接到了/home目录;要用[name] 形式
  path = /home #指定文件目录所在位置,这是必须指定的
  auth users = root #认证用户是root ,是必须在服务器上存在的用户
  list=yes #list 意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes 。如果你不想列出来,就no ;如果是no是比较安全的,至少别人不知道你的服务器上提供了哪些目录。你自己知道就行了;
  ignore errors #忽略IO错误
  secrets file = /etc/rsyncd.secrets #密码存在哪个文件
  comment = linuxsir home data #注释可以自己定义
  exclude = beinan/ samba/

注:exclude是排除的意思,也就是说,要把/home目录下的easylife和samba排除在外; easylife/和samba/目录之间有空格分开

请确认要同步的目录是否存在

配置密码认证文件

# echo "root:haha1029**" > /etc/rsync.pas
# chmod 600 /etc/rsync.pas
# rsync --daemon --config=/etc/rsyncd.conf

重启xinetd使其配置生效

# /etc/init.d/xinetd restart

设置开机自启动

# echo "rsync --daemon --config=/etc/rsyncd.conf" >> /etc/rc.local

sersync 安装与配置

下载安装:sersync in pan.baidu.com

创建sersync目录结构

# mkdir /usr/local/sersync
# mkdir /usr/local/sersync/conf
# mkdir /usr/local/sersync/bin
# mkdir /usr/local/sersync/log
# tar zxvf sersync2.5_32bit_binary_stable_final.tar.gz
# cd GNU-Linux-x86/
# cp confxml.xml /usr/local/sersync/conf
# cp sersync2 /usr/local/sersync/bin

配置sersync

1.首先创建连接rsyncd的密码文件

# echo "123456" >/etc/rsync.pas
# chmod 600 /etc/rsync.pas

2.配置confxml.xml

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

配置文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8008"></host>
<debug start="true"/>
<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="true"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>
<modify start="true"/>
</inotify>
<sersync>
<localpath watch="/data/Upload/product">
<remote ip="192.168.1.205" name="data"/>
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" 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="/usr/local/sersync/log/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="true" name="command"/>
</sersync>
<plugin name="command">
<param prefix="/opt/install/php/bin/php /path/to/php script " 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="/data/Upload/product/">
<cdninfo domainname="ccms.fastweb.com" port="80" username="xxxx" passwd="xxxx"/>
<sendurl base="http://jinritemai.com/product"/>
<regexurl regex="false" match="*.html"/>
</localpath>
</plugin>
</head>

注意,我使用了command 插件,用来告知cdn服务提供商内容更新。
他的输出是这样的:

/opt/install/php/bin/php /opt/install/tools/refreshcdn.php /data/web/product/****.html

其中第三个参数是inotify通知的变化的文件。这里作为参数传递给脚本处理。这样就简单实现了在更新静态文件时同时刷新了cdn服务器的任务。

3.创建推送端sersync同步目录
# mkdir /data/Upload/product

4.设置环境变量:

# echo "export PATH=$PATH:/usr/local/sersync/bin/" >> /etc/profile
# source /etc/profile

5.启动sersync
# sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml
注:重启操作如下:
# killall sersync2 && sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml

6.设置开机启动
# echo "sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml" >> /etc/rc.local

验证:

在192.168.1.217这台机器/data/Upload/product/目录下面新增文件,然后在192.168.1.205机器的配置模块目录下查看。

错误参考:

同步模块权限验证失败:

单独执行下面这条指令,

[jrtm@fzb ~]$ cd /data/Upload/product && rsync -artuz -R --delete ./ 192.168.1.205::data
Password:
@ERROR: auth failed on module data
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]

遇到这种情况可以单独执行上面的rsync -artuz -R --delete ./ 192.168.1.205::data 测试下在单独输入密码的情况下能否过去到达相应的模块。

参考文章

script>