rsync+sersync多線程實時同步


一、sersync優點

1)使用c++編寫,對linux系統文件產生的臨時文件和重復文件操作會進行過濾,在結合rsync同步的時候,會減少運行時消耗的本地及網絡資源,因此速度更快。

2)相比較inotify-tools,sersync配置起來簡單,https://code.google.com/archive/p/sersync/downloads下載源碼,其中bin目錄下是已經編譯好的二進制文件,配合bin目錄下的xml文件直接使用即可。

3)使用多線程同步(可以並發同步多個不同的文件),尤其在同步較大文件時,能夠保證多個服務器實時保持同步狀態。

4)sersync自帶出錯處理機制,通過失敗隊列對出錯的文件重新同步,如果仍舊失敗,則每若干個小時對同步失敗的文件再重新同步。

5)sersync自帶crontab功能,只需在xml配置文件中開啟,即可按預先的配置,隔一段時間整體同步一次

6)sersync自帶socket與http的協議擴展,可以滿足有特殊需求的公司的二次開發。

7)當同步的目錄數據量不大時,建議使用rsync+inotify;當同步的目錄數據量很大時(幾百G甚至1T以上)文件很多時,建議使用rsync+sersync

 

二、分析

1)線程組線程是等待線程隊列的守護線程,當事件隊列中有事件產生的時候,線程組守護線程就會逐個喚醒同步線程,當隊列中inotify事件較多的時候,同步線程就會被全部喚醒一起工作。這樣設計的目的是能夠同時處理多個inotify事件,從而提升服務器的並發能力(核數*2+2)。之所以稱之為線程組,是因為每個線程在工作的時候,會根據服務器上新寫入文件的數量建立子線程,子線程可以保證所有的文件與各個服務器同時同步,當要同步的文件較大的時候,這樣設計可以保證各個遠程服務器可以同時獲得要同步的文件。

2)服務線程的作用有三個:

  a)首先是處理同步失敗的文件,將這些文件再次同步,對於再次同步失敗的文件會生成rsync_fail_log.sh腳本,記錄失敗的事件。

  b)每隔10隔小時執行腳本一次,同時清空腳本。

  c)第三個作用是crontab功能,可以每隔一定時間,將所有路徑整體同步一次。

3)過濾隊列的建立是為了過濾短時間內產生的重復的inofity信息,例如在刪除文件夾的時候,inotify就會同時產生刪除文件夾里的文件與文件夾的事件,通過過濾隊列,當刪除文件夾事件產生的時候,會將之前加入隊列的刪除文件的事件全部過濾掉,這樣只產生一條刪除文件夾的事件,從而減輕了同步的負擔。同時對於修改文件的操作的時候,會產生臨時文件的重復操作,過濾隊列也會過濾掉這些臨時文件。

 

三、rsync服務,下面只有關於這個項目的一些簡單配置,具體請看http://www.cnblogs.com/bill2014/p/7398760.html

1)服務端的rsyncd.conf

[root@rsyncserver ~]# cat >rsyncd.conf<<EOF
#Rsync server
##rsyncd.conf start##
uid = root    這個就是共享目錄的權限
gid = root    這個就是共享目錄的權限
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 192.168.222.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
[www]
comment = www by old0boy   注釋
path = /data0/www/www/
#####################################
[bbs]
comment = bbs by old0boy 
path = /data0/www/bbs/
#####################################
[blog]
comment = blog by old0boy 
path = /data0/www/blog/

2)接着在服務端創建目錄

[root@rsyncserver ~]# mkdir -p /data0/www/www/ /data0/www/bbs/ /data0/www/blog/

3)客戶端部署

3.1)在客戶端創建目錄和文件

[root@rsyncclient ~]# mkdir -p /data0/www/bbs/ /data0/www/www/ /data0/www/blog
[root@rsyncclient ~]# touch /data0/www/bbs/bbs.log /data0/www/www/www.log /data0/www/blog/blog.log

3.2)推送

[root@rsyncclient ~]# rsync -avzP /data0/www/bbs/ rsync_backup@192.168.222.140::bbs/  --password-file=/etc/rsync.password
[root@rsyncclient ~]# rsync -avzP /data0/www/www/ rsync_backup@192.168.222.140::www/  --password-file=/etc/rsync.password
[root@rsyncclient ~]# rsync -avzP /data0/www/blog/ rsync_backup@192.168.222.140::blog/  --password-file=/etc/rsync.password

 

四、下載sersync,並配置xml

4.1)下載,,https://code.google.com/archive/p/sersync/downloads,翻牆

[root@rsyncclient tools]# tar -zxf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/
[root@rsyncclient local]# mv GNU-Linux-x86 sersync
[root@rsyncclient local]# tree sersync/
sersync/
├── confxml.xml
└── sersync2

0 directories, 2 files

4.2)規范化目錄

[root@rsyncclient sersync]# mkdir conf bin logs
[root@rsyncclient sersync]# mv confxml.xml conf
[root@rsyncclient sersync]# mv sersync2 bin/sersync
[root@rsyncclient sersync]# tree
.
├── bin
│   └── sersync
├── conf
│   └── confxml.xml
└── logs

