rsync 遠程同步——安全高效的異地備份策略


前言
正確、有效的備份方案是保障系統及數據安全的重要手段。
在服務器中,通常會結合計划任務、Shell 腳本來執行本地備份。為了進一步提高備份的可靠性,使用異地備份也是非 常有必要的。
本篇博客主要介紹:rsync 工具的使用,以實現快速、安全、高效的異地備份。如針對 Web 站點的同步備份。

一、rsync介紹

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

rsync 的官方站點的網址是 http://rsync.samba.org/,目前最新版本是 3.1.3,由 Wayne Davison 進行維護。作為一種最常用的文件備份工具,rsync 往往是 Linux 和 UNIX 系統默 認安裝的基本組件之一。

二、rsync源服務器

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

在同步過程中,同步源負責提供文件的原始位置,發起端應對該位置具有讀取權限,如圖下圖所示。

三、配置rsync源服務器

3.1 配置rsync源服務器的步驟(理論)

環境准備工作:

 1) 建立/etc/rsyncd.conf 配置文件

rpm -q rsync #一般系統已默認安裝rsync

#建立/etc/rsyncd.conf 配置文件

vim /etc/rsyncd.conf #添加以下配置項
uid = nobody #也可以為root
gid = nobody #也可以為root
use chroot = yes #禁錮在源目錄
address = 192.168.80.10 #監聽地址,監聽本機地址
port 873 #監聽端口 tcp/udp 873,可通過cat /etc/services | grep rsync查看
log file = /var/log/rsyncd.log #日志文件位置
pid file = /var/run/rsyncd.pid #存放進程 ID 的文件位置
hosts allow = 192.168.80.0/24 #允許同步的客戶機網段
[wwwroot] #共享模塊名稱
path = /var/www/html #源目錄的實際路徑(同步的目錄)
comment = Document Root of www.clj.com
read only = yes #是否為只讀
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z #同步時不再壓縮的文件類型
auth users = backuper #授權賬戶,多個賬號以空格分隔
secrets file = /etc/rsyncd_users.db #存放賬戶信息的數據文件
-------------------------------------------------------------------------------
uid = nobody
gid = nobody
use chroot = yes
address = 192.168.80.10
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.80.0/24
[wwwroot]
path = /var/www/html
comment = Document Root of www.clj.com
read only = yes
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
auth users = backuper
secrets file = /etc/rsyncd_users.db
----------------------------------------------------------------------------------
#如采用匿名的方式,只要將其中的“auth users”和“secrets file”配置項去掉即可。

 

2) 為備份賬戶創建數據文件


#為備份賬戶創建數據文件
vim /etc/rsyncd_users.db
backuper:abc123 #無須建立同名系統用戶

chmod 600 /etc/rsyncd_users.db
#補充:SSH -i 密鑰文件位置 root@192.168.200.1 #授權遠程登錄
#密鑰文件的權限需要是600

#保證所有用戶對源目錄/var/www/html 都有讀取權限

#安裝http服務
yum -y install httpd
systemctl start httpd
systemctl enable httpd

mkdir -p /var/www/html
echo “this is gcc” > /var/www/html/gcc.txt

chmod +r /var/www/html/
ls -ld /var/www/html/ #以長格式顯示文件目錄權限
drwxr-xr-x. 2 root root 6 2月 28 09:01 /var/www/html/

3) 啟動 rsync 服務程序

#啟動 rsync 服務程序
rsync --daemon #啟動 rsync 服務,以獨立監聽服務的方式(守護進程)運行

netstat -anpt | grep rsync

#關閉 rsync 服務的方法
kill $(cat /var/run/rsyncd.pid)
rm -rf /var/run/rsyncd.pid

3.1 配置rsync源服務器的具體操作步驟(實操)

1 . 建立/etc/rsyncd.conf 配置文件

① 檢查rsync程序是否安裝,一般為默認安裝。

 ② 關閉防火牆和SElinux

 

 ③ 建立rsync配置文件

 

