文件實時同步對於運維是個很常見的需求。 如集羣的機器,須要上傳個文件,以前的步驟是每臺服務器分別上傳。 作文件同步之後,只上傳一臺,其餘機器自動同步。 目前實現實時同步的主流方案有 rsync+inotify、sersync、lsyncd。
rsync + inotify 是最多見的方案。 Inotify 是一個 Linux 內核特性,它監控文件系統,而且及時向專門的應用程序發出相關的事件警告,好比刪除、讀、寫和卸載操做等 本準備試驗一下,在網上看到以下評價: 當向監控目錄下拷貝複雜層次目錄(多層次目錄中包含文件),或者向其中拷貝大量文件時,inotify常常會隨機性地遺漏某些文件。這些遺漏掉的文件因爲未被監控到,全部監控的後續操做都不會執行,例如不會被rsync同步。
這是國人開發的實時同步工具。優勢以下: 1.sersync是使用c++編寫,並且對linux系統文件系統產生的臨時文件和重複的文件操做進行過濾,因此在結合rsync同步的時候,節省了運行時耗和網絡資源。所以更快。 2.配置簡單,其中bin目錄下已經有基本上靜態編譯的2進制文件,配合bin目錄下的xml配置文件直接使用便可。 3.使用多線程進行同步,尤爲在同步較大文件時,可以保證多個服務器實時保持同步狀態。 4.有出錯處理機制,經過失敗隊列對出錯的文件從新同步,若是仍舊失敗,則按設定時長對同步失敗的文件從新同步。 5. 自帶crontab功能,只需在xml配置文件中開啓,便可按您的要求,隔一段時間總體同步一次。無需再額外配置crontab功能。
ip | 目錄 | 角色 |
---|---|---|
192.168.1.2 | /home/work | 同步機 |
192.168.1.3 | /home/work | 被同步機 |
基於Centos6 ,使用 sersync + rsync 將 192.168.1.2 的 /home/work 目錄實時同步到 192.168.1.3 的 /home/work 目錄下。php
192.168.1.3 被同步機操做css
yum install rsync -y
vim /etc/rsyncd.conflinux
log file = /var/log/rsyncd.log #日誌文件 pidfile = /var/run/rsyncd.pid #pid 文件 lock file = /var/run/rsync.lock #鎖文件 secrets file = /etc/rsync.pass #認證文件 max connections = 0 # 鏈接數限制,0即不限制 [dubbo] # 模塊名 path = /home/work # 同步目錄 comment = dubbo # 註釋,要與模塊名一致 uid = root #設置rsync運行權限 gid = root port = 873 use chroot = no read only = no list = no timeout = 600 auth users = xx # 認證用戶 hosts allow =192.168.1.2 # 容許同步的機器 hosts deny = 0.0.0.0/32
vim /etc/rsync.passc++
xx:abc123 #對應rsyncd.conf 的 auth users
設置文件權限shell
chmod 600 /etc/rsyncd.conf chmod 600 /etc/rsync.pass
啓動express
rsync --daemon
192.168.1.2 同步端操做vim
yum install rsync -y rsync --daemon echo "abc123" > /etc/passwd.txt chmod 600 /etc/passwd.txt
sersync
如下解釋下配置文件tomcat
<?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> <host hostip="localhost" port="8008"></host> <debug start="false"/> #是否開啓debug模式,默認未開啓 <fileSystem xfs="false"/> # 文件系統是xfs的要開啓才能正常工做 <filter start="true"> #是否開啓文件過濾,以下幾種類型能夠根據本身須要進行修改。 <exclude expression="(.*)\.out"></exclude> #過濾.out文件,如tomcat的catalina.out,微服務的nohup.out <exclude expression="(.*)\.gz"></exclude> #過濾.gz文件 <exclude expression="^logs/*"></exclude> #過濾logs目錄,如tomcat的logs目錄 <exclude expression="^static/*"></exclude> #同上解釋 </filter> <inotify> # 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="/home/work/"> # 要同步的目錄 <remote ip="192.168.1.3" name="dubbo"/> # 要同步的服務器,及rsyncd.conf 模塊名 <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> # 這裏使用的是 rsync daemon 去同步,而不是ssh,因此要指定 passwordfile文件 <commonParams params="-artuz"/> <auth start="true" users="xx" passwordfile="/etc/passwd.txt"/> <userDefinedPort start="false" port="874"/><!-- port=874 --> <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="false"/> </rsync> <failLog path="/tmp/rsync_fail_log.log" timeToExecute="60"/><!--default every 60mins execute once--> # 同步錯誤日誌 <crontab start="true" schedule="600"><!--600mins--> #是否開啓全盤同步。 <crontabfilter start="false"> #若是開啓了全盤同步,這裏也要開啓,並設置與上面一致的過濾類型。 <exclude expression="*(.*)\.out"></exclude> <exclude expression="^logs/*"></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>
執行同步bash
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
監控腳本
vim /home/check_sersync.sh服務器
#!/bin/bash sersync="/usr/local/sersync/sersync2" confxml="/usr/local/sersync/confxml.xml" status=$(ps aux|grep 'sersync2'|grep -v grep|wc -l) if [[ $status -eq 0 ]]; then $sersync -d -r -o $confxml & else exit 0; fi
添加執行權限
chmod +x /home/check_sersync.sh
設置定時任務
crontab -e
每隔兩分鐘執行一次 */2 * * * * /bin/bash /home/check_sersync.sh > /dev/null 2>&1
Lysncd 其實是lua語言封裝了 inotify 和 rsync 工具,採用了 Linux 內核(2.6.13 及之後)裏的 inotify 觸發機制,而後經過rsync去差別同步,達到實時的效果。我認爲它最使人稱道的特性是,完美解決了 inotify + rsync海量文件同步帶來的文件頻繁發送文件列表的問題 —— 經過時間延遲或累計觸發事件次數實現。另外,它的配置方式很簡單,lua自己就是一種配置語言,可讀性很是強。lsyncd也有多種工做模式能夠選擇,本地目錄cp,本地目錄rsync,遠程目錄rsyncssh。
這個比sersync設置簡單些。
被控制端與如上一致。
同步機設置以下:
yum install lsyncd -y
vim /etc/lsyncd.conf
settings { logfile = "/tmp/lsyncd.log", #日誌 statusFile = "/tmp/lsyncd.status", #記錄同步的文件和目錄 pidfile = "/var/run/lsyncd.pid", statusInterval = 1, #將lsyncd的狀態寫入上面的statusFile的間隔,默認10秒 nodaemon = false, inotifyMode = "CloseWrite", #指定inotify監控的事件,默認是CloseWrite,還能夠是Modify或CloseWrite or Modify maxProcesses = 1, #同步進程的最大個數 maxDelays = 1, #累計到多少所監控的事件激活一次同步,即便後面的delay延遲時間還未到 } sync { default.rsync, source = "/home/work/", delete = true, target = "xx@192.168.1.3::dubbo", # 認證用戶,被同步的服務器,同步的模塊名 -- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst", #要同步的文件或目錄列表,我測試lsyncd過濾並很差用,不清楚是哪裏的問題。 rsync = { binary = "/usr/bin/rsync", archive = true, compress = false, owner = true, perms = true, whole_file = false, password_file = "/etc/passwd.txt" } }
啓動即同步
/etc/init.d/lsyncd start
我我的測試