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 同步操作的服務器稱爲同步源。
-
在下行同步(下載)中,同步源負責提供文檔的原始位置,發起端應對該位置有讀取權限。
-
在上行同步(上傳)中,同步源負責提供文檔的目標位置,發起端應對該位置具有寫入權限。
三、配置 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 協議使用方便,無需進行配置,但有泄漏服務器密碼的風險。
另外,以上幾種格式中各個參數的含義如下:
-
SRC:用來表示要備份的目標數據所在的位置(路徑);
-
DEST:用於表示將數據備份到什麼位置;
-
USER@:當做遠程同步操作時,需指明系統登錄的用戶名,如果不顯示指定,默認爲以 root 身份登錄系統並完成同步操作。
常用選項:
配置:
#將指定的資源下載到本地/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 機制
-
從版本 2.6.13 開始提供
-
可以監控文件系統的變動情況,並做出通知響應
-
輔助軟件:inotify-tools
4.4 發起端配置 rsync+Inotify
-
使用 inotify 通知接口,可以用來監控文件系統的各種變化情況,如文件存取、刪除、移動、修改等。利用這一機制,可以非常方便地實現文件異動告警、增量備份,並針對目錄或文件的變化及時作出響應。
-
將 inotify 機制與 rsync 工具相結合,可以實現觸發式備份(實時同步),即只要原始位置的文檔發生變化,則立即啓動增量備份操作;否則處於靜默等待狀態。
-
因爲 inotify 通知機制由 Linux 內核提供,因此主要做本機監控,在觸發式備份中應用時更適合上行同步。
五、配置 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 機制提供了三個調控參數:
-
max_queue_events ( 監控事件隊列,默認值爲 16384)、
-
max_user_instances (最多監控實例數,默認值爲 128)、
-
max_user_watches (每個實例最多監控文件數,默認值爲 8192)。
當要監控的目錄、文件數量較多或者變化較頻繁時,建議加大這三個參數的值。
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 輔助工具程序,用來監控、彙總改動情況。
-
inotifywait:可監控 modify (修改)、create (創建)、move (移動)、delete (刪除)、attrib ( 屬性更改) 等各種事件,一有變動立即輸出結果。
-
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 快速刪除大量文件
rsync 實際用的是替換原理。
#先建立一個空的文件夾:
mkdir /home/blank
#用rsync刪除目標目錄:
rsync --delete-before -a -H -v --progress --stats /home/blank/ /usr/local/nginx/proxy_temp
#這樣目標目錄很快就被清空了
選項說明:
示例文件,可以 在 GitHub 上找到源代碼。
作者:毛毛的學習筆記
出處:https://juejin.cn/post/7166802274084192286
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/uxeOFfI4ohjNC-e8C8fe9w