一、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參數,則默認執行同步程序