rsync+inotify實現Git數據實時同步備份

定時備份和實時備份

       說到備份,無疑於定時備份和實時同步備份。定時備份能夠經過腳本或者Crontab來實現,而實時同步備份能夠經過某些接口監控文件的各類變化狀況來實現的(好比內核接口inotify);經過對比能夠發現對數據信息要求高的環境使用實時同步備份能夠更好更有利的保護數據的安全性。linux

軟件介紹之rsync

rsync說明

       rsync 遠程同步,同步是把數據從緩衝區同步到磁盤上去的、數據在內存緩存區完成以後尚未寫入到磁盤中去、因此有時候要同步到磁盤中去的,而rsync說白了和複製差很少、能將一個文件從一個地方複製到另一個地方的、可是他也能夠實現跨主機複製,兼具了cpscp的功能,可是在跨主機時不具有scp的加密功能。
       rsync
有一個特色,就是當你用rsync複製或跨主機複製時若是另外一端也有一個同名的文件,他會先對比兩個數據的md5碼是否是一致,若是不一致就會複製,並覆蓋,若是一致他將不會複製,因此這是一個快速複製工具,尤爲是同步目錄時,特別好用。
git

rsync經常使用選項

-a     歸檔,複製時能夠保存原有的屬主屬組等屬性信息,甚至包含一點額外的屬性(如訪問控制列表)
-v     詳細輸出模式、顯示詳細過程的
-q     靜默模式,儘量輸出少的信息
-r     遞歸複製
-c     打開校驗開關,強制對文件傳輸進行校驗
-b     建立備份,也就是對於目的已經存在有一樣的文件名時,將老的文件從新命名爲~filename。可使用--suffix選項指定不一樣的備份文件前綴。可使用--backup-dir將備份文件(~filename)存放在此目錄下
-p     保留文件的權限
-t     保留文件的時間戳
-l     保留文件的符號連接
-g     保留文件的屬組
-o     保留文件的屬主
-n     顯示哪些文件將被傳輸
-W     拷貝文件,不進行增量檢查
--delete      刪除那些DST中SRC沒有的文件
--exclude     指定排除不須要傳輸的文件模式
--progress    在傳輸時顯示傳輸過程(進度條)
--stats       顯示狀態
--password-file=FILE     指定從FILE中獲得密碼
--config=FILE            指定其餘的配置文件,不使用默認的rsyncd.conf

軟件介紹之inotify

inotify介紹

      Inotify 是一個Linux特性,是一種強大的、細粒度的、異步的文件系統監控機制,linux內核從2.6.13起便加入了Inotify支持,經過Inotify能夠監控文件系統中添加、修改、移動等各類細微事件,利用這個內核接口,第三方軟件就能夠監控文件系統下文件的各類變化狀況,而Inotify-tools就是這樣的一個第三方軟件。Inotify反應靈敏,用法簡單,而且比使用Crontab輪詢高效不少。github

inotify常見監控事件

IN_ACCESS:    文件被訪問
IN_MODIFY:    文件被修改
IN_ATTRIB:    文件屬性被修改
IN_CLOSE_WRITE:     以可寫方式打開的文件被關閉
IN_CLOSE_NOWRITE:   以不可寫方式打開的文件被關閉
IN_OPEN:      文件被打開
IN_MOVED_FROM:      文件被移出監控的目錄
IN_MOVED_TO:        文件被移入監控着的目錄
IN_CREATE:    在監控的目錄中新建文件或子目錄
IN_DELETE:    文件或目錄被刪除
IN_DELETE_SELF,     自刪除,即一個可執行文件在執行時刪除本身
IN_MOVE_SELF,       自移動,即一個可執行文件在執行時移動本身

inotify-tools介紹

      inotify-tools是一套組件,它包括一個C庫和幾個命令行工具,這些命令行工具可用於經過命令行或腳本對某文件系統的事件進行監控。inotify-tools提供的兩個命令行工具(inotifywait,inotifywatch)就是能夠監控文件系統下文件的各類變化狀況。vim

工具一--inotifywait命令介紹:

      inotifywait:經過inotifyAPI等待被監控文件上相應事件並返回監控結果,默認狀況下,正常的結果返回至標準輸出,診斷類的信息則返回至標準錯誤輸出。他能夠監控對應監控對象上指定的事件後退出,也能夠進行持續的監控。
       inotifywait
