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

一、实验环境介绍

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

Rsync和Sersync(企业实时同步方案)的更多相关文章

  1. sersync+rsync实现服务器文件实时同步

    sersync+rsync实现服务器文件实时同步 一.为什么要用rsync+sersync架构? 1.sersync是基于inotify开发的,类似于inotify-tools的工具 2.sersyn ...

  2. sersync基于rsync+inotify实现数据实时同步

    一.环境描述 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 主服务器A:192.168.1.23 从服务器B:192. ...

  3. Rsync+Sersync数据实时同步(双向)

    Rsync+Sersync数据实时同步(双向) 服务介绍 一.为什么要用rsync+sersync架构? 1.sersync是基于inotify开发的,类似于inotify-tools的工具 2.se ...

  4. Linux下Rsync+Inotify-tools实现数据实时同步

    Linux下Rsync+Inotify-tools实现数据实时同步 注意:下面的三个案例都是rsync 每次都是全量的同步(这就坑爹了),而且 file列表是循环形式触发rsync ,等于有10个文件 ...

  5. (转)Linux系统sersync数据实时同步

    Linux系统sersync数据实时同步 原文:http://blog.csdn.net/mingongge/article/details/52985259 前面介绍了以守护进程的方式传输或同步数据 ...

  6. Linux之sersync数据实时同步

    sersync其实是利用inotify和rsync两种软件技术来实现数据实时同步功能的,inotify是用于监听sersync所在服务器上的文件变化,结合rsync软件来进行数据同步,将数据实时同步给 ...

  7. sersync/lsyncd实时同步

    第一章 sersync/lsync实时同步 1.1 实时同步服务原理/概念 1)需要部署好rsync守护进程服务,实现数据传输 2)需要部署好inotify服务,实现目录中数据变化监控 3)将rsyn ...

  8. CentOS 6.5 rsync+inotify实现数据实时同步备份

    CentOS 6.5 rsync+inotify实现数据实时同步备份 rsync    remote sync 远程同步,同步是把数据从缓冲区同步到磁盘上去的.数据在内存缓存区完成之后还没有写入到磁盘 ...

  9. Rsync+inotify实现文件实时同步#附shell脚本

    强烈推荐先仔细看此文 https://segmentfault.com/a/1190000002427568 实验环境 centos 7.3 vm2:192.168.221.128 同步服务器 vm1 ...

随机推荐

  1. 在 Windows10 系统中安装 Homestead 本地开发环境

    在 windows10 系统中安装 homestead 本地开发环境 在 windows10 环境下安装 homestead 开发环境,网上有很多相关教程其中大多都是 mac 环境,很多大神都是用户的 ...

  2. Python-基础-day2

    Python环境的安装 安装Python: windows: 1.下载安装包     https://www.python.org/downloads/ 2.安装     默认安装路径:C:\pyth ...

  3. python中字符串逆序的实现

    没有直接的逆序函数,有两种常用方式可将字符串逆序,一为切片,一为利用list的reverse,示例如下: #切片x=' y=x[::-1] #reverse函数 y=list(x) y.reverse ...

  4. 模仿学习小游戏外星人入侵-Python学习,体会“函数”编程

    游戏类如下: # !/usr/bin/python # -*- coding:utf-8 -*- """ Author :ZFH File :alien.py Softw ...

  5. 工具-putty使用

    Ubuntu 下安装 OpenSSH Server 是无比轻松的一件事情,需要的命令只有一条 sudo apt-get install openssh-server 启动SSH服务: sudo /et ...

  6. [using_microsoft_infopath_2010]Chapter 14高级话题

    本章提要: 1.剖析表单逻辑 2.从多个表单中合并数据 3.重新连接XML表单到XSN模板文件 4.在repeating table中设置默认值 5.离线填写表单的权衡

  7. Cocos2d-x碰撞检測

    假设不适用Box2D物理引擎.那么要进行Cocos2d-x的碰撞检測那我们的方法往往就是进行"矩形和点"."矩形和矩形"这样粗略的碰撞检測.我们一般採取开启sc ...

  8. 网页爬虫框架jsoup介绍

    序言:在不知道jsoup框架前,因为项目需求.须要定时抓取其它站点上的内容.便想到用HttpClient方式获取指定站点的内容.这样的方法比較笨,就是通过url请求指定站点.依据指定站点返回文本解析. ...

  9. UVA 11346 - Probability 数学积分

    Consider rectangular coordinate system and point L(X, Y ) which is randomly chosen among all pointsi ...

  10. 15.Linux的文件结构

    linux的文件结构和windows不同,没有分区,是树形的结构: /etc:存放配置文件 /lib:编译程序需要的函数库 /usr:包含所有其他内容,比如内核在/usr/src中,/usr/bin存 ...