[TOC]
当全网部署了NFS存储后,如果提供NFS服务的设备宕机或者故障了,那么我们的与之相连的NFS客户端都会受到影响,严重可能会导致数据丢失,因此,为了防止单点故障,我们要给提供NFS服务的主机的数据目录做一个实时同步,这样NFS服务器宕机或者其他故障后,我们能很轻易的把备份节点设置为NFS的共享目录,让那些NFS客户端重新挂载NFS共享盘,这样可以尽量减少损失,提高服务满意度。
inotify是可以监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,使用起来也十分高效, 而rsync可以直接推送文件到远程daemon目录,而且支持增量备份。因此我们可以通过使用inotify监控到文件系统有创建,删除,修改后触发rsync进行同步推送到备份服务器里。于是如图所示,我们在备份服务器里搭建一个rsync daemon,并创建/backup用来专门与NFS存储的数据目录作为实时同步的远端目录,而在对应的NFS存储中安装inotify,用来对/data目录进行动态监控,一旦发现/data目录有创建,删除,修改后立刻触发rsync进行同步推送到备份服务器的/backup里,从而保证两端的数据一致性,增强NFS存储的安全性。
解压缩,并安装inotify,因为inotify是一个源码包文件,所以安装的时候注意,先要编译,通过--prefix=PATH指定编译安装的路径,然后在进行make和make install。安装完成后,因为源码安装是带程序的版本号的,最好做一个软链接把版本号去掉,这样在后续使用中会方便很多。另外安装后,在安装目录中会生成4个目录,bin (inotify的执行命令)、 include (inotify所需的头文件) 、lib (动态链接文件)、 share (帮助文档)。安装过程如下:
[root@server ~]# tar zxf inotify-tools-3.14.tar.gz
[root@server ~]# ls -l |grep "inotify-tools-3.14"
drwxrwxrwx. 5 1000 1000 4096 Mar 14 2010 inotify-tools-3.14
-rw-r--r--. 1 root root 358772 May 19 17:52 inotify-tools-3.14.tar.gz
[root@server ~]# cd inotify-tools-3.14
[root@server inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools-3.14/
[root@server inotify-tools-3.14]# make && make install
[root@server inotify-tools-3.14]# ln -s /usr/local/inotify-tools-3.14 /usr/local/inotify-tools
[root@server inotify-tools-3.14]# cd /usr/local/inotify-tools && ls
bin include lib share
-m :始终监控
-q:安静,不输出其他东西
-r:递归
-e:文件系统事件,文件系统事件常用参数有create,delete,close_write
具体可以查询帮助:[root@server bin]# ./inotifywait -help
常用语法:[root@server data]# /usr/local/inotify-tools/bin/inotifywait -mrq --format %w%f -e create,close_write,delete /data
3 . 对inotify进行测试,看看是否满足需求
[root@server data]# /usr/local/inotify-tools/bin/inotifywait -mrq --format %w%f -e create,close_write,delete /data
因为inotify开启后是时刻监控着/data目录,切处于阻塞状态,因此我们要么让它在后台运行,要么重新开一个窗口,因为我们需要清晰的看到监控的事件,因此重新再打开一个窗口。
Last login: Sun May 20 20:06:00 2018 from 192.168.50.50
[root@server ~]#
[root@server ~]# cd /data
[root@server data]# ls
a aaa bb cc dd file nnn
[root@server data]#
[root@server data]#
[root@server data]# rm -rf *
[root@server data]# ls
[root@server data]#
[root@server data]# /usr/local/inotify-tools/bin/inotifywait -mrq --format %w%f -e create,close_write,delete /data
/data/a
/data/aaa
/data/bb
/data/cc
/data/dd
/data/file
/data/nnn
由此我们可以看到了,inotify确实监控到了这些事件的发生,因此我们可以利用read这个变化来触发调用rsync进行推送数据。
[root@backup ~]# touch /etc/rsyncd.conf
[root@backup ~]# cat /etc/rsyncd.conf
#rsyncd-conf start
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file= /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore = errors
read only = false
list = false
hosts allow = 192.168.50.0/24
hosts deny = 0.0.0.0/32
auth users = rsync-backup
secrets file = /etc/rsync.password
#####################################
[backup]
comment = backup
path = /backup
[root@backup ~]# touch /etc/rsync.password
[root@backup ~]# echo "rsync-backup:root" >/etc/rsync.password
[root@backup ~]# cat /etc/rsync.password
rsync-backup:root
[root@backup ~]# chmod 600 /etc/rsync.password
[root@backup ~]# ls -l /etc/rsync.password
-rw-------. 1 root root 18 May 21 06:23 /etc/rsync.password
这里需要注意密码文件必须和配置文件里的相对应
[root@backup ~]# useradd -g rsync -M -s /sbin/nologin rsync
[root@backup ~]# grep rsync /etc/passwd
rsync:x:506:506::/home/rsync:/sbin/nologin
[root@backup ~]# rsync --daemon
[root@server data]# echo "root" > /etc/rsync.password
[root@server data]# chmod 600 /etc/rsync.password
[root@server data]# ls -l /etc/rsync.password -rw-------. 1 root root 5 May 14 20:44 /etc/rsync.password
[root@server data]# echo "hello" >file1
[root@server data]# rsync file1 rsync-backup@192.168.50.4::backup/ --password-file=/etc/rsync.password
在备份服务器查看是否推送成功
[root@backup ~]# cat /backup/file1
hello
[root@backup /]# cd /backup &&ls
backup file1
[root@backup backup]#
[root@server scripts]# cat inotify.sh
#!/bin/bash
inotify=/usr/local/inotify-tools/bin/inotifywait
$inotify -mrq --format ‘%w%f‘ -e create,close_write,delete /data | while read file
do
cd / &&
rsync -az /data --delete rsync-backup@192.168.50.4::backup/ --password-file=/etc/rsync.password
done
server端创建文件:
[root@server data]# rm -rf *
[root@server data]# touch a
[root@server data]# rm -rf *
[root@server data]# for n in `seq 1000` ;do touch file$n; done
[root@server data]# ls |wc -l
1000
backup端查看是否推送过来:
[root@backup backup]# cd data
[root@backup data]# ls
a
[root@backup data]#
[root@backup data]#
[root@backup data]# ls
[root@backup data]#
[root@backup data]# ls |wc -l
1000
[root@backup data]# echo "sh /service/scripts/inotify.sh &" >>/etc/rc.local
在/proc/sys/fs/inotify目录下的max_queued_events 、max_user_instances、max_user_watches对inotify有一定的限制。其中:
[root@backup inotify]# echo "50000000" > /proc/sys/fs/inotify/max_user_watches
[root@backup inotify]# echo "50000000" > /proc/sys/fs/inotify/max_user_instances [root@backup inotify]# cat max_user_instances
50000000
[root@backup inotify]# cat max_queued_events
327679
[root@backup inotify]# echo "50000000" > /proc/sys/fs/inotify/max_queued_events
[root@backup inotify]# cat max_queued_events
50000000
原文地址:http://blog.51cto.com/ouyangtao/2121825