Linux 伺服器如何實現資料同步?

Linksla發表於2023-11-09

一、簡介

1 認識

Rsync(remote synchronize)是一個遠端資料同步工具,可透過LAN/WAN快速同步多臺主機間的檔案。Rsync使用所謂的“Rsync演演算法”來使本地和遠 程兩個主機之間的檔案達到同步,這個演演算法只傳送兩個檔案的不同部分,而不是每次都整份傳送,因此速度相當快;Rsync支援大多數的類Unix系統,無論是Linux、Solaris還是BSD上都經過了良好的測試;此外,它在windows平臺下也有相應的版本,如cwRsync和Sync2NAS等工具。

2 原理

Rsync本來是用於替代rcp的一個工具,目前由rsync.samba.org維護,所以rsync.conf檔案的格式類似於samba的主配 置檔案;

Rsync可以透過rsh或ssh使用,也能以daemon模式去執行 在以daemon方式執行時Rsync server會開啟一個873 埠,等待客戶端去連線。

連線時,Rsync server會檢查口令是否相符,若透過口令查核,則可以開始進行檔案傳輸。第一次連通完成時,會把整份檔案傳輸一次,以後則就只需進行增量備份。

3 特點

  • 可以映象儲存整個目錄樹和檔案系統;
  • 可以很容易做到保持原來檔案的許可權、時間、軟硬連結等;
  • 無須特殊許可權即可安裝;
  • 最佳化的流程,檔案傳輸效率高;
  • 可以使用rsh、ssh等方式來傳輸檔案,當然也可以透過直接的socket連線;
  • 支援匿名傳輸

二、ssh模式

1 本地間同步

環境:172.16.22.12



# mkdir src

# touch src/{1,2,3,4}
# mkdir dest
# rsync -av src/ dest/ --將 src 目錄裡的所有的檔案同步至 dest 目錄(不包含src本身)
# rsync -av src dest/ --將 src 目錄包括自己整個同步至 dest 目錄
# rsync -avR src/ dest/ --即使 src 後面接有 / ,效果同上

2、區域網間同步

環境:172.16.22.11



# mkdir src

# touch src/{a,b,c,d}
# mkdir dest
# rsync -av 172.16.22.12:/data/test/src/ dest/ --遠端同步至本地,需輸入root密碼
# rsync -av src/ 172.16.22.12:/data/test/dest/ --本地檔案同步至遠端
# rsync -av src 172.16.22.12:/data/test/dest/ --整個目錄同步過去
# rm -rf src/d --刪除一個檔案 d
# rsync -av --delete src/ 172.16.22.12:/data/test/dest/ --delete,從目標目錄裡面刪除無關的檔案

3、區域網指定使用者同步

—172.16.22.12



# useradd george

# passwd george
# mkdir /home/george/test
# touch /home/george/test/g{1,2,3,4}
—172.16.22.11

# rsync -av src '-e ssh -l george' 172.16.22.12:/home/george --本地同步至遠端
# rsync -av 172.16.22.12:/home/george/test/g* '-e ssh -l george -p 22' dest/

三、daemon模式

環境:192.168.22.11

1、服務啟動方式

1.1、對於負荷較重的 rsync 伺服器應該使用獨立執行方式



# yum install rsync xinetd --服務安裝

# /usr/bin/rsync --daemon
1.2、對於負荷較輕的 rsync 伺服器可以使用 xinetd 執行方式
# yum install rsync xinetd --服務安裝
# vim /etc/xinetd.d/rsync --配置託管服務,將下項改為 no
disable = no
# /etc/init.d/xinetd start --啟動託管服務 xinetd
# chkconfig rsync on
# netstat -ntpl | grep 873 --檢視服務是否啟動

2、配置詳解

兩種 rsync 服務執行方式都需要配置 rsyncd.conf,其格式類似於 samba 的主配置檔案

全域性引數

  • 在全域性引數部分也可以定義模組引數,這時該引數的值就是所有模組的預設值
  • address —在獨立執行時,用於指定的伺服器執行的 IP 地址;由 xinetd 執行時將忽略此引數,使用命令列上的 –address 選項替代。預設本地所有IP
  • port —指定 rsync 守護程式監聽的埠號。由 xinetd 執行時將忽略此引數,使用命令列上的 –port 選項替代。預設 873
  • motd file —指定一個訊息檔案,當客戶連線伺服器時該檔案的內容顯示給客戶
  • pid file —rsync 的守護程式將其 PID 寫入指定的檔案
  • log file —指定 rsync 守護程式的日誌檔案,而不將日誌傳送給 syslog
  • syslog facility —指定 rsync 傳送日誌訊息給 syslog 時的訊息級別
  • socket options —指定自定義 TCP 選項
  • lockfile —指定rsync的鎖檔案存放路徑
  • timeout = 600 —超時時間

模組引數

模組引數主要用於定義 rsync 伺服器哪個目錄要被同步。模組宣告的格式必須為 [module] 形式,這個名字就是在 rsync 客戶端看到的名字,類似於 Samba 伺服器提供的共享名。而伺服器真正同步的資料是透過 path 來指定的

基本模組引數

  • path —指定當前模組在 rsync 伺服器上的同步路徑,該引數是必須指定的

  • comment —給模組指定一個描述,該描述連同模組名在客戶連線得到模組列表時顯示給客戶

模組控制引數

  • use chroot = —預設為 true,在傳輸檔案之前首先 chroot 到 path 引數所指定的目錄下;優點,安全;缺點,需要 root 許可權,不能備份指向 path 外部的符號連線所指向的目錄檔案

  • uid = —指定該模組以指定的 UID 傳輸檔案;預設nobody

  • gid = —指定該模組以指定的 GID 傳輸檔案;預設nobody

  • max connections —最大併發連線數,0為不限制

  • lock file —指定支援 max connections 引數的鎖檔案。預設 /var/run/rsyncd.lock

  • list —指定當客戶請求列出可以使用的模組列表時,該模組是否應該被列出。預設為 true,顯示

  • read >

  • write >

  • ignore errors —忽略IO錯誤。預設true

  • ignore nonreadable —指定 rysnc伺服器完全忽略那些使用者沒有訪問許可權的檔案。這對於在需要備份的目錄中有些不應該被備份者獲得的檔案時是有意義的。false

  • timeout = —該選項可以覆蓋客戶指定的 IP 超時時間。從而確保 rsync 伺服器不會永遠等待一個崩潰的客戶端。對於匿名 rsync 伺服器來說,理想的數字是 600(單位為秒)。0 (未限制)

  • dont compress —用來指定那些在傳輸之前不進行壓縮處理的檔案。該選項可以定義一些不允許客戶對該模組使用的命令選項列表。必須使用選項全名,而不能是簡稱。當發生拒絕某個選項的情況時,伺服器將報告錯誤資訊然後退出。例如,要防止使用壓縮,應該是:”dont compress = ”。.gz .tgz .zip .z .rpm .deb .iso .bz2 .tbz

模組檔案篩選引數

  • exclude —指定多個由空格隔開的多個檔案或目錄(相對路徑),並將其新增到 exclude 列表中。這等同於在客戶端命令中使用 –exclude 來指定模式

  • exclude from —指定一個包含 exclude 規則定義的檔名,伺服器從該檔案中讀取 exclude 列表定義

  • include —指定多個由空格隔開的多個檔案或目錄(相對路徑),並將其新增到 include 列表中。這等同於在客戶端命令中使用 –include 來指定模式

  • include from —指定一個包含 include 規則定義的檔名,伺服器從該檔案中讀取 include 列表定義

模組使用者認證引數

auth users —指定由空格或逗號分隔的使用者名稱列表,只有這些使用者才允許連線該模組(和系統使用者沒有任何關係)。使用者名稱和口令以明文方式存放在 secrets file 引數指定的檔案中。預設為匿名方式 secrets file —指定一個 rsync 認證口令檔案。只有在 auth users 被定義時,該檔案才起作用。檔案許可權必須是 600 strict modes —指定是否監測口令檔案的許可權。為 true 則口令檔案只能被 rsync 伺服器執行身份的使用者訪問,其他任何使用者不可以訪問該檔案。預設為true

模組訪問控制引數

  • hosts allow —用一個主機列表指定哪些主機客戶允許連線該模組。不匹配主機列表的主機將被拒絕。預設值為 *
  • hosts deny —用一個主機列表指定哪些主機客戶不允許連線該模組

模組日誌引數

  • transfer logging —使 rsync 伺服器將傳輸操作記錄到傳輸日誌檔案。預設值為false

  • log format —指定傳輸日誌檔案的欄位。預設為:”%o %h [%a] %m (%u) %f %l” 設定了”log file”引數時,在日誌每行的開始會新增”%t [%p]“;可以使用的日誌格式定義符如下所示:

    • %o —操作型別:”send” 或 “recv”
    • %h —遠端主機名
    • %a —遠端IP地址
    • %m —模組名
    • %u —證的使用者名稱(匿名時是 null)
    • %f —檔名
    • %l —檔案長度字元數
    • %p —該次 rsync 會話的 PID
    • %P —模組路徑
    • %t —當前時間
    • %b —實際傳輸的位元組數
    • %c —當傳送檔案時,記錄該檔案的校驗碼

3、服務端配置



# vim /etc/rsyncd.conf --為 rsyncd 服務編輯配置檔案,預設沒有,需自己編輯

  • uid = root —rsync執行許可權為root

  • gid = root —rsync執行許可權為root

  • use chroot = no —是否讓程式離開工作目錄

  • max connections = 5 —最大併發連線數,0為不限制

  • timeout = 600 —超時時間

  • pid file = /var/run/rsyncd.pid —指定rsync的pid存放路徑

  • lockfile = /var/run/rsyncd.lock —指定rsync的鎖檔案存放路徑

  • log file = /var/log/rsyncd.log —指定rsync的日誌存放路徑

  • [web1] —模組名稱
    path = /data/test/src —該模組存放檔案的基礎路徑
    ignore errors = yes —忽略一些無關的I/O錯誤
    read —客戶端可以上傳
    write —客戶端可以下載
    hosts allow = 192.168.22.12 —允許連線的客戶端主機ip
    hosts deny = —黑名單,表示任何主機
    list = yes
    auth users = web —認證此模組的使用者名稱
    secrets file = /etc/web.passwd —指定存放“使用者名稱:密碼”格式的檔案



# mkdir /data/test/src --建立基礎目錄

# mkdir /data/test/src/george --再建立一個目錄
# touch /data/test/src/{1,2,3}
# echo "web:123" > /etc/web.passwd --建立密碼檔案
# chmod 600 /etc/web.passwd
# service xinetd restart

四、測試

1、客戶端

環境:192.168.22.12



# yum -y install rsync

# mkdir /data/test

2、小試引數



# rsync -avzP web@192.168.22.11::web1 /data/test/ --輸入密碼 123;將伺服器 web1 模組裡的檔案同步至 /data/test,引數說明:

-a —引數,相當於-rlptgoD,
-r —是遞迴
-l —是連結檔案,意思是複製連結檔案
-i —列出 rsync 伺服器中的檔案
-p —表示保持檔案原有許可權
-t —保持檔案原有時間
-g —保持檔案原有使用者組
-o —保持檔案原有屬主
-D —相當於塊裝置檔案
-z —傳輸時壓縮
-P —傳輸進度
-v —傳輸時的進度等資訊,和-P有點關係



# rsync -avzP --delete web@192.168.22.11::web1 /data/test/ --讓客戶端與伺服器保持完全一致, --delete

# rsync -avzP --delete /data/test/ web@192.168.22.11::web1 --上傳客戶端檔案至服務端
# rsync -avzP --delete /data/test/ web@192.168.22.11::web1/george --上傳客戶端檔案至服務端的 george 目錄
# rsync -ir --password-file=/tmp/rsync.password web@192.168.22.11::web1 --遞迴列出服務端 web1 模組的檔案
# rsync -avzP --exclude="*3*" --password-file=/tmp/rsync.password web@192.168.22.11::web1 /data/test/ --同步除了路徑以及檔名中包含 “3” *的所有檔案

3、透過密碼檔案同步



# echo "123"> /tmp/rsync.password

# chmod 600 /tmp/rsync.password
# rsync -avzP --delete --password-file=/tmp/rsync.password web@192.168.22.11::web1 /data/test/ --呼叫密碼檔案

4、客戶端自動同步



# crontab -e

10 0 * rsync -avzP —delete —password-file=/tmp/rsync.password web@192.168.22.11::web1 /data/ test/


# crontab -l

五、資料實時同步

環境:Rsync + Inotify-tools

1、inotify-tools

  • 是為linux下 inotify檔案監控工具提供的一套c的開發介面庫函式,同時還提供了一系列的命令列工具,這些工具可以用來監控檔案系統的事件

  • inotify-tools是用c編寫的,除了要求核心支援 inotify 外,不依賴於其他

  • inotify-tools提供兩種工具:一是inotifywait,它是用來監控檔案或目錄的變化,二是inotifywatch,它是用來統計檔案系統訪問的次數

2、安裝inotify-tools

下載地址:



# yum install –y gcc --安裝依賴

# mkdir /usr/local/inotify
# tar -xf inotify-tools-3.14.tar.gz
# cd inotify-tools-3.14
# ./configure --prefix=/usr/local/inotify/
# make && make install

3、設定環境變數



# vim /root/.bash_profile

export PATH=/usr/ local/inotify/bin/: $PATH

# source /root/.bash_profile
# echo '/usr/local/inotify/lib' >> /etc/ld.so.conf --載入庫檔案
# ldconfig
# ln -s /usr/local/inotify/include /usr/include/inotify

4、常用引數

  • -m —始終保持監聽狀態,預設觸發事件即退出

  • -r —遞迴查詢目錄

  • -q —列印出監控事件

  • -e —定義監控的事件,可用引數:

  • access —訪問檔案

  • modify —修改檔案

  • attrib —屬性變更

  • open —開啟檔案

  • delete —刪除檔案

  • create —新建檔案

  • move —檔案移動

  • —fromfile —從檔案讀取需要監視的檔案或者排除的檔案,一個檔案一行,排除的檔案以@開頭

  • —timefmt —時間格式

  • —format —輸出格式

  • —exclude —正則匹配需要排除的檔案,大小寫敏感

  • —excludei —正則匹配需要排除的檔案,忽略大小寫

  • %y%m%d %H%M —年月日時鐘

  • %T%w%f%e —時間路徑檔名狀態

5、測試一

檢測源目錄中是否有如下動作:modify,create,move,delete,attrib;

一旦發生則釋出至目標機器;

方式為 ssh

src: 192.168.22.11(Rsync + Inotify-tools) dest: 192.168.22.12

兩臺機器需要做好 ssh 免密登入


    
# mdkir /data/test/dest/ --dest機器

     # mdkir /data/test/src/ --src機器
     # rsync -av --delete /data/test/src/ 192.168.22.12:/data/test/dest --測試下命令
     # vim /data/test/test.sh
     #!/bin/bash
/usr/ local/inotify/bin/inotifywait -mrq -e modify,create,move,delete,attrib /data/ test/src |  while  read events
do
rsync -a --delete /data/ test/src/ 192.168.22.12:/data/ test/dest
echo  "`date +'%F %T'` 出現事件: $events" >> /tmp/rsync.log 2>&1
done
     # chmod 755 /data/test/test.sh
     # /data/test/test.sh &
     # echo '/data/test/test.sh &' >> /etc/rc.local --設定開機自啟

我們可以在目標機上也寫一個這樣的指令碼:


rsync -a —delete /data/
test/dest/ 192.168.22.11:/data/
test/src ;

這樣可以實現雙向同步。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70013542/viewspace-2993682/,如需轉載,請註明出處,否則將追究法律責任。

相關文章