博客 / 詳情

返回

RSYNC異地遷移備份工具

什麼是 Rsync?

Rsync 是一個開源的快速備份工具,是LinuxUNIX操作系統默認安裝的組件之一,可在不同主機間鏡像同步整個目錄,並支持增量備份文件傳輸,保持鏈接和權限採用優化的同步算法,傳輸前執行壓縮,適用於異地備份,鏡像服務器等應用

Rsync 官網地址:https://rsync.samba.org/

image

配置 rsync 源服務器

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

同步過程中,同步源負責提供文檔的原始位置,發起端應對該位置具有讀取權限

image

關閉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 實時同步

 image

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 路徑不存在,需新建目錄。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.