配置inotify + rsync 实现实时同步

一、inotify概述

  • inotify: 用来监控文件系统的各种变化情况
    如: 文件的存取、删除、移动、修改等,可以方便的实现文件异动告警、增量备份,并针对目录或者文件的变化及时做出响应
  • Linux内核的inotify机制:
    (1)从版本2.6.13开始提供
    (2)可以监控文件系统的变动情况,并且作出通知响应
    (3)辅助软件:inotify-tools

二、为什么要实现实时同步

(1)定期备份的不足 (rsync+crond工具就是定期备份)

(2)解决方案: 实时同步

  • 只要源服务器一发生变化,立即启动同步
  • 源服务器无变化,则不进行同步备份
    依托: inotify
    inotify+rsync结合: 实验触发式备份 (实时同步) ——只要原始位置的文档发生变化,立即启动增量备份,否则处于静默等待状态 (也就是什么也不做)
    我的理解是:
    定时同步,发起端相当于就是一个备份数据的角色,从同步源拿取数据,而实时同步,正好和定时同步反了过来,同步源承担了一个备份数据的角色,而发起端配置了inotify触发器,监控了想要同步的目录,向同步源发送数据,从而实现了实时同步
    上行同步(上传)

三、案例、步骤

服务器名称 扮演角色 ip地址
rsync1 发起端 192.168.100.11
rsync2 同步源 192.168.100.12

要求: 只要rsync1服务器的数据一发生变化,立即同步到rsync2服务器上

(1)rsync1(192.168.100.11)的配置

