定時備份和實時備份
說到備份,無疑于定時備份和實時同步備份。定時備份可以通過腳本或者Crontab來實現,而實時同步備份可以通過某些接口監控文件的各種變化情況來實現的(比如內核接口inotify);通過對比可以發現對數據信息要求高的環境使用實時同步備份可以更好更有利的保護數據的安全性。
軟件介紹之rsync
rsync說明
rsync 遠程同步,同步是把數據從緩沖區同步到磁盤上去的、數據在內存緩存區完成之后還沒有寫入到磁盤中去、所以有時候要同步到磁盤中去的,而rsync說白了和復制差不多、能將一個文件從一個地方復制到另外一個地方的、但是他也可以實現跨主機復制,兼具了cp和scp的功能,但是在跨主機時不具備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-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
結果展示
原創文章,作者:ZhaoYong,如若轉載,請注明出處:http://www.www58058.com/544