Rsync+inotify自動同步數據


一、簡介

  隨着應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,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 &

  經測試新建文件和目錄、修改和刪除都能同步


免責聲明!

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



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