超詳細CentOS6.5配置rsync+inotify實現同步
rsync是一個開源的快速備份工具,可以在不同主機之間鏡像同步整個目錄樹,支持增量備份,保持鏈接和權限,且采用優化的同步算法,傳輸前執行壓縮,因此非常適用於異地備份、鏡像服務器等應用
下行同步
在遠程同步任務中,負責發起rsync同步操作的客戶機稱為發起端
而負責響應來自客戶機的rsync同步操作的服務器稱為同步源
在同步過程中,同步源負責提供文檔的原始位置,發起端應對該位置具有讀取權限
inotify
inotify是一個Linux特性,它監控文件系統操作,比如讀取、寫入和創建。inotify反應靈敏,用法非常簡單,並且比cron任務的繁忙輪詢高效得多。將rsync工具與inotify機制相結合,可以實現實時同步,只要原始位置發生變化,就立即啟動增量備份操作,否則處於靜默等待狀態,這樣避免了按固定周期備份時存在的延時性、周期過密性等問題
實驗環境
- 系統環境:centos6.5
- 同步源IP:192.168.100.96/24
- 同步源主機名:redhat6_4
- 發起端IP:192.168.100.97/24
- 發起端主機名:redhat6_5
- 共享模塊站點:/var/www/html
搭建步驟:
一、準備工作
1、同步源端、發起關閉防火墻、Selinux
[root@redhat6_4 ~]# vim /etc/sysconfig/selinux
[root@redhat6_4 ~]# chkconfig iptables off #開機啟動關閉防火墻
二、配置同步源服務器
1、建立並編輯主配置文件
[root@redhat6_4 ~]# rpm -qa | grep ‘rsync‘
[root@redhat6_4 html]# vim /etc/rsyncd.conf #centos6中,配置文件需要手工建立,但是在centos7中系統事先已經建立
全局配置
uid = nobody #指定執行用戶(系統偽用戶)
gid = nobody #指定用戶組
use chroot = yes #將用戶禁錮在當前目錄下(源目錄)
address = 192.168.100.96 #服務器監聽地址
port 873 #服務端口
log file = /var/log/rsyncd.log #日誌存放位置pid file = /var/run/rsyncd.pid #進程ID文件存放位置
host allow = 192.168.100.0/24 #允許訪問的客戶端地址模塊定義
[page] #共享模塊名稱
path = /var/www/html #共享目錄的實際路徑
conmment = This is the site directory of a site #描述信息
read only = yes #是否為只讀文件,yes代表只讀,反之可以寫,這裏暫時制作備份,定義"yes"即可
dont compress = .gz .bz2 .tgz .zip .rar .z #同步時不再壓縮的文件類型
auth users = rcuser #指定授權賬戶,如果多個用戶以空格進行分割,此用戶不是系統用戶,只是指定一個專門進行的備份的一個賬戶而已
secrets file = /etc/rsyncd_users.db #存放賬戶信息的數據文件
2、建立並編輯賬戶數據文件
[root@redhat6_4 ~]# vim /etc/rsyncd_users.db
[root@redhat6_4 ~]# chmod 600 /etc/rsyncd_users.db #修改權限,這裏必須改,否則客戶端遠程同步會報錯,認證有問題,親測!!!
3、同步源安裝httpd並寫入測試文件
[root@redhat6_4 ~]# yum -y install httpd
[root@redhat6_4 ~]# /etc/init.d/httpd start
[root@redhat6_4 ~]# cd /var/www/html/
[root@redhat6_4 html]# rm -rf *
[root@redhat6_4 html]# echo "<h1>hello world </h1>" > index.html
[root@redhat6_4 html]# chmod 777 /var/www/html/ #修改權限最大化,方便測試
4、啟動rsync服務
[root@redhat6_4 ~]# rsync --daemon
[root@redhat6_4 ~]# netstat -anpt | grep ":873"
三、發起端使用rsync備份工具進行下行同步
1、使用rsync命令實現下行同步
[root@redhat6_5 ~]# rsync -avz [email protected]::page /root/ #訪問同步源模塊page,下載到本地/root目錄下進行備份
參數解析:
-r:遞歸模式,包含目錄及子目錄中的所有文件
-l:對於符號鏈接文件仍然復制為符號鏈接文件(軟鏈接)
-v:顯示同步過程的詳細(verbose)信息
-a:歸檔模式,保留文件的權限、屬性等信息,等同於組合選項"-rlptgoD"
-z:在傳輸文件時進行壓縮(compress)
-p:保留文件的權限標記
-t:保留文件的時間標記
-g:保留文件的屬組標記(僅超級用戶使用)
-o:保留文件的屬主標記(僅超級用戶使用)
-H:保留硬連接文件
-A:保留ACL屬性信息
-D:保留設備文件及其他特殊文件
--delete:刪除目標位置有而原始位置沒有的文件
--checksum:根據校驗和(而不是文件大小、修改時間)來決定是否跳過文件
[root@redhat6_5 ~]# mkdir /opt/pub
[root@redhat6_5 ~]# rsync -avz rsync://[email protected]/page /opt/pub/ #再次請求同步源服務將頁面備份到/opt/pub/下
2、刪除同步源服務器共享模塊文件測試
[root@redhat6_4 ~]# cd /var/www/html/
[root@redhat6_4 html]# rm -rf *
[root@redhat6_4 html]# echo "123" > file1#寫入測試文件
[root@redhat6_4 html]# echo "456" > file2
3、發起端再次發起下行同步
[root@redhat6_5 ~]# rsync -avzH --delete [email protected]::page /opt/pub/
4、引入周期性計劃任務,通過免密訪問進行同步管理
[root@redhat6_5 ~]# vim /etc/server.pass #創建用戶密碼文件
[root@redhat6_5 ~]# chmod 600 /etc/server.pass #密碼文件權限最小化,否則報錯
[root@redhat6_5 ~]# crontab -e
[root@redhat6_5 ~]# /etc/init.d/crond restart
[root@redhat6_5 ~]# chkconfig crond on
四、配置rsync+inotify實時同步
1、調整inotify內核參數
[root@redhat6_5 ~]# vim /etc/sysctl.conf
添加以下參數
fs.inotify.max_queued_events = 16384 #監控事件隊列
fs.inotify.max_user_instances = 1024 #最多監控實例數
fs.inotify.max_user_watches = 1048576 #每個實例最多監控文件數
[root@redhat6_5 ~]# sysctl -p #重新刷新文件
2、安裝inotify-tools
[root@redhat6_5 ~]# yum -y install gcc gcc-c++ #安裝編譯器
[root@redhat6_5 ~]# tar xvfz inotify-tools-3.14.tar.gz #解壓
[root@redhat6_5 ~]# cd inotify-tools-3.14
[root@redhat6_5 inotify-tools-3.14]# ./configure #配置
[root@redhat6_5 inotify-tools-3.14]# make && make install #編譯及編譯安裝
3、使用inotifywait命令進行監控測試
[root@redhat6_5 ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html #對本地網站目錄進行遞歸式實時監控,監控的事件包括修改、創建、移動、刪除……
-m:持續的進行監控
-r:遞歸整個目錄
-q:簡化
-e:指定監控的事件
modify:修改
create:創建
move:移動
delete:刪除
attrib:屬性更改
/var/www/html:對此目錄進行監控
4、對網站目錄內容進行增、刪、改、移
[root@redhat6_5 ~]# cd /var/www/html/
[root@redhat6_5 html]# touch abc.txt #創建測試文件
[root@redhat6_5 html]# echo "12345" > abc.txt #修改測試文件內容
[root@redhat6_5 html]# mv abc.txt fgh.txt #修改測試文件名稱
[root@redhat6_5 html]# rm -rf fgh.txt #刪除測試文件
5、查看監控信息
6、編寫觸發式同步腳本(將本地站點文件上行源端)
[root@redhat6_5 ~]# vim inotify_rsync.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/ [email protected]::page/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then
$RSYNC_CMD
fi
done解析腳本:
①.INOTIFY_CMD:執行實時監控
②.RSYNC_CMD:將本地網站目錄上行到源端
③.DIRECTORY EVENT FILE指動態監控的信息賦予給這三個變量變量
DIRECTORY :目錄,輸出的是/var/www/html
EVENT :發生事件,輸出的是如create、modify、move……
FILE:文件的名稱,輸出的是修改、新建的文件名稱
④.循環判斷此時此刻rsync是否在運行,如果沒有,將本地網站目錄上行至源端
[root@redhat6_5 ~]# chmod +x inotify_rsync.sh #添加執行權限
[root@redhat6_5 ~]# echo ‘/root/inotify_rsync.sh‘ >> /etc/rc.local #將輸出追加至/etc/rc.local中
7、修改同步源配置文件
[root@redhat6_4 ~]# vim /etc/rsyncd.conf
[root@redhat6_4 run]# kill -9 $(cat /var/run/rsyncd.pid) #殺死rsync進程
[root@redhat6_4 run]# rm -rf /var/run/rsyncd.pid #必須刪除進程文件,再次啟動,系統自動生成
[root@redhat6_4 ~]# rsync --daemon #啟動rsync
[root@redhat6_4 ~]# ll -d /var/www/html/ #查看站點權限
[root@redhat6_4 ~]# chown nobody:nobody /var/www/html/ #修改所有者、所屬組為nobody系統進程進程用戶
[root@redhat6_4 ~]# cd /var/www/html/
[root@redhat6_4 html]# rm -rf * #刪除站點目錄下的所有文件,方便測試
8、發起端運行同步腳本測試
[root@redhat6_5 ~]# chmod 777 /var/www/html/ #發起端修改權限,設置為最大化
[root@redhat6_5 html]# chown nobody:nobody /var/www/html/ #修改所有者、所屬組為nobody系統進程進程用戶
[root@redhat6_5 ~]# cd /var/www/html/
[root@redhat6_5 html]# rm -rf * #清空文件方便測試
[root@redhat6_5 ~]# sh -x inotify_rsync.sh #執行同步腳本
[root@redhat6_5 html]# echo "this is test html" > /var/www/html/index.html #創建測試頁面
9、同步源查看同步結果
[root@redhat6_4 ~]# cat /var/www/html/index.html
超詳細CentOS6.5配置rsync+inotify實現同步