rsync+inotify
rsybc+inotify 企業案例
環境的描述:
將一臺mongod上面的數據實時同步到遠端的一臺主機
備份端172.16.1.88(rsync server)
備份源172.16.1.89(rsync client inotify mongod)
同步的目錄是/var/lib/mongo/,自動同步的順序172.16.1.89---172.16.1.88,我們配置rsync的服務器即可。
一、配置rsync服務端172.16.1.88
1.先使用rpm -qa命令查看系統中是否已經安裝了rsync軟件包。
[root@liuran ~]# rpm -qa | grep rsync
rsync-3.0.6-5.el6_0.1.x86_64
2.rsync安裝好之后沒有主機的配置文件,因此我們需要手動創建rsync的配置
[root@liuran ~]# vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 20
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[web_log]
path = /data/web_log/
ignore errors
read only = false
list = false
hosts allow = 172.16.1.89
auth users = backuser
secrets file = /etc/rsync.password
3.建立rsync用戶名和密碼文件
[root@liuran ~]# echo "backuser:123" >/etc/rsync.password
4.為/etc/rsync.password授權為600(這個文件)
[root@liuran ~]# chomo -R 600 /etc/rsync.password
到此,服務器端配置完成。
二、客戶端配置
1,設置rsync客戶端密碼文件,客戶端只需要設置rsync同步密碼即可,不用重設用戶名
2.將密碼文件的權限設置成600(這個文件權限必須是600)
[root@asdasda ~]# chmod -R 600 /etc/rsync.password
配置Inotify(在mongod配置)
http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
[root@asdasda ~]# tar zxf inotify-tools-3.14.tar.gz
[root@asdasda ~]# cd inotify-tools-3.14
[root@asdasda inotify-tools-3.14]# ./configure && make && make install
2.為了保證/var/lib/mongod目錄自動同步,配置好mongod的inotify后,寫一個inotify腳本。
[root@asdasda ~]# cat a.sh
#!/bin/bash
src=/var/lib/mongo/
des=web_log
ip=172.16.1.88
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib ${src} \
| while read file
do
rsync -vzrtopg --delete --progress $src backuser@172.16.1.88::$des --password-file=/etc/rsync.password > /dev/null 2>&1 && echo "$src was rsynced"
done
這個腳本的作用就是通過Inotify監控文件目錄的變化,進而觸發rsync進行同步操作。由于這個過程是一種主動觸發操作,是通過系統內核完成的,所以,比起那些遍歷整個目錄的掃描方式來,效率要高很多。
然后我們將此腳本放入后臺運行,輸入如下命令即可:
sh /root/rsync.sh&
接下來我們在mongod上面測試,插入數據,看是否實時的同步數據文件到172.16.1.88上面
編寫插入數據腳本
[root@asdasda mongo]# cat /root/b.sh
#!/bin/bash
for i in {1..2000}
do
mongo<<EOF
use testmongodb2000;
db.mongodb$i.save({name:'liufsfsf',age:1})
db.mongodb$i.save({name:'liufsf',age:2})
db.mongodb$i.save({name:'liufsfsfsd',age:3})
db.mongodb$i.save({name:'liufsffs',age:4})
db.mongodb$i.save({name:'liusfsfs',age:5})
exit;
EOF
done
執行腳本。
進入mongod存放數據的目錄下
[root@asdasda mongo]# ll
total 475628
drwxr-xr-x 2 mongod mongod 4096 Aug 26 13:51 journal
-rwxr-xr-x 1 mongod mongod 6 Aug 26 13:50 mongod.lock
-rw------- 1 mongod mongod 67108864 Aug 26 13:56 testmongodb2000.0
-rw------- 1 mongod mongod 134217728 Aug 26 13:56 testmongodb2000.1
-rw------- 1 mongod mongod 268435456 Aug 26 13:54 testmongodb2000.2
-rw------- 1 mongod mongod 16777216 Aug 26 13:56 testmongodb2000.ns
drwxr-xr-x 2 mongod mongod 4096 Aug 26 13:56 _tmp
172.16.1.88
進入指定備份目錄
[root@liuran web_log]# ll
total 213224
drwxr-xr-x 2 mongod mongod 4096 Aug 26 13:51 journal
-rwxr-xr-x 1 mongod mongod 6 Aug 26 13:50 mongod.lock
-rw------- 1 mongod mongod 67108864 Aug 26 13:56 testmongodb2000.0
-rw------- 1 mongod mongod 134217728 Aug 26 13:56 testmongodb2000.1
-rw------- 1 mongod mongod 16777216 Aug 26 13:54 testmongodb2000.ns
drwxr-xr-x 2 mongod mongod 4096 Aug 26 13:56 _tmp
表示已經同步過來。