当全网部署了NFS存储后,如果提供NFS服务的设备宕机或者故障了,那么我们的与之相连的NFS客户端都会受到影响,严重可能会导致数据丢失,因此,为了防止单点故障,我们要给提供NFS服务的主机的数据目录做一个实时同步,这样NFS服务器宕机或者其他故障后,我们能很轻易的把备份节点设置为NFS的共享目录,让那些NFS客户端重新挂载NFS共享盘,这样可以尽量减少损失,提高服务满意度。
全网实时热备inotify+rsync
1. 为什么需要inotify?
当全网部署了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存储的安全性。
2. 安装inotify
- 下载源码包文件:inotify-tools-3.14.tar.gz
- 解压缩,并安装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
3. inotify的相关命令和参数介绍
- inotify 有两个工具,一个是inotifywait,这个的作用是在被监视的文件或目录上等待特定文件系统事件(open,close.delete等)的发生,执行后处于阻塞状态。另一个工具是inotifywatch,它的作用是在收集被监视文件系统使用度统计数据,指文件系统事件发生次数的统计。我们此次用来监控文件系统事件的发生是使用inotifywait工具。
- 常用参数有:
-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进行推送数据。
4. 在备份服务器上部署rsync daemon
- 创建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
- 创建密码文件,并设置相关权限,用来和rsync客户端匹配密码的。
[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
这里需要注意密码文件必须和配置文件里的相对应
- 创建rsync用户,设置为不需要登录,组也是rsync,需要注意的是这个用户要和配置文件里的uid=用户对应,而auth users = rsync-backup是个虚拟的用户可以不用管,这可以在一定程度上提高安全性,因为rsync的用户名不一定需要使用rsync,只要与配置文件里的uid=XX,对应上就好了。
[root@backup ~]# useradd -g rsync -M -s /sbin/nologin rsync
[root@backup ~]# grep rsync /etc/passwd
rsync:x:506:506::/home/rsync:/sbin/nologin
- 启动rsync daemon
[root@backup ~]# rsync --daemon
- 在对应的NFS服务器上也创建密码文件,用于来和服务端匹配密码如下:
[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
- 在NFS服务器上推送文件看看是否能成功推送
[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]#
5. 我们可以在NFS服务端部署脚本,让脚本监控到事件发生后调用rsync进行推送
[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
6. 进行对server和backup进行测试
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
7. 将inotify脚本设置为开机启动,这样两台服务器就可以永久实现实时同步
[root@backup data]# echo "sh /service/scripts/inotify.sh & " >>/etc/rc.local
8. inotify对应的优化参数:
在/proc/sys/fs/inotify目录下的max_queued_events 、max_user_instances、max_user_watches对inotify有一定的限制。其中:
- max_user_watches:设置inotifywaite或者inotifywatch命令可以监控的文件数量(单进程),可以设置为50000000。
[root@backup inotify]# echo "50000000" > /proc/sys/fs/inotify/max_user_watches
- max_user_instances:设置每个用户可以运行inotifywaite或者inotifywatch命令的进程数,默认是128,可以设置为50000000。
[root@backup inotify]# echo "50000000" > /proc/sys/fs/inotify/max_user_instances [root@backup inotify]# cat max_user_instances
50000000
- max_queued_events:设置inotify实例事件(event)队列可容纳事件的数量,默认是327679,可以设置为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