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

定時備份和實時備份

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

軟件介紹之rsync

rsync說明

       rsync 遠程同步,同步是把數據從緩沖區同步到磁盤上去的、數據在內存緩存區完成之后還沒有寫入到磁盤中去、所以有時候要同步到磁盤中去的,而rsync說白了和復制差不多、能將一個文件從一個地方復制到另外一個地方的、但是他也可以實現跨主機復制,兼具了cpscp的功能,但是在跨主機時不具備scp的加密功能。
       rsync
有一個特點,就是當你用rsync復制或跨主機復制時如果另一端也有一個同名的文件,他會先對比兩個數據的md5碼是不是一致,如果不一致就會復制,并覆蓋,如果一致他將不會復制,所以這是一個快速復制工具,尤其是同步目錄時,特別好用。

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輪詢高效很多。

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)就是可以監控文件系統下文件的各種變化情況。

工具一–inotifywait命令介紹:

       inotifywait:通過inotify API等待被監控文件上相應事件并返回監控結果,默認情況下,正常的結果返回至標準輸出,診斷類的信息則返回至標準錯誤輸出。他可以監控對應監控對象上指定的事件后退出,也可以進行持續的監控。
       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命令介紹:

       通過inotify API收集被監控文件或目錄的相關事件并輸出統計信息。

配置rsyncd+inotify實現實時同步

環境介紹

目標主機    -->  rsync服務器端:CentOS 6.5
源文件主機  -->  rsync客戶端:Ubuntu 12.04

配置rsync服務器端:

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

安裝rsync相關程序包

rsync程序系統默認會安裝,若沒有安裝可在此安裝:
[root@mon-zabbix ~]# yum -y install rsync
rsync服務通?;诔壥刈o進程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:huilian1234        #其中冒號前的是用戶名,冒號后的是對應用戶的密碼
###由于此密碼文件是明文顯示,所以文件權限設為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-toolsrsync。
判斷內核是否支持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

結果展示

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

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

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

(0)
ZhaoYongZhaoYong
上一篇 2015-02-28
下一篇 2015-02-28

相關推薦

  • 系統基礎之壓縮歸檔工具詳解

    壓縮和解壓縮工具 概論  在使用操作系統時,我們常會遇到大文件,會使我們很頭疼.在面對時間和空間上的選擇,只能選擇空間,這就要用到壓縮工具和歸檔工具,下面為大家一一介紹.  壓縮文件只壓縮文本格式的文件,通常不壓縮已經是壓縮的文件.  壓縮文件就會涉及到壓縮比:    原理:通過了解文本文件的數據形式,運用壓…

    Linux干貨 2016-08-18
  • N25-第十周

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) 一、內核空間詳細過程如下: POST –> BootSequence(BIOS) –> Bootloader(MBR) –> kernel(ramdisk) –> rootfs(只讀) –> /sbin/init(systemd) 1.POST:(pow…

    Linux干貨 2017-05-30
  • 8.6正則表達式grep及其他文本處理命令練習

    正則表達式grep及其他文本處理命令練習 上課練習 1 1、centos 6找出ifconfig命令結果中本機的IPv4地址 [root@qzx ~]# ifconfig|head -n 2|tail -n 1|tr -s ' [:alpha:]'&…

    Linux干貨 2016-08-07
  • N26 第五周作業

    1、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行; [root@localhost ~]# cat /boot/grub/grub.conf | grep "^[[:space:]]" 2、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后…

    Linux干貨 2017-01-26
  • 防火墻

    iptables筆記整理

    Linux干貨 2018-03-05
  • CentOS下命令基礎練習

    馬哥教育網絡班23期+第五周課堂作業 CentOS下命令基礎練習 1、顯示當前系統上root、fdeora或user1用戶的默認shell 2、找出/etc/rc.d/init.d/functions文件中某單詞后面跟一組小括號的行,形如:hello() 3、使用echo命令輸出一個絕對路徑 使用grep取出其基名 擴展:取出其路徑名 (…

    Linux干貨 2016-10-24
欧美性久久久久