什麼是 Rsync?
是一個開源的快速備份工具,是Linux和UNIX操作系統默認安裝的組件之一,可在不同主機間鏡像同步整個目錄,並支持增量備份文件傳輸,保持鏈接和權限,
Rsync 官網地址:https://rsync.samba.org/
配置 rsync 源服務器
在遠程同步任務中,負責發起 rsync 同步操作的客户端稱為發起端,負責響應來自客户端的 rsync 同步操作的服務器稱為同步源
同步過程中,同步源負責提供文檔的原始位置,發起端應對該位置具有讀取權限
關閉iptables 防火牆和selinux。
service iptables stop
setenforce 0
將rsync 源服務器和rsync 客户端的/etc/hosts配置文件解析成一樣的,如下配置。
tail -2 /etc/hosts
192.168.31.108 linuxserver.com
192.168.31.226 linuxclient.com
配置/etc/rsyncd.conf文件
# vi /etc/rsyncd.conf
### This is rsyncd.conf
uid = rsync // 使用的用户
gid = rsync // 使用的用户
use chroot = no // 是否使用根目錄鎖 如果"use chroot"指定為true,那麼 rsync 在傳輸文件以前首先 chroot 到 path 參數所指定的目錄下。這樣做的原因是實現額外的安全防護,但是缺點是需要以 roots 權限,並且不能備份指向外部的符號連接所指向的目錄文件。默認情況下 chroot 值為 true。
max connections = 2000 // 指定該模塊的最大併發連接數量以保護服務器,超過限制的連接請求將被告知隨後再試,默認值是 0,也就是沒有限制。
timeout = 600 // 通過該選項可以覆蓋客户指定的IP超時時間。通過該選項可以確保rsync服務器不會永遠等待一個崩潰的客户端。超時單位為秒鐘,0表示沒有超時定義,這也是默認值。對於匿名rsync服務器來説,一個理想的數字是600。
pid file = /var/run/rsyncd.pid // 存放進程 ID 的文件位置
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log // 日誌文件位置
ignore errors
read only = false // 是否為只讀
list = false
hosts allow = 192.168.31.0/24 // 允許訪問的客户端 IP 地址範圍
hosts deny = 0.0.0.0/32 // 拒絕訪問的客户端 IP 地址範圍
auth users = rsync_backup // 授權賬户
secrets file = /etc/rsync.password // 存放賬户信息的數據文件
#################################
[backup]
path = /backup
啓動rsync服務
這時,在啓動 rsync 服務時,會出現如下報錯。
# rsync --daemon
failed to create pid file /var/run/rsyncd.pid: File exists
解決方案:需刪除/var/run/rsyncd.pid文件後,並重啓rsync服務
rm -rf /var/run/rsyncd.pid # 刪除 rsyncd.pid 文件
rsync --daemon # 再重新啓動 Rsync 服務
創建/etc/rsync.password文件
echo “rsync_backup:123456” > /etc/rsync.password
查看/etc/rsync.password文件,是否成功,並調整文件權限。
cat /etc/rsync.password
rsync_backup:123.com
chmod 600 /etc/rsync.password
監聽服務端口。
# pgrep rsync
5081
5125
# netstat -lntup|grep rsync
tcp 0 0 192.168.31.108:873 0.0.0.0:* LISTEN 5081/rsync
tcp 0 0 :::873 :::* LISTEN 5125/rsync
創建rsync需要使用對的真實用户
# useradd -s /sbin/nologin -M rsync
# id rsync
uid=500(rsync) gid=500(rsync) 組=500(rsync)
創建rsync推送需要的目錄
# mkdir /backup
# chown -R rsync.rsync /backup/
使用 Rsync 備份工具
rsync 命令的基本用法
大多數的備份程序要求指定原始位置、目標位置,rsync 命令其實跟 cp 命令相似。
比如:將文件/etc/fstab、目錄/boot/grub同步備份到/opt目錄下。
-r:選項表示遞歸整個目錄、-l:選項表示備份鏈接文件。
# rsync /etc/fstab /opt
# rsync -rl /etc/fstab /boot/grub /opt
rsync 命令格式
基本格式:rsync [選項] 原始位置 目標位置
rsync 命令常用備份選項
-
-r:遞歸模式,包含目錄及子目錄中的所有文件。 -
-l:對於符號鏈接文件仍復製為符號鏈接文件。 -
-v:顯示同步過程的詳細信息。 -
-a:歸檔模式,保留文件的權限、屬性等信息,組合選項等於-rlptgoD。 -
-z:在傳輸文件時進行壓縮。 -
-p:保留文件的權限標記。 -
-t:保留文件的時間標記。 -
-g:保留文件的屬組標記。(僅超級用户使用) -
-o:保留文件的屬主標記。(僅超級用户使用) -
-H:保留硬連接文件。 -
-A:保留 ACL 屬性信息。 -
-D:保留設備文件及其他特殊文件。 -
-- delete:刪除目標位置有而原始位置沒有的文件。 -
--checksum
配置源的表示方法
執行遠程同步任務時,rsync 命令需指定同步源服務器中的資源位置。
兩種表示方法
用户名@主機地址::共享模塊名(兩個冒號分隔形式)rsync://用户名@主機地址/共享模塊名(URL 地址形式)
使用真實用户測試rsync服務
如果ssh端口修改了,需加上端口。
命令格式:rsync -參數 文件 -e ‘ssh -p 端口號’ 用户名@ip:目錄路徑
# rsync -avz abc '-e ssh -p 22' root@linuxserver.com:/tmp // 實操命令格式
root@linuxserver.com's password: //輸入 linuxserver 設備的 root 密碼
sending incremental file list
abc
sent 64 bytes received 31 bytes 27.14 bytes/sec
total size is 0 speedup is 0.00
# ll /tmp // 查看同步結果
總用量 52
-rw-r--r--. 1 root root 0 12月 30 07:25 abc
在實際生產環境中的備份工作,通常都是重複性的,那麼我們可以設置個定時任務來完成備份操作。比如:每天凌晨04:00對服務器的tmp共享模塊同步,並下載到本地/mnt/jacktian目錄下,通過crond服務來完成。
這種同步過程中,我們不想輸入密碼,那麼需創建一個密碼文件,保存rsync_backup用户的密碼。
# cat /etc/rsync.password
rsync_backup:123.com
# chmod 600 /etc/rsync.password
# ll /etc/rsync.password
-rw-------. 1 root root 21 12月 30 08:04 /etc/rsync.password
在執行 rsync 同步時使用選項--password-file=/etc/rsync.password指定。
# crontab -e
00 04 * * * /usr/bin/rsync -az --delete --password-file=/etc/rsync.password@rsync_backup@192.168.31.108::tmp /mnt/jacktian
# service crond restart
# chkconfig crond on
配置 rsync+inotify 實時同步
Linux 從 2.6.13 版內核開始提供了 inotify 通知接口,用來監控文件系統的各種變化情況,如文件的存取,刪除,移動,修改等。利用這個機制,可實現文件異動警告,增量備份,針對目錄或文件的變化及時做出響應。
rsync+inotify 可以實現觸發式備份,只要原始位置的文檔發生變化,則立即啓動增量備份,否則處於靜默等待狀態,避免了按固定週期備份時存在的延遲性,週期過密等問題。
inotify 主要做本機監控,在觸發式備份應用中更適合上行同步。
inotify 機制提供了三個調控參數
max_queued_events:表示監控事件隊列max_user_instances:最多監控實例數max_user_watches:每個實例最多監控文件數
# cat /proc/sys/fs/inotify/max_queued_events
16384
# cat /proc/sys/fs/inotify/max_user_instances
128
# cat /proc/sys/fs/inotify/max_user_watches
8192
調整 inotify 內核參數
當要監控的目錄,文件數量較多或者變化頻繁時,建議加大這三個參數的值。
# vi /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
# sysctl -p
安裝 inotify-tools
安裝 inotify-tools 主要提供inotifywait,inotifywatch 等工具,用來監控,彙總改動情況
# tar zxf inotify-tools-3.14.tar.gz
# cd inotify-tools-3.14
# ./configure && make && make install
以監控網站目錄/var/www/html為例,執行inotifywait命令後,在另外一個終端中改動/var/www/html目錄下的內容。
-e:指定要監控的事件-m:表示持續監控-r:表示遞歸整個目錄-q:簡化輸出信息
# mkdir /var/www/html -p
# inotifywait -mrq -e modify,create,move,delete /var/www/html/
另一個終端:在/var/www/html/目錄下添加文件、移動文件、跟蹤屏幕輸出結果。
# mkdir /var/www/html/a
# mkdir /var/www/html/b
# mv /var/www/html/b /var/www/html/bb
# rm -rf /var/www/html/a
inotifywait 可監控 modify(修改),create(創建),move(移動),delete(刪除),attrib(屬性更改)等各種事件,一有變動立即輸出結果。可用於收集系統變動情況,並在運行結束後輸出彙總的變化情況。
# inotifywait -mrq -e modify,create,move,delete /var/www/html/
fy,create,move,delete /var/www/html/
/var/www/html/ CREATE,ISDIR a
/var/www/html/ CREATE,ISDIR b
/var/www/html/ MOVED_FROM,ISDIR b
/var/www/html/ MOVED_TO,ISDIR bb
/var/www/html/ DELETE,ISDIR a
編寫觸發式同步腳本
inotifywait輸出的監控結果中,每行記錄中包括目錄,事件,文件,可識別變動情況,只要檢測到有變動時執行rsync上行同步操作。
注意:當更新頻繁時,避免併發執行
rsync備份,若rsync進程已經存在,則忽略本次同步,或者根據rsync進程數量來決定是否同步
腳本用來測試本機/var/www/html目錄的變動,一旦有更新,將觸發rsync同步操作,並上傳至服務器192.168.31.108的/var/www/html目錄下。
觸發式上行同步驗證過程
1、使用rsync工具執行一次上行同步; 2、在本機運行bak_transfer.sh腳本; 3、在本機的/var/www/html目錄下,執行創建,刪除,修改等操作; 4、查看服務器中的/var/www/html目錄中的變化;
# vi bak_transfer.sh
# This is bak_transfer.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,move,attrib,delete /var/www/html/"
RSYNC_CMD="rsync -azH --delete /var/www/html/ rsync_backup@192.168.31.108:/var/www/html"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ]
then
$RSYNC_CMD
fi
done
# chmod +x bak_transfer.sh
# ./bak_transfer.sh
# echo "/bin/bash /root/bak_transfer.sh" >> /etc/rc.local
Rsync 啓動異常解決方案歸納
報錯:failed to create pid file /var/run/rsyncd.pid: File exists解決:rm /var/run/rsyncd.pid 啓動服務:rsync --daemon --config=/etc/rsyncd.conf報錯:rsync: failed to connect to IP 地址: Connection refused (111) rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]解決:啓動服務:rsync --daemon --config=/etc/rsyncd.conf報錯:rsync: failed to connect to IP 地址: Connection timed out (110) rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]解決:可能是 iptables 防火牆開啓導致無法通信,可以設置規則放行873端口或者直接關閉防火牆。報錯:@ERROR: chroot failed rsync: connection unexpectedly closed (75 bytes read so far) rsync error: error in rsync protocol data stream (code 12) at io.c(150)解決:rsync.conf 中設置的 path 路徑不存在,需新建目錄。