linux服务器之间的文件同步(双向同步unison+inotify)
在日常的運維工作中,需要保證文件的高可用性,以防單點帶來的文件丟失。 根據場景不同,一般會有單向和雙向同步兩種方式。
1、雙向同步:unison+inotify 用于啟動切換的場景
2、單向同步:rsync+inotify ?用于手工恢復的場景
大多數情況下,都用單向同步即可,如果有問題的話,運維認為手工恢復即可; 如果對恢復的實時性要求不叫高的話,可以用雙向同步,出問題的時候,讓系統自動切換先用起來,然后再人工維護,不影響正常使用。
我們來演示一下雙向同步環境的搭建和配置。
1 Unison簡介
Unison是Windows、Linux以及其他Unix平臺下都可以使用的文件同步工具,它能使兩個文件夾(本地或網絡上的)保持內容的一致。Unison擁有與其它一些同步工具或文件系統的相同的特性,但也有自身的特點:
a.跨平臺使用;
b.對內核和用戶權限沒有特別要求;
c.Unison是雙向的,它能自動處理兩分拷貝中更新沒有沖突的部分,有沖突的部分將會顯示出來讓用戶選擇更新策略;
d.只要是能連通的兩臺主機,就可以運行unison,可以直接使用socket連接或安全的ssh連接方式,對帶寬的要求不高,使用類似rsync的壓縮傳輸協議。
示例環境:兩臺centos7的環境
vm1 192.168.1.110
vm2 192.168.1.111
2、編譯并安裝Unison
Linux下通過源碼包編譯安裝Unison時,需要用到Objective Caml compiler。
2.1 編譯和安裝ocaml
[root@vm1 ~]# wget http://caml.inria.fr/pub/distrib/ocaml-4.02/ocaml-4.02.0.tar.gz? [root@vm1 ~]# tar -xzvf ocaml-4.02.0.tar.gz [root@vm1 ~]# cd ocaml-4.02.0 [root@vm1 ocaml-4.02.0]# ./configure [root@vm1 ocaml-4.02.0]# make world opt [root@vm1 ocaml-4.02.0]# make install2.2 編譯安裝Unison
[root@vm1 ~]# wget ftp://133.31.130.35/pub/pkgsrc/distfiles/unison-2.48.3.tar.gz [root@vm1 ~]# tar -xzvf unison-2.48.3.tar.gz [root@vm1 ~]# cd unison-2.48.3 [root@vm1 unison-2.48.3]# make UISTYLE=text [root@vm1 unison-2.48.3]# make install2.3 copy unsion到/usr/local/bin
[root@vm1 unison-2.48.3]# cp unison /usr/local/bin3 配置ssh的無密碼登錄
3.3.1 同步ssh-keygen生成ssh登錄安全密鑰對(兩臺機器上分別執行)
ssh-keygen -t rsa一路回車到結束
這里將生成一對密鑰,id_rsa(私鑰文件)和id_rsa.pub(公鑰文件),保存在 ~/.ssh/目錄下
3.2 copy公鑰并授權
將id_rsa.pub(公鑰)文件的內容,copy到另外一臺服務器的authorized_keys 文件中,完成授權
# vm1 上執行 cat ~/id_rsa.pub # 獲取內容,然后copy# vm2 的執行黏貼 vi ~/.ssh/authorized_keys# vm2 文件授權 chmod 700 .ssh chmod 600 ~/.ssh/authorized_keys# vm2 重啟SSH服務 [root@vm1 ~]# service sshd restart# vm2 測試: ssh root@vm1同樣的反向操作,相互授權一下。
4 設置同步腳本
示例這里是同步兩臺機器的nfs文件夾
vm1 上的腳本(unsion.sh)
#/bin/sh UNISON=`ps -ef |grep -v grep|grep -c inotifywait` if [ ${UNISON} -lt 1 ] thenother_server="192.168.1.110"src1="/home/nfs/"dst2="/home/nfs/"/usr/bin/inotifywait -mrq -e create,delete,delete_self,modify,move $src1 | while read line; do/usr/bin/unison $src1 ssh://$other_server/$dst2echo -n "$line " >> /var/log/inotify.logecho `date | cut -d " " -f1-4` >> /var/log/inotify.logdone fivm2 上的腳本(unsion.sh)
#/bin/sh UNISON=`ps -ef |grep -v grep|grep -c inotifywait` if [ ${UNISON} -lt 1 ] thenother_server="192.168.1.111"src1="/home/nfs/"dst2="/home/nfs/"/usr/bin/inotifywait -mrq -e create,delete,delete_self,modify,move $src1 | while read line; do/usr/bin/unison $src1 ssh://$other_server/$dst2echo -n "$line " >> /var/log/inotify.logecho `date | cut -d " " -f1-4` >> /var/log/inotify.logdone fi然后執行兩個腳本,則實現雙向同步。
5 定時檢查同步任務(以防進程死掉)
[unison@localhost ~]# crontab -e # vm1 * * * * * nohup unsion.sh > /dev/null 2>&1 &# vm2 * * * * * nohup unsion.sh > /dev/null 2>&1 &總結
以上是生活随笔為你收集整理的linux服务器之间的文件同步(双向同步unison+inotify)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flask上传图片解决方案
- 下一篇: 英文歌曲推荐(lady gaga\Tay