3 directories, 2 files

4.3)更改優化sersync配置,24-28行,因為我只用了一個服務端一個客戶端,所以只有一個同步服務器

原內容為:
	<localpath watch="/opt/tongbu">
                <remote ip="127.0.0.1" name="tongbu1"/>
		<!--<remote ip="192.168.8.39" name="tongbu"/>-->
                <!--<remote ip="192.168.8.40" name="tongbu"/>-->
	</localpath>
改為:
	<localpath watch="/data0/www/www">
		<remote ip="192.168.222.140" name="www"/>
	</localpath>
	<localpath watch="/data0/www/bbs">
                <remote ip="192.168.222.140" name="bbs"/>
        </localpath>
	<localpath watch="/data0/www/blog">
                 <remote ip="192.168.222.140" name="blog"/>
        </localpath>

4.4)更改31-34行,認證部分

<commonParams params="-artuz"/>
<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>

改為:
	<rsync>
	    <commonParams params="-aruz"/>
	    <auth start="true" users="rsync_backup" 
            passwordfile="/etc/rsync.password"/>
	    <userDefinedPort start="false" port="874"/><!-- port=874 -->
	    <timeout start="true" time="100"/><!-- timeout=100 -->
	    <ssh start="false"/>
	</rsync>

上面這個配置就是在拼接rsync -zvzP --timeout=100 /data0/www/www/ rsync_backup@192.168.222.140::www/ --password-file=/etc/rsync.password這個命令

4.5)修改36-37行

<failLog path="/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進行重新同步。

 

五、開啟sersync守護進程同步數據

5.1)配置sersync環境變量

[root@rsyncclient conf]# echo 'export PATH=$PATH:/usr/local/sersync/bin'>>/etc/profile
[root@rsyncclient conf]# tail -1 /etc/profile
export PATH=$PATH:/usr/local/sersync/bin
[root@rsyncclient conf]# source /etc/profile
[root@rsyncclient conf]# which sersync
/usr/local/sersync/bin/sersync

5.2)啟動命令:

[root@rsyncclient conf]# sersync -r -d -o /usr/local/sersync/conf/confxml.xml
測試結果:發現問題,僅能第一個模塊的路徑可以同步,其他下面的路徑不能同步。

只同步了第一個目錄

[root@rsyncclient conf]# sersync -r -d -o /usr/local/sersync/conf/confxml.xml
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -r 	rsync all the local files to the remote servers before the sersync work
option: -d 	run as a daemon
option: -o 	config xml name:  /usr/local/sersync/conf/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost	host port: 8008
daemon start,sersync run behind the console 
use rsync password-file :
user is	rsync_backup
passwordfile is 	/etc/rsync.password
after each synchronize run the plugin 	plugin name is: command
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) 
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /data0/www/www && rsync -aruz -R --delete ./  --timeout=100 rsync_backup@192.168.222.140::www --password-file=/etc/rsync.password >/dev/null 2>&1 
run the sersync: 
watch path is: /data0/www/www

5.3)多實例

5.3.1)多實例,在conf下,拷貝xml

[root@rsyncclient conf]# cp confxml.xml www_confxml.xml
[root@rsyncclient conf]# cp confxml.xml bbs_confxml.xml
[root@rsyncclient conf]# cp confxml.xml blog_confxml.xml

5.3.2)然后再各個xml下還需要修改錯誤日志文件的名字,例如bbs_rsync_fail_log.sh

<failLog path="/usr/local/sersync/logs/bbs_rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->

 

5.3.3)在localpath段內也只需要保留該實例的的ip和模塊,否則只會跟上面第一次同步的情況一樣,依舊是第一個目錄

     <localpath watch="/data0/www/bbs">
                <remote ip="192.168.222.140" name="bbs"/>
     </localpath>

5.3.4)多實例初始化同步:

sersync -r -d -o /usr/local/sersync/conf/www_confxml.xml
sersync -r -d -o /usr/local/sersync/conf/blog_confxml.xml
sersync -r -d -o /usr/local/sersync/conf/bbs_confxml.xml

如果已經初始化過了,下次就可以不加-r選項

5.3.5)開機自動執行

將上面的命令除去-r加入rc.local

 

六、參數

參數-d:啟用守護進程模式
參數-r:在監控前,將監控目錄與遠程主機用rsync命令推送一遍,如果設置了過濾器,即在xml文件中,filter為true,則暫時不能使用-r參數進行整體同步
c參數-n: 指定開啟守護線程的數量,默認為10個
參數-o:指定配置文件,默認使用confxml.xml文件
參數-m:單獨啟用其他模塊,使用 -m refreshCDN 開啟刷新CDN模塊
參數-m:單獨啟用其他模塊,使用 -m socket 開啟socket模塊
參數-m:單獨啟用其他模塊,使用 -m http 開啟http模塊
不加-m參數,則默認執行同步程序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM