19 張圖詳解 Rsync 遠程同步

一、rsync 介紹

從字面意思上,rsync 可以理解爲 remote sync(遠程同步),但它不僅可以遠程同步數據(類似於 scp 命令),還可以本地同步數據(類似於 cp 命令)。不同於 cp 或 scp 的一點是,使用 rsync 命令備份數據時,不會直接覆蓋以前的數據(如果數據已經存在),而是先判斷已經存在的數據和新數據的差異,只有數據不同時纔會把不相同的部分覆蓋。

1.1 rsync 簡介

rsync(Remote Sync,遠程同步)是一個開源的快速備份工具,可以在不同主機之間鏡像同步整個目錄樹,支持增量備份,並保持鏈接和權限,且採用優化的同步算法,傳輸前執行壓縮,因此非常適用於異地備份、鏡像服務器等應用。

rsync 的官方站點的網址是

rsync.samba.org/

目前最新版本是 3.1.3,由 Wayne Davison 進行維護。作爲一種最常用的文件備份工具,rsync 往往是 Linux 和 UNIX 系統默 認安裝的基本組件之一。

1.2 rsync 特性

支持拷貝特殊文件,如連接文件、設備等。

可以有排除指定文件或目錄同步的功能,相當於打包命令 tar 的排除功能。

可以做到保持原文件或目錄的權限、時間、軟硬鏈接、屬主、組等所有屬性均不改變 –p。

可以實現增量同步,既只同步發生變化的數據,因此數據傳輸效率很高(tar-N)。

可以使用 rcp、rsh、ssh 等方式來配合傳輸文件(rsync 本身不對數據加密)。

可以通過 socket(進程方式)傳輸文件和數據(服務端和客戶端)。

支持匿名的活認證(無需系統用戶)的進程模式傳輸,可以實現方便安全的進行數據備份和鏡像。

二、rsync 同步源服務器

在遠程同步任務中,負責發起 rsync 同步操作的客戶機稱爲發起端,而負責響應來自客戶機的 rsync 同步操作的服務器稱爲同步源。

如果想查看 async 提供的所有選項,可直接執行 async 命令。

三、配置 rsync 下行同步(定時同步)

源服務器:192.168.132.6

客戶機(發起端):192.168.132.7

3.1 配置源服務器

 systemctl stop firewalld
 setenforce 0
 
 rpm -q rsync      #一般系統已默認安裝rsync
 
 #建立/etc/rsyncd.conf配置文件
 vim /etc/rsyncd.conf           #添加以下配置項
 uid = root
 gid = root
 use chroot = yes              #禁錮在源目錄
 address = 192.168.132.6       #監聽地址
 port = 873            #監聽端口tcp/udp 873,可通過cat /etc/services | grep rsync查看
 log file = /var/1og/rsyncd.1og     #日誌文件位置
 pid file = /var run/rsyncd.pid     #存放進程ID的文件位置
 hosts allow = 192.168.132.6      #允許訪問的客戶機地址。多個地址以空格分隔
 dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z  #同步時不再壓縮的文件類型
 
 [wwwroot]                          #共享模塊名稱
 path = /var/www/html               #源目錄的實際路徑
 comment = Document Root of www.djq.com    #備註
 read only = yes     #是否爲只讀。yes表示客戶端只能讀取目錄內容,不能寫入。只允許下行,不允許上行。
 auth users = backuper    #授權賬戶,多個賬號以空格分隔。授權用戶,允許讀取的用戶名。
 secrets file = /etc/rsyncd_users.db
 #存放授權賬戶信息的數據文件
 #如採用匿名的方式,只要將其中的“auth users"和“secrets file"配置項去掉即可。
 
 #爲備份賬戶創建數據文件。
 vim /etc/rsyncd_users.db
 backuper:abc123       #無須建立同名系統用戶。backuper爲用戶名,abc123爲密碼。
 
 chmod 600 /etc/rsyncd_users.db
 
 #保證所有用戶對源目錄/var/www/html都有讀取權限
 chmod +r /var/www/html/
 ls -ld /var/www/html/
 #啓動rsync服務程序
 rsync --daemon     #啓動rsync 服務,以獨立監聽服務的方式(守護進程)運行
 netstat -anpt | grep rsync
 
 #關閉rsync 服務
 kill $(cat /var/run/rsyncd.pid)
 rm -rf /var/run/rsyncd.pid

3.2 發起端配置

基本格式:

rsync [選項] 原始位置 目標位置

rsync 命令的基本格式有多種,分別是:

[root@localhost ~]# rsync [OPTION] SRC DEST
[root@localhost ~]# rsync [OPTION] SRC [USER@]HOST:DEST
[root@localhost ~]# rsync [OPTION] [USER@]HOST:SRC DEST
[root@localhost ~]# rsync [OPTION] [USER@]HOST::SRC DEST
[root@localhost ~]# rsync [OPTION] SRC [USER@]HOST::DEST

針對以上 5 種命令格式,rsync 有 5 種不同的工作模式:

要知道,使用 rsync 在遠程傳輸數據(備份數據)前,是需要進行登陸認證的,這個過程需要藉助 ssh 協議或者 rsync 協議才能完成。在 rsync 命令中,如果使用單個冒號(:),則默認使用 ssh 協議;反之,如果使用兩個冒號(::),則使用 rsync 協議。

ssh 協議和 rsync 協議的區別在於,rsync 協議在使用時需要額外配置,增加了工作量,但優勢是更加安全;反之,ssh 協議使用方便,無需進行配置,但有泄漏服務器密碼的風險。

另外,以上幾種格式中各個參數的含義如下:

常用選項:

1J5Q0f

配置:

 #將指定的資源下載到本地/opt目錄下進行備份。密碼abc123
 
 格式一: #用戶名@主機地址::共享模塊名
 rsync -avz backuper@192.168.132.6::wwwroot /opt/  #wwwroot爲共享模塊名,密碼abc123
 #backuper指的是我在同步的時候用的哪個用戶身份
 #wwwroot代表的是模塊,模塊下面會寫同步的默認路徑和一些特性,所以我們只需要寫模塊就好了
 #/opt/指的是同步到本地的目錄
 
 格式二: #rsync:/用戶名@主機地址/共享模塊名
 rsync -avz rsync://backuper@192.168.132.6/wwwroot /opt/
 
 
 #免交互格式配置:
 echo "abc123" > /etc/server.pass
 
 chmod 600 /etc/server.pass    #密碼文件權限必須爲600,即除了屬主,其他人都沒有查看權限。
 
 rsync -avz --password-file=/etc/server.pass backuper@192.168.132.6::wwwroot /opt/     #免密同步
 
 
 #定時同步
 crontab -e
 30 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass backuper@192.168.142.10::wwwroot /opt/
 #爲了在同步過程中不用輸入密碼,需要創建一個密碼文件,保存backuper用戶的密碼,如/etc/server.pass。 在執行rsync 同步時使用選項"--password-file=/etc/server.pass"指定即可。
 
 systemctl restart crond
 systemctl enable crond

四、rsync 實時同步(上行同步)

4.1 定期同步的不足

4.2 實時同步的優點

4.3 Linux 內核的 inotify 機制

4.4 發起端配置 rsync+Inotify

五、配置 rsync 實時同步(上行同步)

發起端需要配置 rsync+Inotify。

5.1 修改 rsync 源服務器配置文件

 vim /etc/ rsyncd. conf
 read only = no   #關閉只讀,上行同步需要可以寫
 
 #之後重啓
 kill $(cat /var/run/rsyncd.pid)
 rm -rf /var/run/rsyncd.pid
 rsync --daemon
 netstat -anpt | grep rsync
 
 #創建一個同步目錄,並修改權限
 mkdir /data
 chmod 777 /data

5.2 發起端,調整 inotify 內核參數

Linux 內核中,默認的 inotify 機制提供了三個調控參數:

當要監控的目錄、文件數量較多或者變化較頻繁時,建議加大這三個參數的值。

 cat /proc/sys/fs/inotify/max_queued_events
 cat /proc/sys/fs/inotify/max_user_instances
 cat /proc/sys/fs/inotify/max_user_watches
 
 vim /etc/sysctl.conf    #內核參數都在該文件中修改
 fs.inotify.max_queued_events = 16384
 fs.inotify.max_user_instances = 1024
 fs.inotify.max_user_watches = 1048576
 
 sysctl -p

5.3 發起端,安裝 inotify-tools

用 inotify 機制還需要安裝 inotify-tools, 以便提供 inotifywait、 inotifywatch 輔助工具程序,用來監控、彙總改動情況。

 tar zxvf inotify-tools-3.14.tar.gz -C /opt/
 
 cd /opt/inotify-tools-3.14
 ./configure
 make && make install
 
 #可以先執行“inotifywait”命令,然後另外再開啓一個新終端向 /data 目錄下添加文件、移動文件,在原來的終端中跟蹤屏幕輸出結果。
 inotifywait -mrq -e modify,create,move,delete /data
 
 #選項“-e”:用來指定要監控哪些事件
 #選項“-m”:表示持續監控
 #選項“-r”:表示遞歸整個目錄
 #選項“-q”:簡化輸出信息

5.4 發起端,編寫觸發式同步腳本

在另外一個終端編寫觸發式同步腳本(注意,腳本名不可包含 rsync 字符串,否則腳本可能不生效)。

 vim /opt/inotify.sh
 #!/bin/bash
 
 #定義inotifywait監控/data目錄中文件事件的變量。attrib表示屬性變化。
 INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /data"
 
 #定義執行 rysnc 上行同步的變量。--delete保證兩邊目錄內容一致,可以不加。
 RSYNC_CMD="rsynC -azH --delete --password-file=/etc/server.pass /data backuper@192.168.142.10::backupdir/"
 
 #使用while、read持續獲取監控結果,根據結果可以作進一步判斷是否讀取到輸出的監控記錄
 $INOTIFY_CMD | while read DIRECTORY EVENT FILE
 do
    #如果rsync未在執行,則立即啓動
    if[ $(pgrep rsync | wc -l) -le 0 ];then
         $RSYNC_CMD
    fi
 done
 
 chmod +x /opt/inotify.sh
 
 chmod +x /etc/rc.d/rc.local     #開機自啓腳本文件
 echo '/opt/inotify.sh' >> /etc/rc.d/rc.local  #加入開機自動執行
 
 #之後運行腳本(後臺運行)
 cd /opt/
 ./inotify.sh &
 
 #之後在發起端創建文件,查看源服務器中是否新增了

如果同步的文件比較大,同步時比較慢導致後面文件沒來的及同步,則需要在腳本內添加消息隊列或緩衝:

 #!/bin/bash
 #定義inotifywait監控目錄中文件事件的變量
 INOTIEY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /data/"
 #定義執行rsync上行同步的變量
 RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /data/ backuper@192.168.132.6::backupdir/"
 #使用while、read持續獲取監控結果,根據結果可以進一步判斷是否讀取到輸出的監控記錄
 $INOTIEY_CMD | while read DIRECTORY EVENT FILE
 do    
       #小於等於0,則等待它執行完再去同步其他文件
       until [ $(pgrep rsync | wc -l) -le 0 ]
     
       do
          sleep 1
       done
       $RSYNC_CMD
 done

5.5 驗證同步效果

上述腳本用來檢測本機 / data 目錄的變動情況,一旦有更新觸發 rsync 同步操作,上傳備份至服務器 192.168.142.10 的 wwwroot 共享目錄下。

觸發式上行同步的驗證過程如下:

(1)在本機運行 / opt/inotify.sh 腳本程序.

(2)切換到本機的 /data/ 目錄,執行增加、刪除、修改文件等操作。

(3)查看遠端服務器中的 wwwroot 目錄下的變化情況。

六、使用 rsync 快速刪除大量文件

假如要在 linux 下刪除大量文件,比如 100 萬、1000 萬,像 / usr/local/nginx/proxy_temp 的 nginx 緩存等,那麼 rm -rf * 可能就不好用了,因爲要等待很長一段時間。

在這種情況下我們可以使用 rsync 來巧妙處理。

rsync 實際用的是替換原理。

 #先建立一個空的文件夾:
 mkdir /home/blank
 
 #用rsync刪除目標目錄:
 rsync --delete-before -a -H -v --progress --stats /home/blank/ /usr/local/nginx/proxy_temp
 
 #這樣目標目錄很快就被清空了

選項說明:

w0zKrb

示例文件,可以 在 GitHub 上找到源代碼。

作者:毛毛的學習筆記

出處:https://juejin.cn/post/7166802274084192286

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/uxeOFfI4ohjNC-e8C8fe9w