一、簡介
隨着應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足。
首先,rsync在同步數據時,需要掃描所有文件后進行比對,進行差量傳輸。如果文件數量達到了百萬甚至千萬量級,掃描所有文件將是非常耗時的,並且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。
其次,rsync不能實時的去監測、同步數據,雖然它可以通過linux守護進程的方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導致了服務端和客戶端數據可能出現不一致,無法在應用故障時完全的恢復數據。
基於以上兩種情況,可以使用rsync+inotify的組合來解決,可以實現數據的實時同步。inotify是一種強大的、細粒度的、異步的文件系統事件控制機制。linux內核從2.6.13起,加入了inotify支持,通過inotify可以監控文件系統中添加、刪除、修改、移動等各種事件,利用這個內核接口,第三方軟件就可以監控文件系統下文件的各種變化情況,而inotify-tools正是實施監控的軟件。在使用rsync首次全量同步后,結合inotify對源目錄進行實時監控,只有有文件變動或新文件產生,就會立刻同步到目標目錄下,非常高效使用!
二、部署rsync
操作系統: CentOs 7
Rsync Server: 172.16.200.160
Rsync Client : 172.16.200.143
2.1 Rsync Server安裝rsync服務
centos7上默認已經安裝了xinetd和rsync
# rpm -qa | grep xinetd xinetd-2.3.15-13.el7.x86_64 # rpm -qa | grep rsync rsync-3.0.9-18.el7.x86_64
vim /etc/rsync
service rsync { disable = no flags = IPv6 socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure += USERID }
vim /etc/rsyncd.conf
log file = /var/log/rsyncd.log #日志文件位置,啟動rsync后自動產生這個文件,無需提前創建 pidfile = /var/run/rsyncd.pid #pid文件的存放位置 lock file = /var/run/rsync.lock #支持max connections參數的鎖文件 secrets file = /etc/rsync.pass #用戶認證配置文件,里面保存用戶名稱和密碼,后面會創建這個文件 motd file = /etc/rsyncd.Motd #rsync啟動時歡迎信息頁面文件位置(自己創建這個文件,內容隨便自定義) [backup] #自定義名稱 path = /data/backup/rsync #rsync服務端數據目錄路徑,即同步到目標目錄后的存放路徑 comment = backup #模塊名稱與[backup]自定義名稱相同 uid = rsync #設置rsync運行的uid權限。這個要保證同步到目標目錄后的權限和源目錄一致,即都是nobody! gid = rsync #設置rsync運行的gid權限。 port=873 #默認的rsync端口 use chroot = no #默認為true,修改為no或false,增加對目錄文件軟連接的備份 read only = no #設置rsync服務端文件為讀寫權限 list = no #不顯示rsync服務端資源列表 max connections = 200 #最大連接數 timeout = 600 #設置超時時間 auth users = RSYNC_USER #執行數據同步的用戶名,需要后面手動設置。可以設置多個,用英文狀態下逗號隔開 hosts allow = 172.16.200.143 #允許進行數據同步的客戶端IP地址,可以設置多個,用英文狀態下逗號隔開 hosts deny = 172.16.200.150 #禁止數據同步的客戶端IP地址,可以設置多個,用英文狀態下逗號隔開(如果沒有禁止,就不用設置這一行)
創建用戶認證文件
vim /etc/rsync.pass
RSYNC_USER:123@rsync
設置文件權限
# chmod 600 /etc/rsyncd.conf # chmod 600 /etc/rsync.pass
創建備份目錄
# mkdir -p /data/backup/rsync # groupadd -g 1011 rsync # useradd -g 1011 -u 1011 rsync # chown -R rsync.rsync /data/backup/rsync
啟動rsync服務
# systemctl start xinetd # lsof -i:873
2.2 Rsync_Client安裝rsync
安裝rsync和xinetd
# yum -y install rsync xinetd
vim /etc/rsync
service rsync { disable = no flags = IPv6 socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure += USERID }
設置認證文件
vim /etc/rsync.pass
123@rsync
啟動
# systemctl start xinetd
2.3 測試
在Rsync_Client虛擬機上新建一個文件
# cd /data/test # touch test1.txt # rsync -avz /data/test/test1.txt RSYNC_USER@172.16.200.160::backup --password-file=/etc/rsync.pass
在Rsync_Server虛擬機上同步過來了
三、安裝inotify
# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz # mkdir -p /data/inotify # tar -zxvf inotify-tools-3.14.tar.gz # cd inotify-tools-3.14 # ./configure --prefix=/data/inotify # make && make install # ll /data/inotify
設置環境變量
# echo 'export PATH=$PATH:/data/inotify/bin' > /etc/profile.d/inotify.sh # source /etc/profile.d/inotify.sh
添加庫文件
# vim /etc/ld.so.conf.d/inotify.conf # vim /etc/ld.so.conf include ld.so.conf.d/*.conf
# ldconfig
修改inotify默認參數
查看系統默認參數值 [root@static-img ~]# sysctl -a | grep max_queued_events fs.inotify.max_queued_events = 16384 [root@static-img ~]# sysctl -a | grep max_user_watches fs.inotify.max_user_watches = 8192 [root@static-img ~]# sysctl -a | grep max_user_instances fs.inotify.max_user_instances = 128 修改參數: [root@static-img ~]# sysctl -w fs.inotify.max_queued_events="99999999" [root@static-img ~]# sysctl -w fs.inotify.max_user_watches="99999999" [root@static-img ~]# sysctl -w fs.inotify.max_user_instances="65535" 參數說明: max_queued_events: inotify隊列最大長度,如果值太小,會出現"** Event Queue Overflow **"錯誤,導致監控文件不准確 max_user_watches: 要同步的文件包含多少目錄,可以用:find /Data/xqsj_upload -type d | wc -l 統計這些源目錄下的目錄數,必須保證max_user_watches值大於統計結果(這里/Data/xqsj_upload為同步的源文件目錄) max_user_instances: 每個用戶創建inotify實例最大值
四、編寫自動同步腳本
#!/bin/bash SRCDIR="/data/test" # 需要備份的文件夾 USER="RSYNC_USER" IP="172.16.200.160" # server地址 DSTDIR="backup" cd /data /data/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file do /usr/bin/rsync -avz --delete $SRCDIR $USER@$IP::$DSTDIR --password-file=/etc/rsync.pass echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1 done
后台運行
# nohup sh rsync.sh &
經測試新建文件和目錄、修改和刪除都能同步