inotify+rsync同步方案(ubuntu,適用其他發行版)

系統:Ubuntu 16.04.1  工具:rsync 3.1.1 、inotify -tools 3.14      作者:jevtse    本文除了軟件安裝部分,其他內容同樣適用其他linux系統;
同步目標主機:172.16.250.141;rsync服務端,只需搭建rsync服務;
同步源主機:172.16.250.142;rsync客戶端,只需安裝inotify -tools工具包;

1、rsync傳輸方式        0%
2、rsync命令             10%
3、rsync服務端配置    40%
4、rsync服務端配置    50%
5、inotify-tools          50%
6、inotifywait+rsync實現數據實時同步    60%
7、inotify+rsync雙機同步腳本    80%


    rsync是一個遠程文件同步(備份)工具,使用Rsync算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快,常用小規模網絡或局域網文件同步傳輸;
    由于rsync每次同步需要將整個目錄掃描一次,當文件數量較大時,整個過程非常耗時耗性能,同時rsync不能實時監控文件的變化;而inotify是一種強大的、細粒度的、異步的文件系統事件監控機制,允許監控程序打開一個獨立文件描述符,并針對事件集監控一個或者多個文件,例如打開、關閉、移動/重命名、刪除、創建或者改變屬性。
    所以我們可以通過inotify -tools工具包實現對 Linux 文件實時監控,當文件發生變化時,實時將變化的文件通過rsync同步到遠端備份服務器;
  本文以把客戶端/data/rsyncy下的文件同步備份到服務端的/data/backup目錄下為例;
    Ubuntu默認自帶rsync工具,不需要安裝;

1、rsync傳輸方式


  基于SSH協議傳輸:類似于scp命令,可實現PUSH本地文件至遠程,或PULL遠程文件到本地,只需主機安裝rsync程序即可,無需開啟rsync服務;
  基于rsync協議傳輸:基于C/S模型的rsyncd服務端與rsync客戶端命令完成單向數據傳輸,遠程端需開啟rsync服務,本文同步方案就是使用該協議傳輸數據;

2、rsync命令


Usage: rsync [OPTION]... SRC [SRC]... DEST                            #本地文件拷貝
or   rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST                #拷貝本地數據到遠端主機(ssh、rsh等工具)
or   rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST                #拷貝本地數據到遠程rsync服務器
or   rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST    #拷貝本地數據到遠程rsync服務器,URL模式
or   rsync [OPTION]... [USER@]HOST:SRC [DEST]                    #拷貝遠端主機數據到本地(ssh、rsh等工具)
or   rsync [OPTION]... [USER@]HOST::SRC [DEST]                    #拷貝遠程rsync服務器數據到本地
or   rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]        #拷貝遠程rsync服務器數據到本地,URL模式
#HOST后面為單冒號( : )時表示使用shell遠程工具連接(如ssh、rsh等);HOST后面為雙冒號時( :: )或rsync://時表示使用rsync協議傳輸,此時服務器端的[SRC]或[DEST]為rsyncd.conf中定義的模塊名稱;
-v,    --verbose:詳細輸出模式
-q,    --quiet 精簡輸出模式
-c,    --checksum:對傳輸完成的文件進行校驗
-b,    --backup:不覆蓋原有文件,為其重命名~file
-u,     --update:僅更新舊文件,判斷mtime,不同步相同的文件
-z,     --compress:壓縮傳輸
-r,     --recursive:遞歸子目錄
-a,     --archive:歸檔且遞歸,保留所有屬性,相當于 -rltogpD (不包括 -HAX)
-l,    --links:保留軟鏈接
-H,     --hard -links:保留硬鏈結
-A,    --acls:保留ACL權限
-X,    --xattrs:保留擴展屬性
-t,     --times:保留時間戳
-o,     --owner:保留屬主信息
-g,     --group:保留屬組信息
-p,     --perms:保留文件權限
-D,     --devices:保留設備文件屬性
--delete:刪除目標主機多余的文件
--delete -after:傳輸完成后再刪除多余的文件
--force:強制刪除目錄,即使不為空
--password -file=login.passwd:從文件讀取密碼
--progress:顯示備份過程,進度條
--ignore -errors:忽略IO錯誤進行刪除
--partial:保留未完全傳輸的文件,恢復后斷點續傳
--compare -dest=DIR 比較DIR中的文件來決定是否需要同步
--exclude=PATTERN:指定排除的文件或目錄,可模式匹配
--include=PATTERN:指定不排除的文件或目錄
--bwlimit=Kbps:限制傳輸帶寬,KBytes per second

3、rsync配置


可以從/usr/share/doc/rsync/examples/拷貝rsync自帶的模板文件rsyncd.conf到/etc目錄下修改,或直接在創建/etc/rsyncd.conf

root@jev -u1:~# cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/

服務端常用配置如下:

root@jev -u1:~# cat /etc/rsyncd.conf
# GLOBAL OPTIONS                   #全局配置段
use chroot = no                    #是否chroot
strict modes = yes                 #嚴格模式
lock file = /var/lock/rsyncd       #程序鎖文件存放位置
pid file = /var/run/rsyncd.pid     #pid文件位置
log file = /va/log/rsyncd.log      #日志文件位置

