rsync是linux系统中的数据镜像备份工具。支持本地复制,或者与其他SSH、rsync主机同步。rsync使用所谓的"Rsync算法"进行数据同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
Sersync是一个利用Inotify与Rsync技术实现对服务器数据实时复制的解决方案。
Sersync特性:
- 使用C++编写,支持对监控事件的过滤功能。
- 采用XML配置文件,然后由守护进程启动,配置起来比Inotify-tools更简单。
- 使用多线程进行复制,即可以并发复制多个不同文件。
- Sersync自带出错处理机制,通过失败队列对出错的文件重新进行复制。
- Sersync自带crontab功能,可实现对失败队列中的文件定时整体复制。
- Sersync自带socket与HTTP的协议扩展,可以满足有特殊需求的公司二次开发。
1 rsync部署
1.1 安装rsync
yum install rsync -y
1.2 rsync配置
Rsync默认使用873端口,需关闭防火墙后开通防火墙策略。
vi /etc/rsyncd.conf
# uid,gid表示rsync这个服务是以那个用户的身份去运行
uid = root
gid = root
use chroot = no
# 示指定最大并发连接数,0表示不限制
max connections = 0
# 忽略守护进程上的I/O错误
ignore errors
pid file = /root/rsyncd/rsyncd.pid
log file = /root/rsyncd/rsyncd.log
lock file = /root/rsyncd/rsyncd.lock
# 是否使用名称解析(控制守护进程是否对客户端IP地址执行反向查找以确定其主机名)
reverse lookup = no
# 指定允许的主机或网段内的主机来访问rsync服务器
hosts allow = *
# 共享的目录名称
[data]
# 共享的路径
path = /data/
# 描述
comment = data
read only = false
# 自定义认证用户,不是系统用户
auth users = rsync_user
# 设置进行连接认证的密匙文件
secrets file = /etc/rsync.pass
1.3 创建data共享目录
此文件夹为1.2章节中rsync配置的data目录,如存在则无需创建。
mkdir /data
1.4 创建密码文件
1.4.1 服务端
# rsync_user 是 1.2 配置文件中的 auth users,密码可以任意内容。
echo 'rsync_user:123456' > /etc/rsync.pass
# 必须设置600权限
chmod 600 /etc/rsync.pass
1.4.2 客户端
# 客户端与服务端创建密码文件格式不同,用于上传或下载文件时做认证用途
echo '123456' > /etc/rsync-password.pass
# 必须设置600权限
chmod 600 /etc/rsync-password.pass
1.5 启动rsync
#启动
rsync –daemon
#停止,任意一种方式都可以
killall rsync
或
pkill rsync
1.6 文件上传下载
主要测试rsync命令是否正常使用
客户端上传文件:rsync -avz [本地路径] [远程路径] [参数]
# --password-file=/etc/rsync.pass 是本地保存的密码文件
rsync -avz /data/ rsync_user@192.168.0.2::data --password-file=/etc/rsync.pass
服务端下载文件:rsync -avz [远程路径] [本地路径] [参数]
rsync -avz rsync_user@192.168.0.1::data/data/ --password-file=/etc/rsync.pass
2 sersync部署
2.1 sersync下载
# 通过wget下载或者上传到系统中
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
解压文件:
tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
# 文件解压后的目录为:GNU-Linux-x86
2.2 创建sersync目录
mkdir /usr/local/sersync/
mkdir /usr/local/sersync/bin
mkdir /usr/local/sersync/conf
mkdir /usr/local/sersync/logs
2.3 移动sersync解压后的文件
mv GNU-Linux-x86/sersync2 /usr/local/sersync/bin/sersync2
mv GNU-Linux-x86/confxml.xml /usr/local/sersync/conf/confxml.xml
2.4 配置sersync
<?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配置 /data 为1.2章节rsync中配置的共享目录名称 -->
<localpath watch="/data">
<!-- remote 配置远端IP,以及远端的接收目录 -->
<remote ip="192.168.0.2" name="data"/>
</localpath>
<rsync>
<commonParams params="-artuz"/>
<!-- auth 认证ne配置 users为远端rsync的认证用户,passwordfile为本地创建的认证密码文件 -->
<auth start="true" users="rsync_user" passwordfile="/root/rsyncd/rsync-password.pass"/>
<userDefinedPort start="false" port="873"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<!-- 失败日志保存位置,默认60分钟进行重试 -->
<failLog path="/root/rsyncd/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<!-- 定时同步配置,默认600分钟 -->
<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>
2.5 启动sersync
/usr/local/sersync/bin/sersync2 -d -r -o /usr/local/sersync/conf/confxml.xml
# 参数注解:
# -d:启用守护进程模式
# -r:在监控前,将监控目录与远程主机用rsync命令推送一遍
# -o:指定配置文件,默认使用confxml.xml文件
2.6 停止sersync
Killall sersync2
或
pkill sersync2
3 多目录同步
3.1 rsync配置
多目录同步时首先需要在rsyncd.conf配置中创建多个共享目录,配置如下:
… …
[data1]
# 共享的路径
path = /data1/
# 描述
comment = data1
read only = false
# 自定义认证用户,不是系统用户
auth users = rsync_user
# 设置进行连接认证的密匙文件
secrets file = /etc/rsync.pass
[data2]
# 共享的路径
path = /data2/
# 描述
comment = data2
read only = false
# 自定义认证用户,不是系统用户
auth users = rsync_user
# 设置进行连接认证的密匙文件
secrets file = /etc/rsync.pass
3.2 sersync配置
创建多个sersync的confxml配置,多个confxml不能重名,例如:confxml_one.xml、confxml_two.xml,并修改配置文件中相应的配置指向不通的目录。
最后启动多个sersync程序,并分别指定配置文件即可。
/usr/local/sersync/bin/sersync2 -d -r -o /usr/local/sersync/conf/confxml_one.xml
/usr/local/sersync/bin/sersync2 -d -r -o /usr/local/sersync/conf/confxml_two.xml
4 双向同步
如果需要服务器之间双向同步,则在两台服务器中同时部署配置sersync和rsync即可。