title: 全网实时热备inotify+rsync
tags: 备份,inotify,rsync


全网实时热备inotify+rsync

1 为什么需要inotify?

全网实时热备inotify+rsync
当全网部署了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

  1. 下载源码包文件:inotify-tools-3.14.tar.gz
  2. 解压缩,并安装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的相关命令和参数介绍

  1. inotify 有两个工具,一个是inotifywait,这个的作用是在被监视的文件或目录上等待特定文件系统事件(open,close.delete等)的发生,执行后处于阻塞状态。另一个工具是inotifywatch,它的作用是在收集被监视文件系统使用度统计数据,指文件系统事件发生次数的统计。我们此次用来监控文件系统事件的发生是使用inotifywait工具。
  2. 常用参数有:
-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

  1. 创建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
  2. 创建密码文件,并设置相关权限,用来和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
    这里需要注意密码文件必须和配置文件里的相对应
  3. 创建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
  4. 启动rsync daemon
    [root@backup ~]# rsync --daemon
  5. 在对应的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
  6. 在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有一定的限制。其中:

  1. max_user_watches:设置inotifywaite或者inotifywatch命令可以监控的文件数量(单进程),可以设置为50000000。
    [root@backup inotify]# echo "50000000" > /proc/sys/fs/inotify/max_user_watches
  2. 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
  3. 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