# MODULE OPTIONS                   #局部配置段
[backup]                           #模塊名稱
path = /data/backup                #同步文件存放目錄
max connections=10                 #最多并發數
read only = no                     #開啟讀取
list = false                       #是否允許查看列表
#      exclude = lost+found/       #不同步的文件
#      exclude from =              #指定一個包含exclude模式定義的文件名
#      include =                   #類似exclude
#      include from =              #指定一個包含include模式定義的文件名
uid = root                         #以誰的身份運行rsync
gid = root                         #運行rsync的組
auth users = jevtse                #虛擬用戶名(非linux用戶),同步登錄用
secrets file = /etc/rsyncd.secrets #虛擬用戶的密碼存放文件
hosts allow = 172.16.250.142       #白名單
hosts deny = *                     #黑名單
ignore errors = yes                #忽略I/O錯誤
ignore nonreadable = yes           #忽略沒有訪問文件權限的用戶
transfer logging = no              #使用ftp格式獨立記錄日志
#       log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.        #日志格式
timeout = 600                           #超時時間
refuse options = checksum dry -run      #客戶端不能使用的命令
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz        #不進行壓縮傳輸的文件

創建虛擬用戶的密碼文件,格式為”auth_name:passwd”

root@jev -u1:~# echo jevtse:jevtsepass >> /etc/rsyncd.secrets

給予密碼文件最小權限

root@jev -u1:~# chmod 600 /etc/rsyncd.secrets 

創建數據備份目錄,需于配置文件一致,如果存在無需創建

root@jev -u1:~# mkdir  /data/backup  -pv

確保selinux與iptables不會成為阻礙;

4、rsync客戶端配置


創建虛擬用戶認證密碼文件,密碼需與服務端對應;

root@jev -u2:~# echo jevtsepass > /etc/rsyncd.login.secrets

給予密碼文件最小權限

root@jev -u2:~# chmod 660 /etc/rsyncd.login.secrets

創建數據源目錄

root@jev -u2:~# mkdir /data/rsync  -pv

5、inotify-tools


在客戶端安裝inotify-tools工具包

root@jev-u2:~# apt install inotify-tools -y
root@jev-u2:~# dpkg -L inotify-tools
。 。 。
/usr/bin/inotifywait
/usr/bin/inotifywatch

可以看到工具包包含inotifywait與inotifywatch倆個工具,inotifywait命令用于監視文件系統的細微變化;inotifywatch用于收集關于被監視的文件系統的統計數據。

inotifywait命令

Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
-m,    --monitor:持續保持監聽,
-d,    --daemon:以守護進程方式在后臺監聽
-r,    --recursive:遞歸監聽所有目錄
-o,    --outfile <file> :將events信息保存向到指定文件
-s,    --syslog:將錯誤信息寫進系統日志文件
-q,    --quiet:靜默模式,只輸出events
-qq        :靜默模式,不輸出任何信息
-e,    --event <event1> [ -e|--event <event2> ... ]:指定監控的events(access,modify,attrib,close,move,delete,……)
--timefmt <fmt>:指定時間格式,相等于將時間格式賦值給%T
--format:指定輸出文件events變化的信息格式, %T時間,%w觸發事件文件所在絕對路徑,%f觸發事件文件名稱,%e觸發的事件名稱…

6、inotifywait+rsync實現數據實時同步


通過inotifywait實時監控172.16.250.142:/date/rsync目錄下文件的修改、刪除、創建、移動、屬性變化情況,如有變動,將發生變化的文件通過管道傳送給rsync,觸發rsync實時同步到172.16.250.141上srync服務器的[backup]模塊對應的備份目錄下:

root@jev-u2:~# inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e'   -e modify,delete,create,move,attrib /data/rsync/ | while read line ; do rsync -avz --delete  --password-file=/etc/rsyncd.login.secrets  /data/rsync/ jevtse@172.16.250.141::backup ; done

注意[SRC]即(/data/rsync/)后面必須帶分隔符(/),否則會在目標服務器重新創建目錄;

再開啟一個終端,在/date/rsync下面創建多級目錄測試是否能正常觸發數據同步:

root@jev-u2:~# mkdir /data/rsync/test0/test1/test2 -pv
mkdir: created directory '/data/rsync/test0'
mkdir: created directory '/data/rsync/test0/test1'
mkdir: created directory '/data/rsync/test0/test1/test2'

查看剛剛運行同步命令的終端的輸出:

root@jev-u2:~# inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e' -e modify,delete
,create,move,attrib /data/rsync/ | while read line ; do rsync -avz --delete --password-file=/etc/rsyncd.login.secrets /data/rsync/ jevtse@172.16.250.141::backup ; done sending incremental file list
./
test0/
test0/test1/
test0/test1/test2/

sent 128 bytes  received 39 bytes  334.00 bytes/sec
total size is 0  speedup is 0.00
sending incremental file list 

sent 112 bytes  received 23 bytes  270.00 bytes/sec
total size is 0  speedup is 0.00
sending incremental file list