2 . 為備份賬戶創建數據文件

① 創建數據文件

 ② 修改權限

 ③ 安裝httpd服務

 ④ 站點目錄中創建index.html文件,賦予可讀權限

 3 . 啟動 rsync 服務程序

 

四、使用rsync備份工具

4.1 rsync 命令的基本用法
絕大多數的備份程序要求指定原始位置、目標位置,rsync 命令也一樣。最簡單的 rsync 用法類似於 cp 命令。
例如,可以將文件/etc/fstab、目錄/boot/grub 同步備份到/opt 目錄下,其中“-r”選項表示遞歸整個目錄樹,“-l”選項用來備份鏈接文件。
1. [root@localhost ~]# rsync /etc/fstab /opt

2. [root@localhost ~]# rsync -rl /etc/fstab /boot/grub /opt

(1)命令格式及常用備份選項 從以上操作可以看出,備份的基本格式為“rsync [選項] 原始位置 目標位置”,其中常用 的一些命令選項如下所示,具體應根據實際需求選擇(如-avz)。

-r:遞歸模式,包含目錄及子目錄中的所有文件。
-l:對於符號鏈接文件仍然復制為符號鏈接文件。
-v:顯示同步過程的詳細(verbose)信息。
-a:歸檔模式,保留文件的權限、屬性等信息,等同於組合選項“-rlptgoD”。
-z:在傳輸文件時進行壓縮(compress)。
-p:保留文件的權限標記。
-t:保留文件的時間標記。
-g:保留文件的屬組標記(僅超級用戶使用)。
-o:保留文件的屬主標記(僅超級用戶使用)。
-H:保留硬連接文件。
-A:保留 ACL 屬性信息。
-D:保留設備文件及其他特殊文件。
–delete:刪除目標位置有而原始位置沒有的文件。
–checksum:根據校驗和(而不是文件大小、修改時間)來決定是否跳過文件。

(2)配置源的表示方法 在執行遠程同步任務時,rsync 命令需要指定同步源服務器中的資源位置。

rsync 同步 源的資源表示方式為“用戶名@主機地址::共享模塊名”或者“rsync://用戶名@主機地址/共享 模塊名”,前者為兩個冒號分隔形式,后者為 URL 地址形式。

例如,執行以下操作即可訪問 rsync 同步源,將指定的資源下載到本地/root 目錄下進行備份。

1. [root@localhost ~]# rsync -avz backuper@192.168.80.10::wwwroot /root

或者

1. [root@localhost ~]# rsync -avz rsync://backuper@192.168.80.10/wwwroot /root

4.2 rsync 備份操作示例

環境准備工作:

 1)將指定的資源下載到本地/opt 目錄下進行備份。

格式一: rsync -avz backuper@192.168.80.10::wwwroot /opt/ #密碼abc123 格式二: rsync -avz rsync://backuper@192.168.80.10/wwwroot /opt/

 2)查看同步獲取的文件

cat /opt/index.html this is www.clj.com

 3)免交互格式配置

cd /opt

rm -rf gcc.txt

echo "abc123" > /etc/server.pass

chmod 600 /etc/server.pass

 4)免交互測試同步

# 免交互同步
/usr/bin/rsync -avz --delete --password-file=/etc/server.pass backuper@192.168.80.10::wwwroot /opt/

ls /opt/ #查看是否同步成功

cat /opt/index.html #查看文件內容是否同步成功

 5)加入到計划性任務中

crontab -e
30 22 * * * /usr/bin/rsync -avz --delete --password-file=/etc/server.pass backuper@192.168.80.10::wwwroot /opt/

systemctl restart crond
systemctl enable crond

 

 

五、inotify+rsync 實時同步

Linux 內核從 2.6.13 版本開始提供了 inotify 通知接口,用來監控文件系統的各種變化情況,如文件存取、刪除、移動、修改等。利用這一機制,可以非常方便地實現文件異動告警、 增量備份,並針對目錄或文件的變化及時作出響應。

