Linux unison 效率,linux inotify+unison双向同步环境部署
最近做的一個項目,項目上線 ,代碼部署在,做了LVS負載均衡的兩臺web服務器,那么問題來了,怎么樣保證兩臺服務器的代碼文件和資源文件實時同步呢?
在liux下做文件同步,通常有如下幾種方式:
1、nfs實現web數據共享
nfs能實現數據同步是通過NAS(網絡附加存儲),在服務器上共享一個文件,且服務器需要設置文件系統的權限和配置文件設置的權限,權限兩者之間取交集,然后客戶端把共享的文件掛載到本地,客戶端對文件有讀寫權限,則實現數據的同步,nfs-utils提供nfs服務.
2、rsync +inotify實現web數據同步
可以鏡像保存整個目錄樹和文件系統
可以同步增量同步數據,文件傳輸效率高,因而同步時間很短
可以保持原有文件的權限、時間等屬性
加密傳輸數據,保證了數據的安全性
支持匿名傳輸
rsync也能實現同步,但是需要自己手動的去同步數據,當數據量非常的頻繁時,無疑是加大了運維人員的工作,inotify是一種強大的、細粒度的、異步的文件系統事件監控機制,inotify-tools工具的出現,解決了這種工作,安裝inotify軟件的主機會監聽服務器端的主機是否數據和本機不一樣,(因為在上傳數據時,運維人員先上傳到安裝inotify主機上),不一樣就用rsync命令直接把數據傳輸過去。客戶端安裝rsync軟件是為了調用rsync的命令,安裝inotify軟件是監聽和數據是否發生改變,服務器端安裝rsync軟件時為了提供rsync服務。
3、rsync+sersync更快更節約資源實現web數據同步
sersync是使用c++編寫,而且對linux系統文件系統產生的臨時文件和重復的文件操作進行過濾,所以在結合rsync同步的時候,節省了運行時耗和網絡資源。因此更快。
sersync配置起來很簡單,其中bin目錄下已經有基本上靜態編譯的2進制文件,配合bin目錄下的xml配置文件直接使用即可。
sersync使用多線程進行同步,尤其在同步較大文件時,能夠保證多個服務器實時保持同步狀態。
sersync有出錯處理機制,通過失敗隊列對出錯的文件重新同步,如果仍舊失敗,則按設定時長對同步失敗的文件重新同步。
sersync自帶crontab功能,只需在xml配置文件中開啟,即可按您的要求,隔一段時間整體同步一次。無需再額外配置crontab功能。
4、unison+inotify實現web數據雙向同步
Unison是一款跨平臺的文件同步對象,不僅支撐本地對本地同步,也支撐經由過程SSH、RSH和Socket等收集和談進行同步。Unison支撐雙向同步操縱,你既可以從A同步到B,也可以從B同步到A,這些都不須要額外的設定
只有第四種方案支持雙向實時同步,且當其中一臺服務器宕機,也不會影響web的訪問。
環境部署,有如下兩臺服務器需要做雙向同步:
192.168.10.1是server1
192.168.10.2是server2
第一步,配置ssh key信任,保證兩臺服務器之間可以通過ssh無密碼訪問
在server1上創建key并配置server2的信任
ssh-keygen -t rsa
在提示保存私鑰(key)和公鑰(public key)的位置時,使用默認值;
在提示是否需要私鑰密碼(passphrase)時,直接敲回車,即不使用私鑰密碼。
之后,將生成一對密鑰,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服務
service sshd restart #server1
service sshd restart #server2
分別在兩臺機器上執行如下測試
ssh -p 22 192.168.10.1 date
ssh -p 22 192.168.10.2 date
第一次驗證需要輸入登陸用戶官,如果接著看到直接輸出系統時間,至此用戶授權完成.
第二,兩個服務器都編譯安裝這三個源碼包
安裝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表示使用命令行方式,加入線程支持以靜態模式編譯
如果出現類似/usr/bin/ld: cannot find -lxxx ?報錯提示. 你得先安裝擴展:
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服務器上執行這個命令,來查看兩臺服務器之間是否可以同步文件,unison -batch /home/server1/ ssh://192.168.10.2//home/server2
touch a.log /home/server1/
第三步,創建.sh腳本來執行同步
1)server1上創建腳本/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上創建腳本/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
分別在后臺進行監聽執行,進行實時同步處理.
nohup /root/inotify.sh &
ps -ef | grep inofity
如果能打印到inotify進程. 至此,雙向實時同步工作完成.
相關注解如下:
force表示會以本地所指定文件夾為標準,將該目錄同步到遠端。這里需要注意,如果指定了force參數,那么Unison就變成了單項同步了,也就是說會以force指定的文件夾為準進行同步,類似與rsync。
Unison雙向同步基本原理是:假如有A B兩個文件夾,A文件夾把自己的改動同步到B,B文件夾也把自己的改動同步到A,最后A B兩文件夾的內容相同,是AB文件夾的合集。
Unison雙向同步的一個缺點是,對于一個文件在兩個同步文件夾中都被修改時,unison是不會去同步的,因為unison無法判斷以那個為準。
ignore = Path表示忽略指定目錄,即同步時不同步它。
batch = true,表示全自動模式,接受缺省動作,并執行。
-fastcheck true 表示同步時僅通過文件的創建時間來比較,如果選項為false,Unison則將比較兩地文件的內容。
log = true 表示在終端輸出運行信息。
logfile 指定輸出的log文件。
另外,Unison有很多參數,這里僅介紹常用的幾個,詳細的請參看Unison手冊。
-auto //接受缺省的動作,然后等待用戶確認是否執行。
-batch //batch mode, 全自動模式,接受缺省動作,并執行。
-ignore xxx //增加 xxx 到忽略列表中
-ignorecase [true|false|default] //是否忽略文件名大小寫
-follow xxx //是否支持對符號連接指向內容的同步
owner = true //保持同步過來的文件屬主
group = true //保持同步過來的文件組信息
perms = -1 //保持同步過來的文件讀寫權限
repeat = 1 //間隔1秒后,開始新的一次同步檢查
retry = 3 //失敗重試
sshargs = -C //使用ssh的壓縮傳輸方式
xferbycopying = true”
-immutable xxx //不變目錄,掃描時可以忽略
-silent //安靜模式
-times //同步修改時間
-path xxx 參數 //只同步 -path 參數指定的子目錄以及文件,而非整個目錄,-path 可以多次出現。
PS:unison配置文件默認位于當前用戶下的.unison目錄,默認的配置文件名是default.prf。
最 近做的一個項目,項目上線 ,代碼部署在,做了LVS負載均衡的兩臺web服務器,那么問題來了,怎么樣保證兩臺服務器的代碼文件和資源文件實時同步呢?
總結
以上是生活随笔為你收集整理的Linux unison 效率,linux inotify+unison双向同步环境部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么 scala无法导入 scala.
- 下一篇: linux开机自动执行脚本、运行程序