超實用!!rsync分散式 + inotify監控實時同步

2020-10-25 17:00:37

一、rsync同步簡介

.一款快速增量備份工具

  • Remote Sync,遠端同步
  • 支援本地複製,或者與其他SSH、rsync主機同步
  • 官方網站: http://rsync.samba.org

1. 軟體簡介

  • Rsync 是一個遠端資料同步工具,可通過 LAN/WAN 快速同步多臺主機間的檔案。
  • Rsync 本來是用以取代scp 的一個工具,它當前由 Rsync.samba.org 維護。
  • Rsync 使用所謂的「Rsync 演演演算法」來使本地和遠端兩個主機之間的檔案達到同步,這個演演算法只傳送兩個檔案的不同部分,而不是每次都整份傳送,因此速度相當快。
  • 執行 Rsync server 的機器也叫 backup server,一個 Rsync server 可同時備份多個 client 的資料;也可以多個Rsync server 備份一個 client 的資料。

2. Rsync原理

  • Rsync 可以使用 daemon 模式。Rsync server 會開啟一個873的服務通道(port),等待對方 Rsync 連線。
  • 連線時,Rsync server 會檢查口令是否相符,若通過口令查核,則可以開始進行檔案傳輸。
  • 第一次連通完成時,會把整份檔案傳輸一次,下一次就只傳送二個檔案之間不同的部份。

Rsync 支援大多數的類 Unix 系統,CentOS7.0圖形介面安裝基本已經安裝了Rsync軟體,可以用yum安裝

3. Rsync 的基本特點如下:

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

4.rsync命令的用法

格式:rsync [選項] 原始位置 目標位置 常用選項

選項用途
-a歸檔模式,遞迴並保留物件屬性,等同於-rlptgoD
-V顯示同步過程的詳細(verbose)資訊
-z在傳輸檔案時進行壓縮(compress)-H:保留硬連線檔案
-A保留ACL屬性資訊
–delete刪除目標位置有而原始位置沒有的檔案
–checksum根據物件的校驗和來決定是否跳過檔案

5.同步源的兩種方法

格式1: rsync [選項] 使用者名稱@主機地址::共用模組名 目標位置
格式2: rsync [選項] rsync://使用者名稱@主機地址/共用模組名 目標位置

二、設定Rsync伺服器

Rsync同步源(指備份操作的遠端伺服器,也稱為備份源)
在這裡插入圖片描述

1.基本思路

  • 建立rsyncd.conf組態檔、獨立的賬號檔案
  • 啟用rsync的–daemon模式
    daemon守護行程的作用是時該服務即使沒有請求服務,服務的埠號任然開放。
    應用範例
  • 使用者backuper,允許下行同步
  • 操作的目錄為/var/www/html/

實驗步驟

  1. 組態檔/etc/rsyncd.conf
  2. 設定rsync賬號檔案
  3. 啟動rsync服務
  4. 到另一臺伺服器驗證

【伺服器1(rsync源端)設定】

1.修改rsync組態檔

[root@oracle ~]# vi /etc/rsyncd.conf
uid = nobody   ##主賬號為匿名
gid = nobody   ##組賬號匿名
use chroot = yes   ##家目錄鎖定,鎖定家目錄後無法使用cd命令進入其他目錄
address = 192.168.10.10   ##本地rsync源端地址
max connections = 4     ##最大連線數為4
pid file = /var/run/rsyncd.pid  ##pid檔案位置
log file = /var/log/rsyncd.log   ##紀錄檔檔案位置
port = 873     ##監聽埠873
hosts allow = 192.168.10.0/24     ##允許存取的網段

[wwwroot]     ##共用模組的名稱
path = /var/www/html   ##共用目錄
comment = ww.bai.com   ##描述資訊,自定義
read only = yes    ##唯讀模式
auth users = backuper    ##授權的虛擬使用者為backuper(不需要系統建立)
secrets file = /etc/rsyncd_user.db   ##認證密碼存放檔案
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2    ##不進行壓縮的檔案格式型別

2.編輯使用者記錄檔案並啟動rsync

[root@oracle ~]# vi /etc/rsyncd_user.db  ##編寫使用者資料檔案
backuper:abc123   ##每一行為一個使用者記錄,格式為——使用者名稱:密碼
[root@oracle ~]# chmod 600 /etc/rsyncd_user.db   ## 600許可權,不允許其他使用者讀取
[root@oracle ~]# rsync --daemon ##啟動守護行程
[root@oracle ~]# netstat -anupt |grep 873   ##檢視埠狀態
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      12109/rsync         
tcp6       0      0 :::873                  :::*                    LISTEN      12109/rsync        

3.共用目錄下建立檔案測試

[root@oracle html]# vi abc
abc
[root@oracle html]# cat abc 
this abc

【伺服器2(發起端)】

1.到發起端測試,檢視 /var/www/html目錄下檔案

[root@squid ~]# cd /var/www/html
[root@squid html]# ls    ##檢視不到檔案,為空
[root@squid html]# 

2.和伺服器1(源端)進行rsync同步

[root@squid html]# rsync -avz rsync://backuper@192.168.10.10/wwwroot /var/www/html
##rsync -avz backuper@192.168.10.10::wwwroot /var/www/html ###該命令效果一樣
Password:    ##輸入密碼
receiving incremental file list
./
abc
sent 46 bytes  received 118 bytes  36.44 bytes/sec
total size is 9  speedup is 0.05
[root@squid html]# ls    ##在此檢視,發現源端的檔案同步到發起端了
abc

3.設定免互動

[root@squid html]# rm -rf abc      ##先刪除abc檔案,方便測試
[root@squid html]# ls
[root@squid html]# 
[root@squid html]# vi /etc/server.password    ##編寫免互動密碼存放檔案
abc123                      ##寫入rsync指定的虛擬使用者backuper的密碼
[root@squid html]# chmod 600 /etc/server.password          ##同樣設定600許可權,只允許主人檢視
[root@squid html]# vi /etc/server.password
[root@squid html]# rsync -az --delete --password-file=/etc/server.password backuper@192.168.10.10::wwwroot /var/www/html     ##免互動同步,--delete會刪除本端與源端檔名不相同的檔案,--password-file指定存放密碼的檔案位置
[root@squid html]# ls
abc
[root@squid html]# cat abc   ##同步成功
this abc

4.可指定週期性計劃任務,定時同步

[root@oracle ~]# crontab -e   ##設定每晚10點執行同步
*/30 22 * * *  rsync -az --delete --password-file=/etc/server.password backuper@192.168.10.10::wwwroot /var/www/html
[root@oracle ~]# crontab -l
*/30 22 * * *  rsync -az --delete --password-file=/etc/server.password backuper@192.168.10.10::wwwroot /var/www/html

三、rsync+inotify實時同步

單靠rsync結合週期計劃任務有很大的侷限性,不能實時的更新,因此產生inotify這款軟體來解決這個瓶頸

1.rsync實時同步

  1. 定期同步的不足
    ◆ 執行備份的時間固定,延遲明顯、實時性差
    ◆ 當同步源長期不變化時,密集的定期任務是不必要的
  2. 實時同步的優點
    ◆ 一旦同步源出現變化,立即啟動備份
    ◆ 只要同步源無變化,則不執行備份

2.關於inotify

  • Linux核心的inotify機制
    ◆ 從版本2.6.13開始提供
    ◆ 可以監控檔案系統的變動情況,並做出通知
    ◆ 響應輔助軟體: inotify-tools

在這裡插入圖片描述

3.實驗設計

安裝inotify-tools輔助工具

inotifywait:用於持續監控,實時輸出結果
inotifywatch:用於短期監控,任務完成後再出結果

需要兩臺伺服器:伺服器1(rsync源端)、伺服器2(inotify端)

  1. 調整inotify需要的核心引數
  2. 安裝inotify軟體
  3. 修改上述實驗中rsync伺服器1端中組態檔引數:read only = no
  4. 調整兩臺伺服器共用目錄html的許可權為777
  5. 使用inotify內建命令進行測試
  6. 編輯實時監控指令碼
  7. 驗證指令碼可用性

rsync分散式+inotify實時監控,實現實時同步

【伺服器2(inotify端)】

1.修改核心引數

[root@oracle ~]# vi /etc/sysctl.conf 
fs.inotify.max_queued_events = 16384     
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
[root@oracle ~]# sysctl -p   ##生效
fs.inotify.max_queued_events = 16384    ##監控事件的佇列大小
fs.inotify.max_user_instances = 1024     ##監控的最大範例數
fs.inotify.max_user_watches = 1048576   ##每個範例被監控的最大檔案數

2. 安裝inotify軟體

[root@oracle ~]# ls    ##檢視inotify軟體包
 inotify-tools-3.14.tar.gz 
[root@oracle inotify-tools-3.14]# yum -y install gcc gcc-c++ make  ##安裝環境
[root@oracle ~]# tar zxvf inotify-tools-3.14.tar.gz -C /opt/   ##解壓軟體包
[root@oracle ~]# cd /opt/inotify-tools-3.14/
[root@oracle inotify-tools-3.14]# ./configure   ##直接設定
[root@oracle inotify-tools-3.14]# make && make install   ##安裝軟體
[root@oracle ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html  &  ##後臺執行監控

3.測試監控

[root@oracle ~]# cd /var/www/html   ##進入html目錄建立檔案
[root@oracle html]# touch test.txt     ##建立檔案
[root@oracle ~]# 
/var/www/html/ CREATE test.txt   ##這裡後臺會有監控提示,建立了test.txt檔案
[root@oracle html]# rm -rf test.txt    ## 刪除test.txt檔案
[root@oracle ~]# 
/var/www/html/ CREATE test.txt
/var/www/html/ DELETE test.txt    ##後臺出現新的提示,刪除了test.txt檔案

4.設定監控指令碼

[root@oracle opt]# vim /opt/inotify.sh  ##編寫監控指令碼
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,move,attrib,delete /var/www/html/"
RSYNC_CMD="rsync -az --delete --password-file=/etc/server.password /var/www/html/ backuper@192.168.10.10::wwwroot/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
  do
    if [ $(pgrep rsync | wc -l) -le 0 ]
    then
      $RSYNC_CMD
    fi
done

5.調整共用目錄html的許可權為777

[root@oracle opt]# chmod +x inotify.sh    ##給執行許可權
[root@oracle opt]# chmod 777 /var/www/html/    ##給/var/www/html最高許可權,可供讀寫
[root@oracle opt]# ll /var/www/
total 0
drwxrwxrwx. 2 root root 17 Oct 23 22:13 html

【伺服器1(rsync源端)】

### 1.修改/etc/rsyncd.conf中[wwwroot]共用模組設定
[root@oracle opt]# vi /etc/rsyncd.conf 
……省略部分
[wwwroot]
path = /var/www/html
comment = ww.bai.com
read only = no  ##將這裡的yes改為no,需要能寫
……省略部分

2.調整共用目錄html的許可權為777

[root@squid html]# chmod 777 /var/www/html    ##同樣給與最高許可權
[root@squid html]# ll /var/www/
drwxrwxrwx   2 root  root    17 Oct 23 19:16 html

3.關閉rsync程序,生效設定

[root@oracle ~]# netstat -anupt |grep 873
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      12109/rsync         
[root@oracle ~]# pkill -9 rsync     ##關閉程序,重新啟動生效
[root@oracle ~]# netstat -anupt |grep rsync  ##程序關閉了
[root@oracle ~]# rsync --daemon    ##啟動守護行程
 error:failed to create pid file /var/run/rsyncd.pid: File exists  ##會提示報錯,pid檔案存在
[root@oracle ~]# rm -rf /var/run/rsyncd.pid   ##刪除pid檔案即可
[root@oracle ~]# rsync --daemon  ##再次啟動守護行程

驗證

1.首先在兩臺伺服器共用目錄插入不同檔案,造成不同步現象

【伺服器1(rsync源端)】

[root@oracle ~]# cd /var/www/html/
[root@oracle html]# touch test.txt
[root@oracle html]# ls
test.txt
[root@oracle html]# 

【伺服器2(inotify端)】

[root@squid ~]# cd /var/www/html/
[root@squid html]# touch abc.txt
[root@squid html]# ls
abc.txt
[root@squid html]# 

兩臺伺服器共用目錄內檔案不一致

2.執行指令碼,進行驗證

【伺服器2(inotify端)】

[root@squid opt]# ./inotify.sh &   ##後臺執行指令碼
[1] 10901
[root@squid opt]# cd /var/www/html/
[root@squid html]# touch 123.txt    ##在共用目錄中新增新的檔案
[root@squid html]# rsync: failed to set times on "/." (in wwwroot): Operation not permitted (1)
rsync: chgrp "/.123.txt.BUNMxZ" (in wwwroot) failed: Operation not permitted (1)
rsync: chgrp "/.abc.txt.cVZqbR" (in wwwroot) failed: Operation not permitted (1)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
rsync: failed to set times on "/." (in wwwroot): Operation not permitted (1)
rsync: chgrp "/.123.txt.wa4qcd" (in wwwroot) failed: Operation not permitted (1)
rsync: chgrp "/.abc.txt.33vNF5" (in wwwroot) failed: Operation not permitted (1)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
 ###注意,這裡的failed提示並不是同步失敗,而是因為rsync伺服器那一端修改了read only = no的引數,rsync程式預設是yes,因此會提示失敗,實際上並不影響

【伺服器1(rsync源端)】

[root@oracle html]# ls     ##原本的test.txt檔案被刪除,新增了inotify端的檔案,完全一致狀態
123.txt  abc.txt