Linux Redhat / CentOS使用rsync和inotify進行實時內容複製分發和同步

在小型規模的網站下,我們一般使用單一台伺服器來處理所有請求,但當一台伺服器已經不夠應付所有請求時,我們會想到建立多台伺服器形成一個叢集來處理更多請求。但有了多台伺服器後,我們又怎樣處理網站儲存到伺服器的檔案呢?

一開始的時候我們一般可以使用NFS等共用檔案系統來幫助在多台伺服器之間共用檔案,但是在這種機制下,不論是效能還是可用性,都無法達到更高流量和請求的要求,而共用檔案系統本身就有著不強調擴充的特質。若果網站的請求有爆發性的增長,共用檔案系統無疑是處理請求上限的瓶頸。

對於大規模網站的檔案儲存和存取,我們就需要將檔案分散複製到多台伺服器,讓網站的處理請求能力提高。經過複製後,每一台的網站伺服器就可以直接讀取本機磁碟的檔案來反應給使用者的請求,這樣就可以解決共用檔案系統單點效能的存取瓶頸了。

所以本文是介紹在Linux Redhat / CentOS系統上,使用rsync和inotify這兩個開源軟件來進行複製分發和同步檔案,當我們對一台伺服器進行如建立、修改或刪除等等操作時,就會觸發同步處理。

但在較大規模的網站中,如果我們將檔案從一台伺服器複製到大量伺服器上,亦會產生一些不好的問題,例如:

  1. 目標伺服器過多,分發過程持續過長時間,容易造成一部份目標伺服器有較的的內容更新延遲。
  2. 檔案伺服器也需要消耗大量系統資源進行分發工作,影響檔案伺服器本身的運作。

所以在這種情況下,另一種做法是進行多級分發,多級分發是指一台檔案伺服器複製到多台伺服器下,再由第二層的多台伺服器複製到第三層更大量的伺服器下。

話不多說,以下是安裝軟件與設置流程:

  1. 使用指令查看作業系統版本
    cat /etc/redhat-release
  2. 使用指令檢查是否支援使用inotify,有文件夾代表支援
    ls -al /proc/sys/fs/inotify
  3. 下載 epel-release
    https://fedoraproject.org/wiki/EPEL
  4. 使用指令安裝inotify軟件
    yum install inotify-tools
  5. 使用SSH執行rsync,檔案伺服器需要配置免密碼連接目標伺服器,使用指令配置
    ssh-copy-id username@IP
  6. 編寫複製流程的Shell Script腳本,把腳本放在/etc/init.d/,並更改腳本為可執行權限
    vim /etc/init.d/rsyncd
    chmod 755 /etc/init.d/rsyncd
  7. 使用指令將腳本加入到開機啓動
    echo /etc/init.d/rsyncd >> /etc/rc.local

腳本如下:

#!/bin/bash
monitor () {
    src=$1
    des1=$2
    ip1=192.168.2.15 
    user=vagrant
    cd ${src}
    /usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,delete,create,move,attrib $src | while read file
    do
        INO_EVENT=$(echo $file | awk '{print $1}')
        INO_FILE=$(echo $file | awk '{print $2}')
        if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]
        then
            rsync -avzcR -e ssh $(dirname ${INO_FILE}) ${user}@${ip1}:${des}
        fi

        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
        then
            rsync -avzR --delete -e ssh $(dirname ${INO_FILE}) ${user}@${ip1}:${des}
        fi

        if [[ $INO_EVENT =~ 'ATTRIB' ]]
        then
            if [ ! -d "$INO_FILE" ]
            then
                rsync -avzcR -e ssh $(dirname ${INO_FILE}) ${user}@${ip1}:${des}
            fi
        fi
    done
}

src=/home/vagrant/rsync_inotify/
des1=/home/vagrant/rsync_inotify

monitor $src $des1

 

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

*

驗證碼 * Time limit is exhausted. Please reload CAPTCHA.

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料