一、rsync 簡介
一款快速增量備份工具
- Remote Sync, 遠端同步
- 支援本地複制,或者與其他SSH、rsync 主機同步
- 官方網站:https://rsync.samba.org/
rsync 遠端同步
- rsync(Remote Sync,遠端同步)
- 是一個開源的快速備份工具,可以在不同主機之間鏡像同步整個目錄樹,支援增量備份,并保持連結和權限,且采用優化的同步算法,傳輸前執行壓縮,是以非常使用與異地備份、鏡像伺服器等應用。
- 在遠端同步任務重,負責發起rsync同步操作的客戶機稱為發起端,二負責響應來自客戶機的rsync同步操作的伺服器稱為同步源。在同步過程中,同步源負責提供檔案的原始位置,發起端應對該位置具有讀取權限。
二、rsync同步源
- 指備份操作的遠端伺服器,也稱為備份源

三、配置rsync源
1、基本思路
- 建立rsyncd.conf配置檔案、獨立的賬号檔案
- 啟用rsync的 --daemon模式
2、配置檔案 rsyncd.conf
- 認證配置auth users、secrets file,不加則為匿名
3、獨立的賬号檔案
- 使用者名:密碼
- 每行一個使用者記錄
- 獨立的賬号資料,不依賴系統賬号
4、啟用 rsync 服務
- 通過 --daemon獨自提供服務,rsync --daemon
- 執行kill $(cat /var/run/rsyncd.pid)關閉服務
四、rsync 指令
- 基本格式
rsync 【選項】原始位置 目标位置
- 常用選項
-r | 遞歸模式,包含目錄及目錄中的所有檔案 |
-l | 對于符号連結檔案仍然複制為符号連結檔案 |
-v | 顯示同步過程的詳細(verbose)資訊 |
-z | 在傳輸檔案時進行壓縮 |
-a | 歸檔模式,保留檔案的權限、屬性等資訊,等同于組合選項“-rlptgoD” |
-p | 保留檔案的權限标記 |
-t | 保留檔案時間的标記 |
-g | 保留檔案的屬組标記(僅超級使用者使用) |
-o | 暴露檔案的屬主标記(僅超級使用者使用) |
-H | 保留硬連接配接檔案 |
-A | 保留 ACL 屬性資訊 |
-D | 保留裝置檔案及其他特殊檔案 |
--delete | 删除目标位置有而原始位置沒有的檔案(即删除差異檔案,保留一緻性) |
--checksum | 根據校驗和(而不是檔案大小、修改時間)來決定是否跳過檔案 |
五、配置圓的兩種表達方式
格式一:
使用者名@主機位址::共享子產品名
格式二:
rsync://使用者名@主機位址/共享子產品名
六、inotify 簡介
監控檔案系統的變動情況,并做出通知響應
- 調整inotify核心參數(優化)
- /etc/sysctl.conf(核心參數配置檔案)
max_queue_events #監控事件隊列大小
max_user_instances #最多監控執行個體數
max_user_watches #每個執行個體最多監控檔案數
- inotifywait:用于持續監控,實時輸出結果
- inotifywatch:用于短期監控,任務完成後再輸出結果
inotifywait -mrq -e modify,create,move,delete /var/www/html
-m | 持續進行監控 |
遞歸監控所有子對象 | |
-q | 簡化輸出資訊 |
-e | 指定要監控哪些事件類型 |
modify | 修改 |
create | 建立 |
move | 移動 |
delete | 删除 |
七、配置 rsync下行同步
下行同步:将 Master 伺服器資料備份到 Slave 伺服器
- 環境配置
主機 | 作業系統 | IP位址 | 軟體包 / 工具 |
Master | Centos7 | 20.0.0.5 | rsync |
Slave | 20.0.0.6 | rsync / inotify-tools-3.14.tar.gz |
1、配置 rsync 源伺服器
(1)配置Master(20.0.0.5)
systemctl stop firewalld.service
setenforce 0rpm -q rsync #一般系統已預設安裝,沒有安裝yum安裝即可
vim /etc/rsyncd.conf
uid = nobody #nobody表示匿名使用者,也可以指定root等
gid = nobody
use chroot = yes # 禁锢在源目錄
address = 20.0.0.5 # 監聽位址
port 873 #預設監聽端口tcp/udp 873,可通過cat /etc/servicesIgrep rsync檢視
log file = /var/log/rsyncd.log #日志檔案位置
pid file = /var/run/rsyncd.pid #存放程序ID的檔案位置
hosts allow = 20.0.0.0/24 #允許通路的客戶機位址,多IP用空格分割
[wwwroot] #自定義共享子產品名稱
path = /var/www/html #源目錄的實際路徑
comment = Document Root of www.xxx.com #隻做為一個子產品備注
read only = yes #是否為隻讀
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z #同步時不再壓縮的檔案類型,設定在全局配置中表示所有子產品
auth users = kkk #授權賬戶,多個賬号以空格分隔
secrets file = /etc/rsyncd_users.db #存放賬戶資訊的資料檔案
#如采用匿名的方式,隻要将其中的"auth users"和"secrets file"配置項去掉即可
(2)為備份賬戶建立資料檔案
vim /etc/rsyncd_users.db
kkk:123456
chmod 600 /etc/rsyncd_users.db
(3)保證所有使用者對源目錄/var/www/html 都有讀取權限
chmod +r /var/www/html/
ls -ld /var/www/html/
(4)啟動 rsync 服務程式
rsync --daemon
netstat -natp | grep rsync
cd /var/www/html/
touch aaa.html bbb.html
ll -ld /var/www/html
ls
關閉 rsync 服務
kill $(cat /var/run/rsyncd.pid) #殺死該程序
rm -rf /var/run/rsyncd.pid #還需删除之前的pid檔案,否則下次啟動會失敗
2、發起端進行同步操作
(1)Slave(20.0.0.6)
systemctl stop firewalld
setenforce 0
rpm -q rsync
基本格式∶
rsync [選項] 原始位置 目标位置
#将指定的資源下載下傳到本地/opt 目錄下進行備份
rsync -avz [email protected]::wwwroot /opt/ #kkk為源主機授權的賬号名,@源主機IP,“::”後面跟上子產品名,則同步的為wwwroot子產品的源路徑,最後加上指定的存放的本地路徑
Password: #輸入授權的密碼123456
格式二:
rsync -avz rsync://[email protected]/wwwroot /opt/
rsync 下行同步、inotity 實時同步部署
(2)免互動格式配置
echo "123456" > /etc/server.pass
chmod 600 /etc/server.pass
rsync 下行同步、inotity 實時同步部署
(3)可以添加到計劃性任務在連接配接數較少的時間段定時執行同步備份的操作
crontab -e
30 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass [email protected]::wwwroot /opt/
(4)重新開機計劃性任務服務
systemctl restart crond #確定計劃任務服務的開啟
systemctl enable crond
八、rsync+inotify 實時同步(上行同步)
rsync 實時同步:
- 定期同步的不足
- 執行備份的時間固定,延遲明顯、實時性差
- 當同步源長期不變化時,密集的定期任務是不必要的
- 實時同步的優點
- 一旦同步源出現變化,立即啟動備份
- 隻要同步源無變化,則不執行備份
關于 inotify:
- Linux核心的inotify機制
- 從版本2.6.13開始提供
- 可以監控檔案系統的變動情況,并作出通知回應
- 輔助軟體:inotify-tools
使用 inotify 通知接口,可以用來監控檔案系統的各種變化情況,如檔案存取、删除、移動、修改等。利用這一機制,可以非常友善地實作檔案異動告警、增量備份,并針對目錄或檔案的變化及時作出響應。
将inotify機制與 rsync 工具相結合,可以實作觸發式備份(實時同步),即隻要原始位置的文檔發生變化,則立即啟動增量備份操作,否則處于靜默等待狀态。這樣,就避免了按固定周期備份時存在的延遲性、周期過密等問題。
因為 inotify 通知機制由 Linux 核心提供,是以主要做本機監控,在觸發式備份中應用時更适合上行同步。
1、發起端配置 rsync+inotify
vim /etc/rsyncd.conf
read only = no #關閉隻讀,上行同步需要可以寫
kill $(cat /var/run/rsyncd.pid)
rm -rf /var/run/rsyncd.pid
netstat -anpt | grep rsync
rsync --daemon
netstat -anpt | grep rsync
chmod 777 /var/www/html/
2、調整發起端的inotify 核心參數(優化)
在Linux核心中,預設的inotify機制提供了三個調控參數∶max_queue_events(監控事件隊列,預設值為16384)、max_user_instances(最多監控執行個體數,預設值為128)、max_user_watches(每個執行個體最多監控檔案數,預設值為8192)。當要監控的目錄、檔案數量較多或者變化較頻繁時,建議加大這三個參數的值。
(1)調整核心參數 (Slave 20.0.0.6)
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
3、發起端安裝 inotify-tools(20.0.0.6)
用 inotify 機制還需要安裝inotify-tools,以便提供 inotifywait、inotifywatch 輔助工具程式,用來監控、彙總改動情況。
inotifywait∶可監控modify(修改)、create(建立)、move(移動)、delete(删除)、attrib(屬性更改)等各種事件,一有變動立即輸出結果。
inotifywatch∶可用來收集檔案系統變動情況,并在運作結束後輸出彙總的變化情況。
yum -y install gcc gcc-c++
#傳入安裝包
tar zxvf inotify-tools-3.14.tar.gz -C /opt
cd /opt/inotify-tools-3.14/
./configure
make && make install
4、在發起端編寫觸發式同步腳本
注:腳本名不可包含rsync字元串,否則腳本不生效
vim /opt/inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /var/www/html/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/ [email protected]::wwwroot/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
##while判斷是否接收到監控記錄
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then
$RSYNC_CMD
fi
done
chmod +x /opt/aaa.sh
chmod 777/var/www/html/
chmod +x /etc/rc.d/rc.local
echo '/opt/inotify.sh' >>/etc/rc.d/rc.local #加入開機自啟動
上述腳本用來檢測本機/var/www/html目錄的變動情況,一旦有更新觸發rsync 同步操作,上傳備份至伺服器20.0.0.5 的 wwwroot 共享目錄下。
觸發式上行同步的驗證過程如下∶
(1)在本機運作/opt/aaa.sh腳本程式
(2)切換到本機的 /var/www/html目錄,執行增加、删除、修改檔案等操作
(3)檢視遠端伺服器中的 wwwroot目錄下的變化情況
源伺服器 Master (20.0.0.5) 驗證
之前上圖 slave 同步時會出現報錯,原因是我們以匿名使用者身份登陸的
Mater(20.0.0.5)
Slave(20.0.0.6)
九、使用rsync來實作快速删除大量檔案
假如要在linux下删除大量檔案,比如100萬、1000萬,像/usr/local/nginx/proxy_temp的nginx緩存等,那麼rm -rf *可能就不好使了,因為要等待很長一段時間。在這種情況下我們可以使用rsync來巧妙處理。rsync實際用的是替換原理。
(1)先建立一個空的檔案夾
mkdir /home/blank
(2)用rsync删除目标目錄
rsync --delete-before -a -H -v --progress --stats /home/blank/ /var/www/html/
這樣目标目錄很快就被清空了
注:目錄後面需要/結尾,否則可能執行失敗
選項說明:
--delete-before | -before接收者在傳輸之前就進行的操作,--delete删除目标位置有而原始位置沒有的檔案,結合起來就是:接收者在傳輸之前進行删除操作 |
-a: | 歸檔模式,表示以遞歸方式傳輸檔案,并保持所有檔案屬性 |
保持硬連接配接的檔案 | |
詳細輸出模式 | |
--progress | 在傳輸時顯示傳輸過程 |
--stats | 給出某些檔案的傳輸狀态 |