1. 程式人生 > >關於解決多臺伺服器間的檔案實時同步問題

關於解決多臺伺服器間的檔案實時同步問題

      最近要做一個相關的解決方案,在虛擬機器測試沒有問題。給大家分享出來,有更好的解決方案,歡迎討論。

1.1 inotify相關介紹

     1、rsync

       與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支援增量備份等優點,通過rsync可以解決對實時性要求不高的資料備份需求,例如定期的備份檔案伺服器資料到遠端伺服器,對本地磁碟定期做資料映象等。
隨著應用系統規模的不斷擴大,對資料的安全性和可靠性也提出的更好的要求,rsync在高階業務系統中也逐漸暴露出了很多不足,首先,rsync同步資料 時,需要掃描所有檔案後進行比對,進行差量傳輸。如果檔案數量達到了百萬甚至千萬量級,掃描所有檔案將是非常耗時的。而且正在發生變化的往往是其中很少的 一部分,這是非常低效的方式。其次,rsync不能實時的去監測、同步資料,雖然它可以通過linux守護程序的方式進行觸發同步,但是兩次觸發動作一定 會有時間差,這樣就導致了服務端和客戶端資料可能出現不一致,無法在應用故障時完全的恢復資料。基於以上原因,rsync+inotify組合出現了!

    2、inotify

        Inotify 是一種強大的、細粒度的、非同步的檔案系統事件監控機制,linux核心從2.6.13起,加入了Inotify支援,通過Inotify可以監控檔案系統 中新增、刪除,修改、移動等各種細微事件,利用這個核心介面,第三方軟體就可以監控檔案系統下檔案的各種變化情況,而inotify-tools就是這樣 的一個第三方軟體。
在上面章節中,我們講到,rsync可以實現觸發式的檔案同步,但是通過crontab守護程序方式進行觸發,同步的資料和實際資料會有差異,而inotify可以監控檔案系統的各種變化,當檔案有任何變動時,就觸發rsync同步,這樣剛好解決了同步資料的實時性問題。

1.2 rsync+inotify同步邏輯圖

1.3 環境部署

  1、下載所需的安裝包:

        先把兩個包放在/usr/src/下。

 2、第一臺伺服器(192.168.188.90)配置(不分主次):

    a、安裝rsync:

[[email protected] ~]# cd /usr/src/ 
[[email protected] src]# tar zxvf rsync-3.0.9.tar.gz 
[[email protected] src]# cd rsync-3.0.9 
[[email protected] rsync-3.0.9]# ./configure --prefix=/usr/local/rsync 
[
[email protected]
rsync-3.0.9]# make [[email protected] rsync-3.0.9]# make install
    b、建立密碼認證檔案:
[[email protected] rsync-3.0.9]# cd /usr/local/rsync/
[[email protected] rsync]# echo "rsync-pwd" >/usr/local/rsync/rsync1.passwd
    c、給密碼檔案賦予600許可權:
[[email protected] rsync]# chmod 600 rsync1.passwd
    d、安裝inotify:
[[email protected] rsync]# cd /usr/src/ 
[[email protected] src]# tar zxvf inotify-tools-3.14.tar.gz 
[[email protected] src]# cd inotify-tools-3.14 
[[email protected] inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify 
[[email protected] inotify-tools-3.14]# make 
[[email protected] inotify-tools-3.14]# make install
    e、建立監控指令碼:
#!/bin/bash 
host=192.168.188.89
src=/root/test/    
des=web 
user=webuser 
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \ 
| while read files 
do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync1.passwd $src [email protected]$host::$des 
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1 
done
注意:host為第二臺伺服器IP,src為要監控的路徑,web是認證模組名稱,最後把監控指令碼命名為rsync1.sh放在要監控的路徑下。此處應是/root/test/

     f、給監控指令碼賦予764許可權:

[[email protected] tmp]# chmod 764 rsync1.sh
     g、建立rsync配置檔案:
uid = root 
gid = root 
use chroot = no 
max connections = 10 
strict modes = yes
pid file = /var/run/rsyncd.pid 
lock file = /var/run/rsync.lock 
log file = /var/log/rsyncd.log 
[web] 
path = /root/test/
comment = web file
ignore errors 
read only = no 
write only = no 
hosts allow = 192.168.188.89 
hosts deny = * 
list = false
uid = root 
gid = root 
auth users = webuser 
secrets file = /usr/local/rsync/rsync1.passwd

該配置檔案是用來接收另一臺伺服器的檔案。其中web是server服務端(90伺服器)的認證模組名稱,需要與90伺服器裡的一致。把配置檔案命名為rsync1.conf,放到/usr/local/rsync/目錄裡

     h、啟動該配置檔案
[[email protected] rsync]# /usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync1.conf
    需要開機啟動的話:
[[email protected] rsync]# echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync1.conf" >> /etc/rc.local
3、第二臺伺服器(192.168.188.89)配置(不分主次)

     a、安裝rsync:

[[email protected] ~]# cd /usr/src/ 
[[email protected] src]# tar zxvf rsync-3.0.9.tar.gz 
[[email protected] src]# cd rsync-3.0.9 
[[email protected] rsync-3.0.9]# ./configure --prefix=/usr/local/rsync 
[[email protected] rsync-3.0.9]# make 
[[email protected] rsync-3.0.9]# make install
    b、建立密碼認證檔案:
[[email protected] rsync-3.0.9]# cd /usr/local/rsync/
[[email protected] rsync]# echo "rsync-pwd" >/usr/local/rsync/rsync2.passwd 
    c、給密碼檔案賦予600許可權:
[[email protected] rsync]# chmod 600 rsync2.passwd 
    d、安裝inotify:
[[email protected] rsync]# cd /usr/src/ 
[[email protected] src]# tar zxvf inotify-tools-3.14.tar.gz 
[[email protected] src]# cd inotify-tools-3.14 
[[email protected] inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify 
[[email protected] inotify-tools-3.14]# make 
[[email protected] inotify-tools-3.14]# make install
    e、建立監控指令碼:
#!/bin/bash 
host=192.168.188.90
src=/root/test/    
des=web 
user=webuser 
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \ 
| while read files 
do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync2.passwd $src [email protected]$host::$des 
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1 
done
注意:host為第二臺伺服器IP,src為要監控的路徑,web是認證模組名稱,最後把監控指令碼命名為rsync2.sh放在要監控的路徑下。此處應是/root/test/

     f、給監控指令碼賦予764許可權:

[[email protected] tmp]# chmod 764 rsync2.sh
     g、建立rsync配置檔案:
uid = root 
gid = root 
use chroot = no 
max connections = 10 
strict modes = yes
pid file = /var/run/rsyncd.pid 
lock file = /var/run/rsync.lock 
log file = /var/log/rsyncd.log 
[web] 
path = /root/test/
comment = web file
ignore errors 
read only = no 
write only = no 
hosts allow = 192.168.188.90 
hosts deny = * 
list = false
uid = root 
gid = root 
auth users = webuser 
secrets file = /usr/local/rsync/rsync2.passwd

該配置檔案是用來接收另一臺伺服器的檔案。其中web是server服務端(90伺服器)的認證模組名稱,需要與90伺服器裡的一致。把配置檔案命名為rsync2.conf,放到/usr/local/rsync/目錄裡

     h、啟動該配置檔案
[[email protected] rsync]# /usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync2.conf
  需要開機啟動的話:
[[email protected] rsync]# echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync2.conf" >> /etc/rc.local

  4、最後啟動兩臺伺服器的監控指令碼:

    a、在90伺服器: 

[[email protected] tmp]# sh /root/test/rsync1.sh &
    需要開機啟動的話:
[[email protected] tmp]# echo "/root/test/rsync1.sh" >> /etc/rc.local
    b、在89伺服器:
[[email protected] tmp]# sh /root/test/rsync2.sh &
需要開機啟動的話:
[[email protected] tmp]# echo "/root/test/rsync2.sh" >> /etc/rc.local 
  
1.4測試

            任意在其中一臺伺服器/root/test/路徑下,新增一個檔案,你會發現另一臺伺服器也同步了該檔案。

       同步之後,兩臺伺服器下都會有rsync1.sh和rsync2.sh監控指令碼,注意勿刪!

       如果需要3臺或3臺以上的伺服器之間進行同步,則需要更改shell指令碼,方法類似。

 (如果有任何問題,歡迎評論。轉載請標明出處!謝謝配合。)    

  Author---BlackHan



相關推薦

關於解決伺服器檔案實時同步問題

      最近要做一個相關的解決方案,在虛擬機器測試沒有問題。給大家分享出來,有更好的解決方案,歡迎討論。 1.1 inotify相關介紹      1、rsync        與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支援增量備份等優點,通

Linux伺服器檔案實時同步的實現

使用場景 現有伺服器A和伺服器B,如果伺服器A的指定目錄(例如 /home/paul/rsync/ )中的內容發生變更(增刪改和屬性變更),實時將這些變更同步到伺服器B的目標目錄中(例如 /home/paul/rsync/ )。 資料映象備份工具Rsync Rsy

如何實現Linux伺服器檔案雙向同步

Linux系統間檔案雙向同步搭建Unison版  一、Unison簡介  Unison是Windows、Linux以及其他Unix平臺下都可以使用的檔案同步工具,它能使兩個資料夾(本地或網路上的)保持內容的一致。Unison擁有與其它一些同步工具或檔案系統的相同的特性,但也有自身的特點:  1.跨平臺

Linux伺服器SSH免密碼登入配置

SSH實現各個伺服器間的檔案相互備份,如執行scp命令,可以實現免密碼登入,從而可以使用SHELL指令碼實現一些自動化的處理。 假如A機要免密碼登入B機,具體方法如下: 1、在A機執行:"ssh-keygen -t rsa" 命令,建立公鑰資訊 #ssh-keygen

centos6.5 rsync+inotify實現伺服器之間檔案實時同步

1. rsync的優點與不足 與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支援增量備份等優點,通過rsync可以解決對實時性要求不高的資料備份需求,例如定期的備份檔案伺服器資料到遠端伺服器,對本地磁碟定期做資料映象等。 隨著應用系統規模的不斷擴大,對資料的安全性和可靠性也提出的更好的

rsync+inotify實現伺服器之間檔案實時同步

之前做了“ssh信任與scp自動傳輸指令碼”的技術文件,此方案是作為公司裡備份的方法,但在實際的執行中,由於主伺服器在給備份伺服器傳輸的時候,我們的主伺服器需要備份的檔案是實時、不停的產生的,造成不知道主伺服器給備份伺服器傳輸了多少檔案,磁碟空間就那麼大,做備份的原因:一個是為了保持檔案,另外一個是解決主伺

伺服器無密碼訪問

多臺伺服器相互無密碼訪問,與兩臺伺服器單向無密碼訪問的原理是一樣的,只不過由於是多臺伺服器之間相互無密碼訪問,不能象兩臺伺服器無密碼登入那樣直接上傳,步驟如下: 1、在每臺伺服器上都執行ssh-keygen -t rsa生成金鑰對: #ssh-keyge

關於解決linux伺服器檔案實時同步問題

  最近要做一個相關的解決方案,在虛擬機器測試沒有問題。給大家分享出來,有更好的解決方案,歡迎討論。 1.1 inotify相關介紹      1、rsync        與傳統的cp、ta

linux下rsync+inotify實現兩伺服器檔案實時同步

假設兩個伺服器: 192.168.0.1 源伺服器  有目錄 /opt/test/ 192.168.0.2 目標伺服器  有目錄 /opt/bak/test/ 實現的目的就是保持這兩個伺服器某個檔案目錄保持實時同步 實現方式: 通過rsync+inotify-too

【Windows】Windows伺服器之間實現檔案實時同步

Windows伺服器之間實現檔案實時同步? 做公安專案,要實現內外網檔案同步,需要用到同步工具。有一個工具叫 “前置機”。 前置機的原理不是很清楚,應該是通過地址對映過去,然後跟公安內網某個內網IP伺

伺服器架構inotify+rsync檔案實時同步

釋出伺服器上下載 wget https://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz 在程式碼釋出伺服器上安裝inotify,執行如下命令 tar xzvf inotify-tools-3.14.t

伺服器檔案分發指令碼和命令執行指令碼

背景:基於hadoop的分散式部署 (具體請看文章),為了方便檔案的分發與命令的執行,顧編制此指令碼 伺服器配置四臺:(h101    192.168.44.101)(h102    192.168.44.102)(h103    19

伺服器之間如何讓sqlserver,mysql資料庫進行資料同步?

伺服器儲存視訊,頻寬不夠用,想用多臺伺服器,如何讓所有伺服器之間視訊實時同步,可以用什麼軟體!當企業租用伺服器,但是在資料同步的時候,又有著嚴格的要求,要求資料達到一致,在科技發達的今天,這又該如何做到了?下面天下資料為大家介紹多臺伺服器之間讓資料同步的方法! 1、採用高可用sureHA軟體映象型,一臺

mysql伺服器資料同步

這兩天在搞MySQL 資料同步問題,這配置很繁瑣。我這裡用了兩臺機子做測試, 都是我本地的機子.分別是 主伺服器 192.168.0.118 從伺服器 192.168.0.187 1. 首先在 主從伺服器分別建立資料庫 backup_db和backup_table

基於shell實現向伺服器拷貝hosts檔案

寫這個指令碼的目的是在生產環境中向多個伺服器拷貝hosts檔案,能滿足自己的使用要求。 github: https://github.com/charnet1019/auto-scp-files.git 注意: 需要安裝expect #!/bin/bash ####

【甘道夫】拷貝檔案伺服器的Shell指令碼

在多機叢集環境中,經常面臨修改配置檔案後拷貝到多臺伺服器的情況,傳統的執行scp比較麻煩,所以寫了以下shell指令碼,可以將指定檔案拷貝到多臺機器。 使用方法請參見HELP部分程式碼。 #!/bin/bash help() { cat << HEL

shell-scp分發資料夾下所有檔案伺服器

#!/usr/bin/expect -f #chmod 777 distribute_file.sh #把所有目的ip寫入ipfile.txt檔案,ipfile.txt檔案與distribute_fil

C#使用互斥量(Mutex)實現進程並發操作時進程線程同步操作(進程同步)

互斥 空字符 示例 logfile format ror var mutex類 www 本文主要是實現操作系統級別的多進程間線程同步(進程同步)的示例代碼及測試結果。代碼經過測試,可供參考,也可直接使用。 承接上一篇博客的業務場景[C#使用讀寫鎖三行代碼簡單解決多線程並發

Linux主機配置SSH免密登陸

包含 生成 目錄 apt 裏的 html .cn 密碼 查看 1.安裝ssh. sudo apt-get install ssh. 安裝完成後會在~目錄(當前用戶主目錄,即這裏的/home/xuhui)下產生一個隱藏文件夾.ssh(ls -a 可以查看隱藏文件)。如果沒有

服務器文件同步實現

創建目錄 zed error host 屬組 殺死 dup comm read 一、rsync特性 可以鏡像保存整個目錄樹和文件系統。 可以很容易做到保持原來文件的權限、時間、軟硬鏈接等等。 無須特殊權限即可安裝。 快速:第一次同步時rsync會復制全部內容,但在下