把[root@localhost 1 ~] 源服務器上的/var/www/html目錄時實同步到[root@localhost ~2]目標主機上的/web-back目錄中。html
概述linux
Linux內核從2.6.13版本開始提供了inotify通知接口,用來監控文件系統的各類變化狀況,如文件存取、刪除、移動等。利用這一機制,能夠很是方便地實現文件異動告警、增量備份,並針對目錄或文件的變化及時做出響應。使用rsync工具與inotify機制相結合,能夠實現觸發式備份(實時同步),只要原始位置的文檔發生變化,則當即啓動增量備份操做,不然處於靜態等侍狀態,這樣一來,就避免了按固定週期備份進存在的延遲性、週期過密等問題。git
環境 系統centos/6.9github
inotify-tools源端:xuegod-63 IP:192.168.153.128web
目標 端:[root@localhost ~2] IP:192.168.153.133vim
rsync 包 http://mirrors.163.com/centos/6.9/os/x86_64/Packages/rsync-3.0.6-12.el6.x86_64.rpmcentos
inotify 包 http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
bash
查看是否支持inotify,從kernel 2.6.13開始正式併入內核。服務器
[root@localhost 1 ~]# uname -rssh
2.6.32-220.el6.x86_64
[root@localhost 1 ~]# ls /proc/sys/fs/inotify/
max_queued_events max_user_instances max_user_watches
注:
在linux內核中,默認的inotify機制提供了三個調控參數:
max_queued_events #表示監控事件隊列
max_user_instances #表示最多監控實例數
max_user_watches #表示每一個實例最多監控文件數
查看具體參數值:
[root@localhost 1 ~]# cat /proc/sys/fs/inotify/max_queued_events
16384
[root@localhost 1 ~]# cat /proc/sys/fs/inotify/max_user_instances
128
[root@localhost 1 ~]# cat /proc/sys/fs/inotify/max_user_watches
8192
注:當要監控的目錄、文件數量較多或者變化較頻繁時,要加大這三個參數的值。
例如:可直接修改/etc/sysctl.conf配置文件,將管理隊列設爲32768,實例數設爲1024,監控數設爲9000000(建議大於監控目標的總文件數)
安裝 rsync
[root@localhost 1 ~]# tar zxvf rsync-3.1.2.tar.gz
[root@localhost 1 ~]# cd rsync-3.1.2
[root@localhost rsync-3.1.2]# ./configure && make && make install
自改配置文件
[root@localhost 1 ~]# vim /etc/syscrl.conf #以文件最後,添加如下內容
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 90000000
[root@localhost 1 ~]# sysctl -p #使修改後的sysctl.conf文件生效
安裝inotify-tools-3.13.tar:將擁有inotifywait、inotifywatch輔助工具程序,從而來監控、彙總文件系統改動狀況。
[root@localhost 1 ~]# tar -zxvf inotify-tools-3.13.tar.gz #進行都文件的解壓
[[root@localhost 1 ~]# cd inotify-tools-3.13
[root@localhost ~1 inotify-tools-3.13]# ./configure
[root@localhost ~1 inotify-tools-3.13]# make
[root@localhost ~1 inotify-tools-3.13]# make install
測試:
使用inotifywait命令監控網站目錄/var/www/html發生的變化。而後在另外一個終端向/var/www/html目錄下添加文件、移動文件,查看屏幕輸出結果。
[root@localhost ~1 ]# inotifywait -h
經常使用參數:
-e 用來指定要監控哪些事件。
這些事件包括: create建立,move移動,delete刪除,modify修改文件內容,attrib屬性更改。
-m 表示持續監控
-r 表示遞歸整個目錄
-q 表示簡化輸出信息。
報錯
inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open
shared object file: No such file or directory
[root@localhost 1 ~]# find / -name libinotifytools.so.0
/root/inotify-tools-3.14/libinotifytools/src/.libs/libinotifytools.so.0
/usr/local/lib/libinotifytools.so.0
這裏有兩種可能
操做系統上沒有安裝
操做系統找不到該庫
如圖所示 明明有安裝 說明是操做系統找不到
方法一:
echo "/usr/lib64/mysol" >> /etc/ld.so.conf
ldconfig
ld.so.conf動態連接庫裝載器,操做系統會根據這裏面寫的路徑去找庫。
ldconfig是告訴操做系統要引入新的變量了,須要從新識別一下。
方法二:
export LD_LIBRARY_PATH=/usr/local/inotify/lib:$LD_LIBRARY_PATH
/usr/local/inotify/lib爲該源碼包要用的庫的路徑,引入該環境變量的時候操做系統就會去找該變量下的類庫。
如今就能找到了
1.1上打開兩個終端
1終端上開啓監控
[root@localhost ~1 ]# inotifywait -mrq -e create,move,delete,modify /var/www/html/
#開啓的監控具備建立,移動,刪除和修改功能,監控到/var/www/html/下的數據變化‘
2終端上進行建立,移動,刪除等命令
[root@localhost 1 ~]# echo aaa > /var/www/html/a.htal
[root@localhost 1 ~]# mkdir /var/www/html/test
[root@localhost 1 ~]# cp /etc/passwd /var/www/html/test/
[root@localhost 1 ~]# rm -rf /var/www/html/test/passwd
查看1終端上的數據信息變化
[root@localhost 1 ~]# inotifywait -mrq -e create,move,delete,modify /var/www/html/
/var/www/html/test/ CREATE passwd
/var/www/html/test/ MODIFY passwd
/var/www/html/test/ DELETE passwd
#咱們能夠看到,剛纔在2終端上的命令意義在2終端上一一呈現出來了,這樣就成功的監視了/var/www/html/的數據變化狀況!使用inotifywait輸出的監控結果中,每行記錄中依次包括目錄、事件、文件。據此能夠識別變更狀況。
編寫觸發式同步腳本
第一步,
同步時不須要輸入密碼:
[root@localhost 1 ~]發生變化後,直接將發生變化的數據同步到[root@localhost ~2],同步時不須要輸入密碼
同步祕鑰
ssh-keygen -t rsa ##生成本主機的公鑰
公鑰生成成功存放在 /root/.ssh/id_rsa.pub
生成以後會在用戶的根目錄生成一個 「.ssh」的文件夾
進入「.ssh」會生成如下幾個文件
authorized_keys:存放遠程免密登陸的公鑰,主要經過這個文件記錄多臺機器的公鑰
id_rsa : 生成的私鑰文件
id_rsa.pub : 生成的公鑰文件
know_hosts : 已知的主機公鑰清單
若是但願ssh公鑰生效需知足至少下面兩個條件:
1) .ssh目錄的權限必須是700
2) .ssh/authorized_keys文件權限必須是600
[root@localhost.ssh]# scp -p /root/.ssh/id_rsa.pub root@192.168.153.133:/root/.ssh/authorized_keys
拷貝本身的公鑰到要登陸的服務器153.133上。
測試
[root@localhost .ssh]# ssh 192.168.153.133
Last login: Thu Sep 14 16:25:04 2017 from 192.168.153.128
[root@localhost ~]# exit
logout
Connection to 192.168.153.133 closed.
#已經成功無需密碼登錄遠程客戶端了
第二步:
編寫觸發式同步腳本
[root@localhost 1 ~]# vim a.sh
#!/bin/bash
inotifywait -mrq -e create,move,delete,modify /var/www/html/ | while read a b c
do
rsync -azP --delete /var/www/html/ root@192.168.153.133:/web-back
done
注意:
這裏的rsync連接是默認的ssh端口22 連接 因此ssh端口有改動這裏就要改變爲
rsync -azP --delete -e 'ssh -p xxx' /var/www/html/ root@192.168.153.133:/web-back
給腳本添加課執行權限
[root@localhost 1 ~]# chmod +x a.sh
清空一下/var/www/html/下的全部內容
[root@localhost 1 ~]# rm -rf /var/www/html/*
1終端上執行腳本
[root@localhost 1 ~]# ./a.sh
2終端上測試—拷貝文件及建立目錄
[root@localhost 1 ~]# cp -r /boot/grub/ /var/www/html/
[root@localhost 1 ~]# mkdir /var/www/html/test
[root@localhost 1 ~]# mkdir /var/www/html/111
1終端上查看執行腳本
[root@localhost 1 ~]# ./a.sh
wKiom1j4b6qD1080AAA1X7CBDhA744.png
看到
1.64上查看目錄
[root@localhost 2 ~]# ls /web-back/
111 grub test
開機啓動監控
[root@localhost 1 ~]# echo '/root/a.sh &' >> /etc/rc.local
優化此腳本:
[root@localhost ~1 ]# vim a.sh
#!/bin/sh
SRC=/var/www/html
DST=root@192.168.153.133:/web-back
inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read D E F
do
/usr/bin/rsync -ahqzt --delete $SRC $DST
done
[root@localhost ~1 ]# cp /root/a.sh /opt/inotify_rsync.sh
[root@localhost ~1 ]# echo '/opt/inotify_rsync.sh &' >> /etc/rc.local
另有更完整的 其餘操做
https://www.linuxidc.com/Linux/2017-05/143462.htm