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
?
轉載于:https://www.cnblogs.com/sanduzxcvbnm/p/7886052.html
總結
以上是生活随笔為你收集整理的Rsync和Sersync(企业实时同步方案)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【bzoj4842】[Neerc2016
- 下一篇: (网页)SQLserver中在上线的项目