Linux unison 效率,linux inotify+unison双向同步环境部署
最近做的一個(gè)項(xiàng)目,項(xiàng)目上線 ,代碼部署在,做了LVS負(fù)載均衡的兩臺web服務(wù)器,那么問題來了,怎么樣保證兩臺服務(wù)器的代碼文件和資源文件實(shí)時(shí)同步呢?
在liux下做文件同步,通常有如下幾種方式:
1、nfs實(shí)現(xiàn)web數(shù)據(jù)共享
nfs能實(shí)現(xiàn)數(shù)據(jù)同步是通過NAS(網(wǎng)絡(luò)附加存儲),在服務(wù)器上共享一個(gè)文件,且服務(wù)器需要設(shè)置文件系統(tǒng)的權(quán)限和配置文件設(shè)置的權(quán)限,權(quán)限兩者之間取交集,然后客戶端把共享的文件掛載到本地,客戶端對文件有讀寫權(quán)限,則實(shí)現(xiàn)數(shù)據(jù)的同步,nfs-utils提供nfs服務(wù).
2、rsync +inotify實(shí)現(xiàn)web數(shù)據(jù)同步
可以鏡像保存整個(gè)目錄樹和文件系統(tǒng)
可以同步增量同步數(shù)據(jù),文件傳輸效率高,因而同步時(shí)間很短
可以保持原有文件的權(quán)限、時(shí)間等屬性
加密傳輸數(shù)據(jù),保證了數(shù)據(jù)的安全性
支持匿名傳輸
rsync也能實(shí)現(xiàn)同步,但是需要自己手動的去同步數(shù)據(jù),當(dāng)數(shù)據(jù)量非常的頻繁時(shí),無疑是加大了運(yùn)維人員的工作,inotify是一種強(qiáng)大的、細(xì)粒度的、異步的文件系統(tǒng)事件監(jiān)控機(jī)制,inotify-tools工具的出現(xiàn),解決了這種工作,安裝inotify軟件的主機(jī)會監(jiān)聽服務(wù)器端的主機(jī)是否數(shù)據(jù)和本機(jī)不一樣,(因?yàn)樵谏蟼鲾?shù)據(jù)時(shí),運(yùn)維人員先上傳到安裝inotify主機(jī)上),不一樣就用rsync命令直接把數(shù)據(jù)傳輸過去??蛻舳税惭brsync軟件是為了調(diào)用rsync的命令,安裝inotify軟件是監(jiān)聽和數(shù)據(jù)是否發(fā)生改變,服務(wù)器端安裝rsync軟件時(shí)為了提供rsync服務(wù)。
3、rsync+sersync更快更節(jié)約資源實(shí)現(xiàn)web數(shù)據(jù)同步
sersync是使用c++編寫,而且對linux系統(tǒng)文件系統(tǒng)產(chǎn)生的臨時(shí)文件和重復(fù)的文件操作進(jìn)行過濾,所以在結(jié)合rsync同步的時(shí)候,節(jié)省了運(yùn)行時(shí)耗和網(wǎng)絡(luò)資源。因此更快。
sersync配置起來很簡單,其中bin目錄下已經(jīng)有基本上靜態(tài)編譯的2進(jìn)制文件,配合bin目錄下的xml配置文件直接使用即可。
sersync使用多線程進(jìn)行同步,尤其在同步較大文件時(shí),能夠保證多個(gè)服務(wù)器實(shí)時(shí)保持同步狀態(tài)。
sersync有出錯(cuò)處理機(jī)制,通過失敗隊(duì)列對出錯(cuò)的文件重新同步,如果仍舊失敗,則按設(shè)定時(shí)長對同步失敗的文件重新同步。
sersync自帶crontab功能,只需在xml配置文件中開啟,即可按您的要求,隔一段時(shí)間整體同步一次。無需再額外配置crontab功能。
4、unison+inotify實(shí)現(xiàn)web數(shù)據(jù)雙向同步
Unison是一款跨平臺的文件同步對象,不僅支撐本地對本地同步,也支撐經(jīng)由過程SSH、RSH和Socket等收集和談進(jìn)行同步。Unison支撐雙向同步操縱,你既可以從A同步到B,也可以從B同步到A,這些都不須要額外的設(shè)定
只有第四種方案支持雙向?qū)崟r(shí)同步,且當(dāng)其中一臺服務(wù)器宕機(jī),也不會影響web的訪問。
環(huán)境部署,有如下兩臺服務(wù)器需要做雙向同步:
192.168.10.1是server1
192.168.10.2是server2
第一步,配置ssh key信任,保證兩臺服務(wù)器之間可以通過ssh無密碼訪問
在server1上創(chuàng)建key并配置server2的信任
ssh-keygen -t rsa
在提示保存私鑰(key)和公鑰(public key)的位置時(shí),使用默認(rèn)值;
在提示是否需要私鑰密碼(passphrase)時(shí),直接敲回車,即不使用私鑰密碼。
之后,將生成一對密鑰,id_rsa(私鑰文件)和id_rsa.pub(公鑰文件),保存在/root/.ssh/目錄下
cd ~/.ssh
ssh "-p 22" 192.168.10.1 cat /root/.ssh/id_rsa.pub >> authorized_keys
ssh "-p 22" 192.168.10.2 cat /root/.ssh/id_rsa.pub >> authorized_keys
scp ?-P 22 authorized_keys 192.168.10.2:/root/.ssh/
#分別在server1和server2上操作.
chmod 600 /root/.ssh/authorized_keys
#重啟sshd服務(wù)
service sshd restart #server1
service sshd restart #server2
分別在兩臺機(jī)器上執(zhí)行如下測試
ssh -p 22 192.168.10.1 date
ssh -p 22 192.168.10.2 date
第一次驗(yàn)證需要輸入登陸用戶官,如果接著看到直接輸出系統(tǒng)時(shí)間,至此用戶授權(quán)完成.
第二,兩個(gè)服務(wù)器都編譯安裝這三個(gè)源碼包
安裝ocaml,版本至少為3.07或更高 下載地址:http://caml.inria.fr/pub/distrib/ocaml-3.10/
tar xf ocaml-3.10.2.tar.gz
cd ocaml-3.10.2
./configure
make world opt
make install
cd ..
安裝unison
下載地址:http://www.seas.upenn.edu/~bcpierce/unison//download/releases/unison-2.13.16/
tar xvf unison-2.13.16.tar.gz
cd unison-2.13.16
make UISTYLE=text THREADS=true STATIC=true
cp unison /usr/local/bin
cd ..
#UISTYLE=text THREADS=true STATIC=true表示使用命令行方式,加入線程支持以靜態(tài)模式編譯
如果出現(xiàn)類似/usr/bin/ld: cannot find -lxxx ?報(bào)錯(cuò)提示. 你得先安裝擴(kuò)展:
yum install glibc-static
安裝inotify 下載地址:http://inotify-tools.sourceforge.net
tar xvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make
make install
cd ..
到此所需的軟件都已安裝完畢,可以在server1服務(wù)器上執(zhí)行這個(gè)命令,來查看兩臺服務(wù)器之間是否可以同步文件,unison -batch /home/server1/ ssh://192.168.10.2//home/server2
touch a.log /home/server1/
第三步,創(chuàng)建.sh腳本來執(zhí)行同步
1)server1上創(chuàng)建腳本/root/inotify.sh(chmod a+x /root/inotify.sh):
#/bin/bash
ip2="192.168.10.2"
src2="/home/server1/"
dst2="/home/server2/"
/usr/local/bin/inotifywait -mrq -e create,delete,modify,move $src2 | while read line; do
/usr/local/bin/unison -batch $src2 ssh://$ip2/$dst2
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done
1)server2上創(chuàng)建腳本/root/inotify.sh(chmod a+x /root/inotify.sh):
#/bin/bash
ip1="192.168.10.1"
src1="/home/server2/"
dst1="/home/server1/"
/usr/local/bin/inotifywait -mrq -e create,delete,modify,move $src1 | while read line; do
/usr/local/bin/unison -batch $src1 ssh://$ip1/$dst1
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done
分別在后臺進(jìn)行監(jiān)聽執(zhí)行,進(jìn)行實(shí)時(shí)同步處理.
nohup /root/inotify.sh &
ps -ef | grep inofity
如果能打印到inotify進(jìn)程. 至此,雙向?qū)崟r(shí)同步工作完成.
相關(guān)注解如下:
force表示會以本地所指定文件夾為標(biāo)準(zhǔn),將該目錄同步到遠(yuǎn)端。這里需要注意,如果指定了force參數(shù),那么Unison就變成了單項(xiàng)同步了,也就是說會以force指定的文件夾為準(zhǔn)進(jìn)行同步,類似與rsync。
Unison雙向同步基本原理是:假如有A B兩個(gè)文件夾,A文件夾把自己的改動同步到B,B文件夾也把自己的改動同步到A,最后A B兩文件夾的內(nèi)容相同,是AB文件夾的合集。
Unison雙向同步的一個(gè)缺點(diǎn)是,對于一個(gè)文件在兩個(gè)同步文件夾中都被修改時(shí),unison是不會去同步的,因?yàn)閡nison無法判斷以那個(gè)為準(zhǔn)。
ignore = Path表示忽略指定目錄,即同步時(shí)不同步它。
batch = true,表示全自動模式,接受缺省動作,并執(zhí)行。
-fastcheck true 表示同步時(shí)僅通過文件的創(chuàng)建時(shí)間來比較,如果選項(xiàng)為false,Unison則將比較兩地文件的內(nèi)容。
log = true 表示在終端輸出運(yùn)行信息。
logfile 指定輸出的log文件。
另外,Unison有很多參數(shù),這里僅介紹常用的幾個(gè),詳細(xì)的請參看Unison手冊。
-auto //接受缺省的動作,然后等待用戶確認(rèn)是否執(zhí)行。
-batch //batch mode, 全自動模式,接受缺省動作,并執(zhí)行。
-ignore xxx //增加 xxx 到忽略列表中
-ignorecase [true|false|default] //是否忽略文件名大小寫
-follow xxx //是否支持對符號連接指向內(nèi)容的同步
owner = true //保持同步過來的文件屬主
group = true //保持同步過來的文件組信息
perms = -1 //保持同步過來的文件讀寫權(quán)限
repeat = 1 //間隔1秒后,開始新的一次同步檢查
retry = 3 //失敗重試
sshargs = -C //使用ssh的壓縮傳輸方式
xferbycopying = true”
-immutable xxx //不變目錄,掃描時(shí)可以忽略
-silent //安靜模式
-times //同步修改時(shí)間
-path xxx 參數(shù) //只同步 -path 參數(shù)指定的子目錄以及文件,而非整個(gè)目錄,-path 可以多次出現(xiàn)。
PS:unison配置文件默認(rèn)位于當(dāng)前用戶下的.unison目錄,默認(rèn)的配置文件名是default.prf。
最 近做的一個(gè)項(xiàng)目,項(xiàng)目上線 ,代碼部署在,做了LVS負(fù)載均衡的兩臺web服務(wù)器,那么問題來了,怎么樣保證兩臺服務(wù)器的代碼文件和資源文件實(shí)時(shí)同步呢?
總結(jié)
以上是生活随笔為你收集整理的Linux unison 效率,linux inotify+unison双向同步环境部署的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么 scala无法导入 scala.
- 下一篇: mysql存储视频_特殊格式文件(视频、