尤爲適合用於在腳本中等待某事件的發生,並可基於特定的事件執行相應操做。如將其用於腳本中監控某指定目錄中的文件上的修改、新建、刪除、屬性信息的改變,然後使用rsync命令將事件對應的文件同步到其餘主機上。
緩存

工具一--inotifywait之經常使用選項介紹:

-m          inotifywait的默認動做是在監控至指定文件的特定事件發生一次後就退出了,而是要此選項則可實現持續性的監控。

-r          遞歸監控指定目錄下的全部文件,包含新建的文件或子目錄;若是要監控的目錄中文件數量巨大,則一般須要修改/proc/sys/fs/inotify/max_users_watchs內核參數,由於其默認爲8192.

-e<event>   指定要監控的特定事件,默認是監控全部的事件,包括access,modify,attrib,close_write,close_nowirte,close,open,moved_to,moved_from,move,create,delete,delete_selt等;

--timefmt <fmt>     當在--format選項中使用%T時,--timefrt選項則能夠用來自定義的符合strftime規範的時間格式,此時間格式可用的格式符能夠經過strftime的手冊頁獲取;--timefrt後常有的參數是'%d/%m/%y %H:%M';

--format <fmt>      自定義inotiywait的輸出格式,如--format'%T %w %f';常有的選項以下:
         %w         顯示被監控文件的文件名;
         %f         若是發生某些事件對象是目錄,則顯示被監控目錄的名字;默認顯示爲空串;
         %T         使用–timefmt選項中自定義的時間格式;

工具二--inotifywatch命令介紹:

      經過inotifyAPI收集被監控文件或目錄的相關事件並輸出統計信息。安全

配置rsyncd+inotify實現實時同步

環境介紹

目標主機-->rsync服務器端:CentOS 6.5 

源文件主機-->rsync客戶端:Ubuntu 12.04

配置rsync服務器端:

    本次環境中採用rsync守護進程的方式進行數據同步。bash

安裝rsync相關程序包

###rsync程序系統默認會安裝,若沒有安裝可在此安裝###
[root@mon-zabbix ~]# yum -y install rsync

###rsync服務一般基於超級守護進程xinetd管理的方式來實現所以須要安裝xinetd###
[root@mon-zabbix ~]# yum -y install xinetd

提供rsync配置文件

###建立配置文件目錄###
[root@mon-zabbix ~]#mkdir -p /etc/rsyncd

###建立rsync主配置文件###
[root@mon-zabbix ~]#touch /etc/rsyncd/rsyncd.conf

###這個配置文件有兩部分組成,一是全局定義,二是定義rsync共享目錄###
[root@mon-zabbix ~]# cat /etc/rsyncd.conf 
# Global Settings 全局定義
uid =root         #使用哪一個用戶運行或獲取數據
gid = root        #用戶都以來賓帳號的方式運行
use chroot = no       #在服務運行時要不要把他鎖在家目錄中
max connections = 10     #做爲服務器端最大併發鏈接數
strict modes = yes       #表示是否工做在嚴格模式下,嚴格檢查文件權限等相關信息
pid file = /var/run/rsyncd.pid      #定義pid文件路徑
log file = /var/log/rsyncd.log      #定義日誌文件存放路徑的
# Directory to be synced            #定義共享目錄
[Git_rsync]        #要同步的目錄名稱,多個目錄名稱不能重名
path = /data1/gitbackup/git/        #定義目錄的路徑
list = false             #是否容許用戶列出文件列表
read only = no           #若是打算讓別人僅僅是來拉取數據的,yes就能夠了,若是打算讓別人推送過來作備份的那就爲no,表示客戶端是否能夠推送的
write only = no          #只允別人在裏面寫數據,但不能夠拉取數據
ignore errors = yes      #表示若是中間同步過程有一個文件出錯了是要繼續同步仍是停止同步,yes表示繼續同步,no表示停止同步
hosts allow = 10.171.215.112           #白名單,那些主機能夠訪問
auth users = git         #作用戶驗證(認證)的,只容許那個用戶來同步
secrets file = /etc/rsyncd/rsyncd.secrets      #存放驗證(認證)用戶的密碼的

