注:本文章依据参考文章中的信息资料结合自己的实践操作而成
一、实验环境介绍
系统版本:Cent OS 7.4 X64
内核版本:3.10.0-693.5.2.el7.x86_64
系统采用最小化安装,selinux为关闭状态,iptables没有安装(若安装且启用需放行873端口)
Rsync服务端+Sersync服务器(SERSYNC),外网ip:192.168.0.121,内网ip:192.168.10.128
Web服务器,rsync客户端,外网ip:192.168.0.119,内网ip:192.168.10.129
二、rsync客户端操作
1、安装rsync软件
#yum –y install rsync
2、修改rsync客户端配置文件
#vim /etc/rsyncd.conf
##rsyncd.conf start##
uid = root # rsync对后面模块中的path路径拥有什么权限
gid = root # rsync对后面模块中的path路径拥有什么权限
use chroot = no # 安全操作
max connections = 2000 # 定义连接数2000
timeout = 600 # 600秒超时
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log #日志文件路径
ignore errors # 忽略错误
read only = false # false才能上传文件,true不能上传文件
list = false # 文件列表
hosts allow = 192.168.0.121,192.168.10.128 #服务端的ip,内网通的话只填写内网IP即可,多个ip使用英文逗号分隔
hosts deny = *
auth users = rsync_bak # 虚拟用户,同步时需要用这个用户
secrets file = /etc/rsync.password # 密码文件
#####################################
[web] # 模块名称
comment = redhat.sx site files # 注释
path = /data/web # 模块的路径,客户端接收同步文件的路径
####################################
[download]
comment = redhat.sx site sit data files
path = /data/download
#####################################
注:使用的时候去掉后面的注释信息(#)
3、客户端创建相关待同步的目录
[root@WEB ~]# mkdir /data/{web,download} -p
[root@WEB ~]# tree /data (yum –y install tree)
/data
├── download
└── web
2 directories, 0 files
4、客户端相关认证和权限项配置
[root@WEB /]# echo 'rsync_bak:redhat' > /etc/rsync.password #创建密码文件,文件名和文件中的用户名同上面配置文件(/etc/rsyncd.conf)中的文件名保持一致
[root@WEB /]# chmod 600 /etc/rsync.password #安全起见,设置密码文件权限
[root@WEB /]# cat /etc/rsync.password
rsync_bak:redhat
[root@WEB /]# ll /etc/rsync.password
-rw-------. 1 root root 7 Jun 4 00:20 /etc/rsync.password
5、启动rsync
#rsync –daemon #以守护进程方式启动,不使用xinetd
6、查看rsync服务状态
[root@WEB /]# lsof -i tcp:873 (yum -y install lsof)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 20982 root 3u IPv4 88170 0t0 TCP *:rsync (LISTEN)
rsync 20982 root 5u IPv6 88171 0t0 TCP *:rsync (LISTEN)
7、为rsync添加开机自启动
[root@WEB /]# echo "/usr/bin/rsync --daemon" >> /etc/rc.local
[root@WEB /]# grep daemon /etc/rc.local
/usr/bin/rsync --daemon
这里顺带附上重启的命令,rsync重启有点麻烦,需要以先杀掉后台守护进程,然后再启动的方式来重启服务。
[root@WEB /]# pkill rsync
[root@WEB /]# rsync --daemon
三、在服务端上配置rsync
1、安装rsync并配置相应权限
[root@SERSYNC /]# yum install rsync -y #安装软件
[root@SERSYNC /]# echo "redhat" > /etc/rsync.password #设置密码,密码同客户端密码文件中的密码保持一致,只写密码
[root@SERSYNC /]# chmod 600 /etc/rsync.password #安全起见,设置密码文件权限
[root@SERSYNC /]# cat /etc/rsync.password
redhat
[root@SERSYNC ~]# ll /etc/rsync.password
-rw-------. 1 root root 7 Jun 4 00:20 /etc/rsync.password
2、在SERSYNC上手动测试rsync的同步情况
特别强调:此步很关键,如果这不能同步,后面的 SERSYNC 配好了也不会同步数据。
1)分别创建待同步数据
[root@SERSYNC ~]# mkdir /data1/{web1,download1} -p #服务端建立目录,给客户端同步文件使用,可以跟客户端的文件目录等不一样
[root@SERSYNC ~]# touch /data1/{web1/index1.html,download1/b.jpg}
[root@SERSYNC ~]# tree /data1 (yum -y install tree)
/data1
├── download1
│ └── b.jpg
└── web1
└── index1.html
2 directories, 2 files
2)执行同步命令
针对WEB(192.168.10.129):
# rsync -avzP /data1/web1 rsync_bak@192.168.10.129::web/ --password-file=/etc/rsync.password
#rsync -avzP /data1/download1/ rsync_bak@192.168.10.129::download/ --password-file=/etc/rsync.password
同步完之后,对WEB的相应目录进行查看!提示:在后面进行部署SERSYNC之前,SERSYNC主服务器(即SERSYNC)上必须要确保手动可以把文件推送到WEB上,这样后续SERSYNC才能调用这些命令来自动推送。
[root@WEB ~]# tree /data/
/data/
├── download
│ └── b.jpg
└── web
└── web1
└── index1.html
3 directories, 2 files
注意:
1、看一下客户端同步后的文件路径,中间多了一层目录,是因为在服务端同步时服务端的路径后面是否要加/的原因造成的。加/的话是同步这个目录下的文件,不加/的话是把该目录及目录下的文件同步过去。
2、上面紫色的标识是服务端的文件路径,意思是说把该路径下的文件(加/)同步到后面的地址指定的模块对应的路径下,也就是客户端配置文件的path路径下.
四、在服务端配置Sersync
上面的工作做好之后呢,下面就开始正式配置我们的Sersync了!
我们在Sersync安装过程中所用到包均是从谷歌Sersync项目组取得的,地址:https://code.google.com/p/sersync/downloads/list.这里,我所用的将是这个 sersync2.5.4_64bit_binary_stable_final.tar.gz 的64位可执行文件版本,里面已经包含了配置文件与可执行文件。下面的操作也都是基于该版本去做的。
1、准备Sersync安装包
#cd /usr/local/src
#wget --no-check-certificate https://raw.githubusercontent.com/orangle/sersync/master/release/sersync2.5.4_64bit_binary_stable_final.tar.gz
#tar zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
GNU-Linux-x86/
GNU-Linux-x86/sersync2
GNU-Linux-x86/confxml.xml
2、安装Sersync
[root@SERSYNC source]# cp -r GNU-Linux-x86/ /usr/local/sersync
[root@SERSYNC source]# tree /usr/local/sersync
/usr/local/sersync
├── confxml.xml
└── sersync2
0 directories, 2 files
3、规范Sersync目录结构
[root@SERSYNC source]# cd /usr/local/sersync
[root@SERSYNC sersync]# mkdir conf bin logs
[root@SERSYNC sersync]# mv confxml.xml conf
[root@SERSYNC sersync]# mv sersync2 bin/sersync
[root@SERSYNC sersync]# tree
.
├── bin
│ └── sersync
├── conf
│ └── confxml.xml
└── logs
3 directories, 2 files
4、配置Sersync
[root@SERSYNC sersync]# cp conf/confxml.xml conf/confxml.xml.bak.$(date +%F)
[root@SERSYNC sersync]# ls
bin conf logs
[root@SERSYNC sersync]# ls conf/
confxml.xml confxml.xml.bak.2014-06-04
为了满足我们的需求,我们需要修改如下几处设置:
1)修改24-28行的内容,原内容为:
<localpathwatch="/opt/tongbu"> #定义本地要同步的目录
<remoteip="127.0.0.1" name="tongbu1"/> #
<!--<remoteip="192.168.8.39" name="tongbu"/>--> #同步到哪个机器,同步到机器的哪个模块
<!--<remoteip="192.168.8.40" name="tongbu"/>-->
</localpath>
修改后内容为:
<localpathwatch="/data1/web1"> #服务端同步给客户端的目录
<remoteip="192.168.0.129" name="web"/> #客户端的ip和模块名称,即把文件同步到哪个客户端的哪个目录下
</localpath>
该文件中分隔符形式为:<!--###########################-->
2)修改31-34行,认证相关部分:
<commonParamsparams="-artuz"/>
<auth start="false"users="root" passwordfile="/etc/rsync.pas"/>
<userDefinedPortstart="false" port="874"/><!-- port=874 -->
<timeoutstart="false" time="100"/><!-- timeout=100 -->
<sshstart="false"/>
修改后内容为:
<commonParamsparams="-aruz"/>
<auth start="true" users="rsync_bak" passwordfile="/etc/rsync.password"/> #客户端配置文件中的信息
<userDefinedPortstart="false" port="874"/><!-- port=874 -->
<timeoutstart="true" time="100"/><!-- timeout=100 -->
<sshstart="false"/>
提示:上面的几个配置就是在拼接
rsync -aruz --timeout=100 /data1/web1/ rsync_bak@192.168.0.129::web/ --password-file=/etc/rsync.password
3)修改36-37行
<failLogpath="/tmp/rsync_fail_log.sh"timeToExecute="60"/><!--default every 60mins execute once-->
修改后内容为
<failLog path="/usr/local/sersync/logs/rsync_fail_log.sh "timeToExecute="60"/><!--default every 60mins execute once-->
当同步失败后,日志记录到/usr/local/sersync/logs/rsync_fail_log.sh,并且每60分钟对失败的log进行重新同步。
修改后的完整配置文件为:
[root@SERSYNC sersync]# cat -n /usr/local/sersync/conf/confxml.xml
1<?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="/data1/web1/">
<remote ip="192.168.0.129" name="web"/>
</localpath>
<rsync>
<commonParams params="-aruz"/>
<auth start="true" users="rsync_bak" passwordfile="/etc/rsync.password"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="true" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/usr/local/logs/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>
以上的配置文件,我们仅仅配置了针对 WEB 上web这个模块,即/data/web目录的自动同步。由于我们还有一个download模块,即/data/download目录需要进行自动同步。因此这就意味着,我们需要配置多实例了。
Sersync的多实例和往常的apache,nginx一样,你只需要把配置文件拷贝一份出来,然后针对不同的实例做不同的修改,然后在最后开启 sersync 服务的时候指定不同的配置文件做启动即可!
配置针对download的实例配置文件:
[root@SERSYNC sersync]# cp /usr/local/sersync/conf/confxml.xml /usr/local/sersync/conf/download_confxml.xml
修改方法如上,这里仅贴出和上个实例之间不一样的地方:
<sersync>
<localpath watch="/data1/download1/">
<remote ip="192.168.10.129" name="download"/>
</localpath>
<rsync>
5、开启Sersync守护进程进行数据同步
1)配置 Sersync 环境变量
[root@SERSYNC sersync]# echo 'export PATH=$PATH:/usr/local/sersync/bin'>>/etc/profile
[root@SERSYNC sersync]# tail -1 /etc/profile
export PATH=$PATH:/usr/local/sersync/bin
[root@SERSYNC sersync]# . /etc/profile
[root@SERSYNC sersync]# which sersync
/usr/local/sersync/bin/sersync
启动的过程及结果:
注意:我们这里要启动的是多实例,即confxml.xml和download_confxml.xml
[root@SERSYNC ~]# ls /usr/local/sersync/conf/*
/usr/local/sersync/conf/confxml.xml
/usr/local/sersync/conf/confxml.xml.bak.2014-06-04
/usr/local/sersync/conf/download_confxml.xml
# sersync -r -d -o /usr/local/sersync/conf/confxml.xml
# sersync -r -d -o /usr/local/sersync/conf/download_confxml.xml
2)开启后查看进程
# ps -ef |grep sersync
3)配置开机自启动
[root@SERSYNC ~]# cp /etc/rc.local /etc/rc.local.bak._$(date +%F)
[root@SERSYNC ~]# tail -n 3 /etc/rc.local #增加下面的信息到该文件
# sync data to 192.168.10.129
sersync -d -o /usr/local/sersync/conf/confxml.xml
sersync -d -o /usr/local/sersync/conf/download_confxml.xml
6、测试Sersync是否正常
# for i in {1..10000};do echo 123456 > /data1/web1/$i &>/dev/null;done
# for i in {1..10000};do echo 123456 > /data1/download1/$i &>/dev/null;done
# tree /data/
以上,我们是写入了20000个文件,然后批量测试同步效率:
这种情况下,同步情况不是很令人乐观
此时,我们可以通过ps -ef |grep rsync|wc -l来查看Sersync的服务端 Rsync的进程数,最好多次统计,你会发现这个进程是动态变化的!
此时,我们在去WEB上tree或者ls下,/data/web和/data/download的同步情况!
需要注意:生产中,写的越快,并发的进程也就越多!当写的过多的时候,也是没法实现实时同步,因此这个也是受写入数据量大小影响的。
在生产环境中,一般来说以 DELL R710 服务器为主,在千兆网卡情况下,每秒钟同步 10-100k 的文件能达到同步 40 到 50 个。
参考文章:
http://blog.51cto.com/nolinux/1433109
http://blog.51cto.com/nolinux/1433623