Rsync和Sersync(企业实时同步方案)

时间:2021-07-27 01:27:15

注:本文章依据参考文章中的信息资料结合自己的实践操作而成

一、实验环境介绍

系统版本: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