一、inotify概述
inotify: 用来监控文件系统的各种变化情况
如: 文件的存取、删除、移动、修改等,可以方便的实现文件异动告警、增量备份,并针对目录或者文件的变化及时做出响应
Linux内核的inotify机制:
(1)从版本2.6.13开始提供
(2)可以监控文件系统的变动情况,并且作出通知响应
(3)辅助软件:inotify-tools
二、为什么要实现实时同步
(1)定期备份的不足 (rsync+crond工具就是定期备份)
- 备份时间固定,延迟明显,实时性差
- 如果备份源长时间没有发生变化,而进行定期备份严重浪费资源
具体的概述和步骤请点击下面链接:
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 AAA@192.168.100.12::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实时同步配置完成