29 Linux-同步伺服器-Rsync
29.1 rsync 概述
rsync 是類 unix 系統下的資料映象備份工具 。一款支援快速 完全備份和 增量備份的工具,支援本地複製,遠端同步等 ,類似於 scp 命令 rsync 命令 在 同步 檔案之前要先登入 目標 主機 進行使用者身份認證,認證過 後才能進行資料同步 身份認證方式取決於所使用的協議型別 rsync 一般使用兩種協議進行資料同步 ssh 協議和 rsync 協議
29.2 rsync 特性
-
能更新整個目錄 樹和檔案系統
-
有選擇性的保 留 符號連結、硬連結、檔案屬性、許可權、裝置以及時間等
-
對於安裝來說,無任何特殊許可權要求
-
對於 多個 檔案來說,檔案傳輸效率高
-
能用 ssh 或 自定義 埠作 為傳輸入口埠
29.3 rsync 工作原理
既然涉及到資料同步 必要的兩個 概念是 源 地址 檔案 )),目標 地址 檔案 )),以及以哪一方為基準 例如,想讓目標主機上的檔案和本地檔案保持同步,則是以本地檔案為同步基準,將本地檔案作為原始檔推送到目標主機上。
-
ssh登入驗證模式:使用 ssh 協議作為基礎進行使用者身份認證 ,然後 進行資料同步 。
-
rsync登入驗證模式:使用 rsync 協議 進行 使用者 身 份 認證( 非系統使用者 ),然後進行資料同步 。
資料同步方式推送上傳、拉取下載
29.4 rsync 實驗演示
我們一般使用 rsync 來進行單向資料同步 ,因此我們需要確定一個基準 ,比如 :兩臺伺服器 一臺 NFS 作為 網站資料伺服器 基準伺服器 另外一臺專門做 rsync 資料備份伺服器 ,我們以此為基礎開始我們的實驗
29.4.1 ssh 協議資料同步將 NFS 伺服器資料同步備份到 rsync 伺服器
實驗環境:一臺 NFS 伺服器,一臺 rsync 伺服器 在兩臺伺服器上分別建立目錄( filesrc 、 filedst)
下行同步(下載)
格式:rsync -avz 伺服器地址:伺服器目錄/* 本地目錄
示例:rsync -avz [email protected]:/filesrc/* /filedst
-a :歸檔模式,遞歸併保留物件屬性
-v :顯示同步過程
-z :在傳輸檔案時進行壓縮
上行同步(上傳)
格式:rsync -avz /本地目錄/* 伺服器地址:伺服器目錄
示例:rsync -avz filedst/* [email protected]:/filesrc
# 注意:使用 root 使用者進行 實驗可以但生產環境中儘量使用單獨建立的普通使用者減少許可權溢位
建立用來做資料同步的使用者,並給予使用者對目錄的相應許可權,一般使用 ACL 設定許可權
useradd zhangsan
passwd zhangsan
setfacl -m u:zhangsan:rwx /filesrc
# 若要實現免密碼 資料同步 ,只需要做好 ssh 金鑰對登入即可
29.4.2 rsync 協議資料同步將 NFS 伺服器資料同步備份到 rsync 伺服器
1)在兩臺伺服器上分別建立目錄( filesrc、filedst)
2)搭建 rsync 服務 (僅需要在 NFS 伺服器上搭建即可)
建立主配置檔案(/etc/rsync d .conf)
address = 192.168.88.10 # rsync 服務繫結IP
port 873 # 預設服務埠 873
log file = /var/log/rsyncd.log # 日誌檔案位置
pid file = /var/run/rsyncd.pid # 程序號檔案位置
[web] # 共享名 :用來連線是寫在 url 上的
comment = web directory backup # 共享描述話語
path = /filesrc # 實際共享目錄
read only = no # 是否僅允許讀取
dont compress = *.gz *.bz2 # 哪些檔案型別不進行壓縮
auth users = user1 # 登入使用者名稱非系統使用者,需要自行建立
secrets file = /etc/rsyncd_users.db # 認證所需賬戶密碼檔案需自行建立同上
建立認證所需賬戶密碼檔案
vim /etc/rsyncd_users.db
user1:123456
# chmod 600 /etc/rsyncd_users.db # 必須修改許可權,否則登入報錯
啟動服務
rsync --daemon
netstat -antp | grep 873
設定對映使用者對共享目錄有許可權 (r)
setfacl -m u:nobody:rwx /filesrc
注意:關閉服務可使用 kill 命令,但偶爾會造成服務被結束但程序號配置檔案不被刪除的問題若遇到此類問題可自己手動刪除,再啟動則正常建議自己寫一個 rsync 的服務管理指令碼
下行同步(下載)
格式:rsync -avz rsync://使用者名稱@伺服器地址/共享模組名 /本地目錄
示例:rsync -avz rsync://[email protected]/web /filedst
拓展:--delete:刪除本地比伺服器多出來的檔案 (源地址沒有,目標地址有的刪掉)
rsync -avz --delete rsync://[email protected]/web /filedst
上行同步(上傳)
格式:rsync -avz /本地目錄/* rsync://使用者名稱@伺服器地址/共享模組名
示例:rsync -avz /filedst/* rsync://[email protected]/web
拓展:
rsync 協議的免密碼可以藉助一個環境變數實現
export RSYNC_PASSWORD=虛擬使用者密碼(客戶端生成)
29.5 配置rsync +inotify 實時同步
定期同步的缺點:
-
執行備份的時間固定,延期明顯,實時性差
-
當同步源長期不變化時,密集的定期任務是不必要的浪費資源
實時同步的優點:
-
一旦同步源出現變化,立即啟動備份,實時性好
-
只要同步源無變化,則不執行備份,節省資源
29.5.1 inotify簡介
inotify 是一個 Linux 核心特性,它監控檔案系統,並且及時向專門的應用程式發出相關的事件警告,比如刪除、讀、寫和解除安裝操作等。 要使用 inotify ,必須具備一臺帶有 2.6.13 版本的核心作業系統 。
inotify兩個監控命令
inotifywait: 用於持續監控,實時輸出結果 常用
inotifywatch :用於短期監控,任務完成後再出結果
29.5.2 inotify部署
yum -y install gcc
tar -zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure && make && make install
29.5.3 inotifywait命令格式
格式:inotifywait -mrq -e 監控動作1,監控動作2 /監控目錄 &
示例:inotifywait -mrq -e create,delete /filesrc &
-m:始終保持事件監聽狀態
-r:遞迴查詢目錄
-q:只打印監控事件的資訊
監控動作:modify (內容 ),create,attrib (許可權 ),move,delete
29.5.4 利用rsync+inotifywait結合指令碼實現單向實時同步
vim src.sh
#!/bin/bash
a="inotifywait -mrq -e create,delete /filesrc"
b="rsync -avz /filesrc/* [email protected]:/filedst"
$a | while read directory event file # while 判斷是否接收到監控記錄
do
$b
done
# 注:使用者登入時要求免密碼驗證
29.5.5 實驗結果驗證
在伺服器端建立,刪除檔案 ,檢視備份端是否正常
拓展:調整 inotify 監控的檔案數量
調整inotify核心引數(/etc/sysctl.conf) | - |
---|---|
mak_queue_events | 監控佇列大小 |
mak_user_instances | 最多監控例項數 |
max_user_watches | 每個例項最多監控檔案數 |
29.6 配置 unison +inotify 實現雙向實時同步
rsync在單向同步上支援的非常好且效率很高 但是在雙向同步支援較差 unison 則是雙向同步的優秀工具 ,但其缺點是同步效率較低。
29.6.1 環境要求
-
準備好 同步所需的兩個目錄
-
如若用 root 來實現登入的話,生成金鑰對,以便於免密碼驗證
-
準備好 inotify 和 unison 的軟體 包
29.6.2 安裝步驟
1)安裝 inotif y
tar -zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure && make && make install
2)安裝 oca ml
tar -zxvf ocaml-3.10.1.tar.gz
cd ocaml-3.1 0.1
./configure # 忽略所有報錯
make world opt
make install
3)安裝 unison
# tar -zxvf unison-2.13.16.tar.gz
cd unison-2.13.16
make UISTYLE=text THREADS=true STATIC=true # 已經存在 Makefile 檔案,不需要 configure
cp unison /usr/local/ # 把生成的指令碼拷貝出來
注意:同樣的操作在伺服器端也做一遍 。
29.6.3 配置指令碼
注:雙向自動同步,監控目錄和資料同步時,源目錄不能使用*萬用字元傳輸,否則會變成死迴圈。
filesrc端:
#!/bin/bash
a="inotifywait -mrq -e create,delete /filesrc"
b="/usr/local/bin/unison -batch /filesrc/ ssh://192.168.88.20//filedst/" # -batch:批處理
$a | while read directory event file
do
$b
done
filedst端:
#!/bin/bash
a="inotifywait -mrq -e create,delete /filedst"
b="/usr/local/bin/unison -batch /filedst/ ssh://192.168.88.10//filesrc/" #-batch:批處理
$a | while read directory event file
do
$b
done
29.6.4 測試
將兩個指令碼放入後臺執行 bash src.sh &
分別在兩個主機上建立檔案檢視是否可以實現雙向實時同步可能會有延遲
本文摘抄或總結其他筆記,筆記不涉及任何商業用途,如果侵權請及時聯絡處理