******调整inotify内核参数:监控事件队列、最多监控实例数、每个实例最多监控文件数
默认的:
[root@rsync1 ~]# cat /proc/sys/fs/inotify/max_queued_events 
16384
[root@rsync1 ~]# cat /proc/sys/fs/inotify/max_user_instances 
128
[root@rsync1 ~]# cat /proc/sys/fs/inotify/max_user_watches 
8192
修改sysctl.conf文件:
[root@rsync1 ~]# cat <<a>> /etc/sysctl.conf  /etc/sysctl.conf都是注释行所以可以直接追加内容)
> fs.inotify.max_queued_events = 16384
> fs.inotify.max_user_instances = 1024
> fs.inotify.max_user_watches = 1048576
> a
[root@rsync1 ~]# sysctl -p   (立即生效)
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
修改后再次查看:  (发现已经成功修改)
[root@rsync1 ~]# cat /proc/sys/fs/inotify/max_queued_events 
16384
[root@rsync1 ~]# cat /proc/sys/fs/inotify/max_user_instances 
1024
[root@rsync1 ~]# cat /proc/sys/fs/inotify/max_user_watches 
1048576
******安装inotify-tools软件,以便提供inotifywait、inotifywatch 辅助工具程序   
上传源码包
[root@rsync1 ~]# ll
总用量 356
-rw-------. 1 root root   1263 10  8 17:22 anaconda-ks.cfg
-rw-r--r--  1 root root 358772 12 22 17:58 inotify-tools-3.14.tar.gz
解压配置安装
[root@rsync1 ~]# tar zxvf inotify-tools-3.14.tar.gz 
[root@rsync1 inotify-tools-3.14]# ./configure && make && make install
[root@rsync1 inotify-tools-3.14]# cd
******测试,监控/var/www/html目录的变化 (因为要同步的目录是rsync2上的/var/www/html)
[root@rsync1 ~]# mkdir -p /var/www/html    (创建同步目录)
[root@rsync1 ~]# chmod 777 /var/www/html/
[root@rsync1 ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html/   
(监控/var/www/html 目录的修改、创建、移动、删除行为,ctrl+c退出)
·-m 表示持续监控   ·-r 表示递归整个目录   ·-q 简化输出消息    ·-e 指定监控哪些事件
·modify: 修改  ·create: 创建  ·move:移动  ·delete:删除  ·attrib  属性变化
[root@rsync1 ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html/   & (放到后台)
[1] 3614
[root@rsync1 ~]# cd /var/www/html/  (切换到/var/www/html目录)
[root@rsync1 html]# touch aaa   (创建或者删除等操作会有相应提示)
/var/www/html/ CREATE aaa
[root@rsync1 html]# ll
总用量 0
-rw-r--r-- 1 root root 0 12 23 04:46 aaa
[root@rsync1 html]# rm -rf aaa 
/var/www/html/ DELETE aaa
[root@rsync1 html]# ll
总用量 0
[root@rsync1 ~]# fg  (将后台进程放到前台)
inotifywait -mrq -e modify,create,move,delete /var/www/html/
^C  (ctrl+C退出)
******编写触发同步脚本
[root@rsync1 ~]# vim chufa.sh
#!/bin/bash
A="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html"
B="rsync -azH --delete --password-file=/root/pass /var/www/html [email protected]::aaa"
$A | while read DIRECTORY EVERT FILE 
do
$B
done
保存退出
————————————————————————————————————————————————————
·rsync -azH --delete --password-file=/root/pass /var/www/html ·AAA@192.168.100.12::aaa
·--password-file=/root/pass  (即指定查看密码的文件,不加的话得手动输入密码)
·/var/www/html  (要同步的目录,在这个目录中写入数据会进行同步)
·AAA@192.168.100.12::aaa  (AAA即用户名后面跟的是ip地址,aaa是共享模块名)
————————————————————————————————————————————————————
[root@rsync1 ~]# chmod +x chufa.sh 
******创建密码文件pass
[root@rsync1 ~]# echo "123.com" > pass  (新建一个文件写入密码)
[root@rsync1 ~]# chmod 600 pass   (降低权限)

(2)配置rsync2(192.168.100.12)同步源

******安装httpd,准备/var/www/html目录
[root@rsync2 ~]# mount /dev/cdrom /media/cdrom/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@rsync2 ~]# yum -y install httpd 
。。。。。。
完毕!
******建立/etc/rsyncd.conf配置文件
[root@rsync2 ~]# cat <<a>> /etc/rsyncd.conf
> use chroot = yes
> address = 192.168.100.12
>   port = 873
>   log file = /var/log/rsyncd.log
>   pid file = /var/run/rsyncd.pid
>   hosts allow = 192.168.100.0/24
>   fake super = yes    (加这个可以解决报错问题)
> [aaa]
> path = /var/www/html
> comment = aaaaa
> read only = no       (设置成no才拥有写入权限,yes是只读)
> dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
> auth users = AAA
> secrets file = /etc/rsync_users.db
> a
[root@rsync2 ~]# chmod 777 /var/www/html/ (设置权限方便发起端能够往本机上同步)
******创建备份用户账户数据文件
[root@rsync2 ~]# echo "AAA:123.com" >/etc/rsync_users.db  (用户名AAA密码123.com)
[root@rsync2 ~]# chmod 600 /etc/rsync_users.db  (设置权限保护)
******启动rsync服务
[root@rsync2 ~]# rsync --daemon   (启动rsync)
[root@rsync2 ~]# netstat -anpt | grep rsync  (监听端口发现已经成功启动)
tcp        0      0 192.168.100.12:873      0.0.0.0:*               LISTEN      15981/rsync    
******做完后切换到rsync1(192.168.100.11)发起端上
[root@rsync1 ~]# echo "/root/chufa.sh" >> /etc/rc.local  (把脚本添加到自运行当中)
[root@rsync1 ~]# ./chufa.sh &  (后台运行该脚本)
******这时切换到/var/www/html同步目录下创建一个新的文件
[root@rsync1 ~]# cd /var/www/html/ 
[root@rsync1 html]# touch aaa
[root@rsync1 html]# ll
总用量 0
-rw-r--r-- 1 root root 0 12 23 04:58 aaa
******切换到rsync2(192.168.100.12)同步源上,发现多了一个html目录,并且里面有一个文件aaa
[root@rsync2 html]# cd
[root@rsync2 ~]# cd /var/www/html/  (切换到实时同步的目录)
[root@rsync2 html]# ll   (发现有一个新的目录html)
总用量 0
drwxrwxrwx 2 nobody nobody 17 12 23 04:58 html
[root@rsync2 html]# cd html/  (切换到新的目录中)
[root@rsync2 html]# ll   (发现多了一个aaa文件)
总用量 0
-rw-r--r-- 1 nobody nobody 0 12 23 04:58 aaa
至此inotify+rsync实时同步配置完成

猜你喜欢

转载自blog.csdn.net/rzy1248873545/article/details/111505248