sent 112 bytes  received 23 bytes  270.00 bytes/sec
total size is 0  speedup is 0.00

可以看到,已經正常觸發rsync傳輸部分文件到rsync服務端;

在rsync服務端172.16.250.141查看對應目錄是否創建成功

root@jev-u1:~# tree /data/backup/
/data/backup/
└── test0
└── test1
└── test2
3 directories, 0 files

初步測試成功

7、inotify+rsync雙機同步腳本


inotify+rsync同步方案(ubuntu,適用其他發行版)

root@jev-u2:~# cat  inotify-rsync.sh
#!/bin/bash
#Version 2.0
#Auther: jevtse
    SRC=/data/rsync/                                          #備份源目錄#
    DEST=jevtse@172.16.250.141::backup            #目標目錄#
    PASS_FILE=/etc/rsyncd.login.secrets                #密碼文件位置#
    LOG=/var/log/inotify-rsync.log                        #成功日志#
    ERR_LOG=/var/log/inotify-rsync-error.log          #錯誤日志#
    TEMP=`mktemp /tmp/rsync.XXX`
    inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e' -e modify,delete,create,move,attrib $SRC |    
      while read line ; do
        > $TEMP
        rsync -avz --delete --password-file=$PASS_FILE $SRC $DEST   2>> $TEMP
            [ -s $TEMP ] &&
                ( echo $line  >>  $ERR_LOG ; cat $TEMP >> $ERR_LOG ) ||
                    echo $line >> $LOG ;
        done
        unset SRC DEST PASS_FILE LOG ERR_LOG TEMP

腳本使用:

root@jev-u2:~# chomd u+x inotify-rsync.sh
root@jev-u2:~# ./inotify-rsync.sh  &

客戶端事件同步成功日志示例:

root@jev-u2:~# cat /var/log/inotify-rsync.log
17-03-05 14:46 /data/rsync/test0/test1/test2/ txt1 MODIFY

客戶端事件同步失敗日志示例:

root@jev-u2:~# cat /var/log/inotify-rsync-error.log
17-03-05 14:54 /data/rsync/test0/test1/test2/ txt1 MODIFY
rsync: failed to connect to 172.16.250.141 (172.16.250.141): Connection refused
rsync error: error in socket IO (code 10) at clientserver.c(128) [sender=3.1.1]

【本文完】

原創文章,作者:Jev Tse,如若轉載,請注明出處:http://www.www58058.com/70527

(6)
Jev TseJev Tse
上一篇 2017-03-05 12:05
下一篇 2017-03-05 17:04

相關推薦

  • 第十九周作業

    1.描述tomcat的架構 tomcat服務器是一種Servlet/jsp容器,更實質性的說是Servlet容器,因為jsp最終還是被編譯成servlet來執行的。而對于servlet來說,其最長見的用途是擴展java web服務器功能,為來自web客戶的請求提供服務。它完全運行在java虛擬機上。由于它的運行在服務器端,因此他的運行不依賴于瀏覽器。 tom…

    2017-07-11
  • Centos7下的systemd管理

    systemd簡介 Systemd是由紅帽公司的一名叫做Lennart Poettering的員工開發,systemd是Linux系統中最新的初始化系統(init),它主要的設計目的是克服Sys V 固有的缺點,提高系統的啟動速度,systemd和upstart是競爭對手,ubantu上使用的是upstart的啟動方式,centos7上使用systemd替換…

    Linux干貨 2016-09-23
  • Linux軟件包管理(YUM)及編譯安裝

    YUM 一、yum安裝使用: 1、Yum:rpm的前端程序,用來解決軟件包相關依賴性,可以在多個庫之間定位軟件包,up2date的替代工具 2、yum repository:yum repo,存儲了眾多rpm包,以及包的相關的元數據文件(放置于特定目錄repodata下) 3、yum客戶端配置文件: /etc/yum.conf:為所有倉庫提供公共配置 /et…

    Linux干貨 2016-08-26
  • raid 0磁盤陣列

    raid0 1  先給sdb磁盤和sdc磁盤分區 [root@localhost ~]# fdisk /dev/sdb    Command (m for help): n Command action   e   extended   p   primary part…

    Linux干貨 2017-04-25
  • 數據庫的備份和恢復

    數據庫的備份和恢復 一 (理論篇)、數據庫備份與恢復基礎 1、數據庫的備份與恢復 備份:存儲的數據副本; 原始數據:持續改變; 恢復:把副本應用到線上系統; 僅能恢復至備份操作時刻的數據狀態; 時間點恢復: binary logs; 2、為什么備份? 災難恢復: 硬件故障(冗余)、軟件故障(bug)、自然災害、黑客攻擊、誤操作、…&nb…

    2016-11-22
  • 一. DHCP,TFTP, DNS 配置

    練習在CentOS6上配置DHCP, TFTP, DNS服務 1. 首先按下圖所示搭建網絡拓撲圖 2017-07-11 151425-001.png Server1 服務器IP: 192.168.20.101/24GATEWAY: 192.168.20.2DNS: 192.168.20.2 Server2 服務器IP: 192.168.20.102/24GA…

    Linux干貨 2017-07-11
欧美性久久久久