將 inotify 機制與 rsync 工具相結合,可以實現觸發式備份(實時同步)——只要原始位 置的文檔發生變化,則立即啟動增量備份操作;否則處於靜默等待狀態,如下圖所示。這樣,就避免了按固定周期備份時存在的延遲性、周期過密等問題。

 正因為 inotify 通知機制由 Linux 內核提供,因此主要做本機監控,在觸發式備份中應用時更適合上行同步.

六、配置inotify+rsync 實時同步

6.1 配置inotify+rsync 實時同步的步驟(理論)

環境准備工作:(此實驗是接着上面實驗繼續做的)

 1.修改rsync源服務器(192.168.80.10)配置文件

vim /etc/rsyncd.conf
......
read only = no #關閉只讀,上行同步需要可以寫

kill `cat /var/run/rsyncd.pid` #殺掉rsyncd進程
netstat -natp | grep rsync #查看進程是否被殺掉

rsync --daemon #重新開啟
netstat -natp | grep rsync #查看服務是否開啟

chmod 777 /var/www/html #賦予權限

2.調整 inotify 內核參數(在客戶端配置:192.168.80.20)
在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

3.安裝 inotify-tools(在客戶端配置:192.168.80.20)
用 inotify 機制還需要安裝 inotify-tools,以便提供 inotifywait、inotifywatch 輔助工具程序。
notifywait:可監控modify(修改)、create(創建)、move(移動)、delete(刪除)、attrib(屬性更改)等各種事件,一有變動立即輸出結果。
inotifywatch:可用來收集文件系統變動情況,並在運行結束后輸出匯總的變化情況。

#依賴環境
mount /dev/cdrom /mnt #掛載磁盤
yum install gcc gcc-c++ make -y
#將壓縮包inotify-tools-3.14.tar.gz上傳至/opt目錄下,然后進行解壓
tar zxvf inotify-tools-3.14.tar.gz -C /opt/

cd /opt/inotify-tools-3.14
./configure
make && make install

#執行“inotifywait”命令,然后在另一個終端向/var/www/html 目錄下添加文件、移動文件,跟蹤屏幕輸出結果。
#執行下面命令后會進入監聽模式,無法操作,所以需要另開一個終端頁面進行作
inotifywait -mrq -e modify,create,move,delete /opt

#選項“-e”:用來指定要監控哪些事件
#選項“-m”:表示持續監控
#選項“-r”:表示遞歸整個目錄
#選項“-q”:簡化輸出信息
4.在客戶端(192.168.80.20)編寫觸發式同步腳本

vim /opt/inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/" #持續監控
RSYNC_CMD="rsync -apzH --delete --password-file=/etc/server.pass /var/www/html/ backuper@192.168.80.10::wwwroot/" #進行同步
$INOTIFY_CMD #輸出監控內容
$INOTIFY_CMD | while read DIRECTORY EVENT FILE #遍歷
##while判斷是否接收到監控記錄
do
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 #加入開機自動執行

mkdir -p /var/www/html/ #創建腳本中進行同步的目錄

#注意!192.168.80.10 是遠程同步服務器ip(即源端IP)!!

5、驗證實驗,客戶端開啟監控

cd /opt/ ./inotify.sh &

在客戶端(192.168.80.10)/var/www/html/ 目錄下創建文件test1和test2

cd /var/www/html/

mkdir test1 test2

在源服務器進程查看是否完成實時同步

ls /opt

七、使用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 /tmp/linuxany /usr/local/nginx/proxy_temp

這樣目標目錄很快就被清空了

選項說明:
–delete-before :接收者在傳輸進行刪除操作
-a :歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性
-H :保持硬連接的文件
-v :詳細輸出模式
–progress :在傳輸時顯示傳輸過程
–stats :給出某些文件的傳輸狀態

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM