Rsync和Sersync(企业实时同步方案)
注:本文章依据参考文章中的信息资料结合自己的实践操作而成
一、实验环境介绍
系统版本: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(企业实时同步方案)的更多相关文章
- sersync+rsync实现服务器文件实时同步
sersync+rsync实现服务器文件实时同步 一.为什么要用rsync+sersync架构? 1.sersync是基于inotify开发的,类似于inotify-tools的工具 2.sersyn ...
- sersync基于rsync+inotify实现数据实时同步
一.环境描述 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 主服务器A:192.168.1.23 从服务器B:192. ...
- Rsync+Sersync数据实时同步(双向)
Rsync+Sersync数据实时同步(双向) 服务介绍 一.为什么要用rsync+sersync架构? 1.sersync是基于inotify开发的,类似于inotify-tools的工具 2.se ...
- Linux下Rsync+Inotify-tools实现数据实时同步
Linux下Rsync+Inotify-tools实现数据实时同步 注意:下面的三个案例都是rsync 每次都是全量的同步(这就坑爹了),而且 file列表是循环形式触发rsync ,等于有10个文件 ...
- (转)Linux系统sersync数据实时同步
Linux系统sersync数据实时同步 原文:http://blog.csdn.net/mingongge/article/details/52985259 前面介绍了以守护进程的方式传输或同步数据 ...
- Linux之sersync数据实时同步
sersync其实是利用inotify和rsync两种软件技术来实现数据实时同步功能的,inotify是用于监听sersync所在服务器上的文件变化,结合rsync软件来进行数据同步,将数据实时同步给 ...
- sersync/lsyncd实时同步
第一章 sersync/lsync实时同步 1.1 实时同步服务原理/概念 1)需要部署好rsync守护进程服务,实现数据传输 2)需要部署好inotify服务,实现目录中数据变化监控 3)将rsyn ...
- CentOS 6.5 rsync+inotify实现数据实时同步备份
CentOS 6.5 rsync+inotify实现数据实时同步备份 rsync remote sync 远程同步,同步是把数据从缓冲区同步到磁盘上去的.数据在内存缓存区完成之后还没有写入到磁盘 ...
- Rsync+inotify实现文件实时同步#附shell脚本
强烈推荐先仔细看此文 https://segmentfault.com/a/1190000002427568 实验环境 centos 7.3 vm2:192.168.221.128 同步服务器 vm1 ...
随机推荐
- 在 Windows10 系统中安装 Homestead 本地开发环境
在 windows10 系统中安装 homestead 本地开发环境 在 windows10 环境下安装 homestead 开发环境,网上有很多相关教程其中大多都是 mac 环境,很多大神都是用户的 ...
- Python-基础-day2
Python环境的安装 安装Python: windows: 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\pyth ...
- python中字符串逆序的实现
没有直接的逆序函数,有两种常用方式可将字符串逆序,一为切片,一为利用list的reverse,示例如下: #切片x=' y=x[::-1] #reverse函数 y=list(x) y.reverse ...
- 模仿学习小游戏外星人入侵-Python学习,体会“函数”编程
游戏类如下: # !/usr/bin/python # -*- coding:utf-8 -*- """ Author :ZFH File :alien.py Softw ...
- 工具-putty使用
Ubuntu 下安装 OpenSSH Server 是无比轻松的一件事情,需要的命令只有一条 sudo apt-get install openssh-server 启动SSH服务: sudo /et ...
- [using_microsoft_infopath_2010]Chapter 14高级话题
本章提要: 1.剖析表单逻辑 2.从多个表单中合并数据 3.重新连接XML表单到XSN模板文件 4.在repeating table中设置默认值 5.离线填写表单的权衡
- Cocos2d-x碰撞检測
假设不适用Box2D物理引擎.那么要进行Cocos2d-x的碰撞检測那我们的方法往往就是进行"矩形和点"."矩形和矩形"这样粗略的碰撞检測.我们一般採取开启sc ...
- 网页爬虫框架jsoup介绍
序言:在不知道jsoup框架前,因为项目需求.须要定时抓取其它站点上的内容.便想到用HttpClient方式获取指定站点的内容.这样的方法比較笨,就是通过url请求指定站点.依据指定站点返回文本解析. ...
- UVA 11346 - Probability 数学积分
Consider rectangular coordinate system and point L(X, Y ) which is randomly chosen among all pointsi ...
- 15.Linux的文件结构
linux的文件结构和windows不同,没有分区,是树形的结构: /etc:存放配置文件 /lib:编译程序需要的函数库 /usr:包含所有其他内容,比如内核在/usr/src中,/usr/bin存 ...