###因爲守護進程程序xinetd是讀取默認rsync的配置(/etc/rsyncd.conf)###
[root@mon-zabbix ~]#ln -sv /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf

提供rsync認證用戶密碼文件

[root@mon-zabbix ~]#vim /etc/rsyncd/rsyncd.secrets
git:hui1234        #其中冒號前的是用戶名,冒號後的是對應用戶的密碼

###因爲此密碼文件是明文顯示,因此文件權限設爲600###
[root@mon-zabbix ~]#chmod 600 /etc/rsyncd/rsyncd.secrets

設置rsync開機自啓動

[root@mon-zabbix ~]#chkconfig rsync on

啓動rsync服務

[root@mon-zabbix ~]#service xinetd start

查看rsync監聽信息

[root@mon-zabbix ~]# netstat -tanlp | grep xinetd
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      27400/xinetd  
默認狀況下,rsyncd監聽的端口爲TCP:873

配置rsync客戶端

確保內核支持inotify

      客戶端(源主機)須要實時監控指定目錄中的全部文件與文件改變相關的事件,並在事件發生時將改變的數據同步到目錄主機,所以,源主機須要確保內核支持inotify,並安裝inotify-tools和rsync。
判斷內核是否支持inotify方法有以下:
服務器

###確保內核版本高於2.6.13,低於則需從新編譯內核###
root@mon11:~# uname -r
3.2.0-64-generic

###查看內核是否默認支持inotify—API###
root@mon11:~# ll /proc/sys/fs/inotify/
-rw-r--r-- 1 root root 0 Sep 18 18:06 max_queued_events
-rw-r--r-- 1 root root 0 Oct 20 10:24 max_user_instances
-rw-r--r-- 1 root root 0 Sep 18 18:06 max_user_watches

###既然說到了這裏就簡單介紹一下這三個分別有什麼做用?###
max_queued_events        表示調用inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丟棄
max_user_instances       表示每個real user ID可建立的inotify instatnces的數量上限
max_user_watches         表示每一個inotify instatnces可監控的最大目錄數量。若是監控的文件數目巨大,須要根據狀況,適當增長此值的大小,例如:echo "9000000" > /proc/sys/fs/inotify/max_user_watches

安裝相關程序包:

    這裏我採用的是源碼編譯安裝併發

源碼包下載地址
http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
源碼安裝過程
root@mon11:~# tar xf inotify-tools-3.14.tar.gz 
root@mon11:~# cd inotify-tools-3.14/
root@mon11:~/inotify-tools-3.14#./configure
root@mon11:~/inotify-tools-3.14# make
root@mon11:~/inotify-tools-3.14# make install

安裝完成會生成兩個二進制文件:異步

root@mon11:~# ll /usr/local/bin/inotify*
-rwxr-xr-x 1 root root 56956 Oct 16 17:54 /usr/local/bin/inotifywait*
-rwxr-xr-x 1 root root 53306 Oct 16 17:54 /usr/local/bin/inotifywatch*

建立密碼文件

     爲源主機的rsync提供經過git用戶同步文件目標主機的密碼文件

root@mon11:~# touch /etc/rsync.passwd
root@mon11:~# echo 'huilian123' > /etc/rsync.passwd
root@mon11:~# chmod 600 /etc/rsync.passwd

建立監控腳本

   經過inotifywait監控目標文件上的相應事件,並在事件觸發時啓動同步

root@mon11:/data/rsyncd# vim inotifyrsync.sh
#!/bin/bash
host=10.168.23.101
src=/home/git/
dst=Git_rsync
user=git
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files
do
/usr/bin/rsync -avzP --exclude".gitolite/logs/*" --progress --password-file=/etc/rsync.passwd $src $user@$host::$dst &>/dev/null && \
echo "${files} was rsynced" >> /data/rsyncd/rsync.log 2>&1
done
root@mon11:/data/rsyncd#chmod 755 inotifyrsync.sh
root@mon11:/data/rsyncd# bash inotifyrsync.sh &

設置開機自啓動

root@mon11:/data/rsyncd# echo 'bash /data/rsyncd/inotifyrsync.sh &' >> /etc/rc.local

結果展現

wKioL1RF3JSRp1I6AAEGz9c2nkw667.jpg

wKiom1RF3EnDY0yxAATH7QuQ3GA250.jpg

相關文章
相關標籤/搜索