inotify + rsync 实时同步
一、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 [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实时同步配置完成