一、配置rsync+inotify实时同步
### --- 配置rsync+inotify实时同步
~~~ #定期同步的缺点:
~~~ 当执行备份的#时间固定,延期明显,实时性差
~~~ 当同步源长期不变化时,密集的定期任务是不必要的(浪费资源)
~~~ #实时同步的优点:
~~~ 一旦同步源出现变化,#立即启动备份,实时性好
~~~ 只要#同步源无变化,则不执行备份,节省资源
### --- inotify简介
~~~ inotify是一个Linux内核特性,它监控文件系统,
~~~ 并且及时向专门的应用程序发出相关的事件警告,比如删除/读/写/卸载等操作,
~~~ 要使用inotify,必须具备一台带有2.6.13版本的内核操作系统
~~~ #inotify两个监控命令:
~~~ inotifywait:用于#持续监控,实时输出结果(常用)
~~~ inotifywatch:用于短期监控,任务完成后再出结果
二、inotify部署
### --- 安装编译工具
~~~ 在不知道你需要的软件是gcc还是gcc-c++,直接gcc*即可全部安装
[root@server21 inotify-tools-3.14]# yum install -y gcc*
### --- 部署在服务器端:
~~~ centos6.x:20.20.20.21 // 服务器端
### --- 将inotify-tools.zip上传到服务器
[root@server21 ~]# unzip inotify-tools.zip
[root@server21 ~]# cd inotify-tools
[root@server21 inotify-tools]# tar -zxvf inotify-tools-3.14.tar.gz
[root@server21 inotify-tools]# cd inotify-tools-3.14
[root@server21 inotify-tools-3.14]# ./configure && make && make install
### --- inotifywait命令格式
~~~ 格式:inotifywait -mrq -e 监控动作2 /监控目录&
~~~ 示例:inotifywait -mrq -e create,delete /filesrc &
~~~ -m:始终保持事件监听状态
~~~ -r:递归查询目录
~~~ -q:只打印监控事件的信息
### --- 监控动作:modify(内容),create ,attrib(权限),move,delete
[root@server21 ~]# inotifywait -mrq -e create,delete,modify /filesrc/ // 监控实时显示操作状态
/filesrc/ CREATE aaa
/filesrc/ DELETE 1.txt
/filesrc/ MODIFY aaa
[root@server21 ~]# touch /filesrc/aaa
[root@server21 ~]# rm -rf /filesrc/1.txt
[root@server21 ~]# echo "aaaaaaa">>/filesrc/aaa
### --- 利用rsync+inotifywait结合脚本实现单向实时同步
~~~ 注:用户登录时要求面密码验证
[root@server21 ~]# vim src.sh
#!/bin/bash
a="inotifywait -mrq -e create,delete,modify /filesrc" // 变量a
b="rsync -avz /filesrc/* root@20.20.20.22:/filedst" // 变量b
$a | while read directory event file
#while判断是否接受到监控记录 $a:执行变量a;$a只要有变化就传输给$b
do
$b
done
### --- 执行脚本放在后台执行
[root@server21 ~]# rm -rf /filesrc/*
[root@server22 ~]# rm -rf /filedst/*
[root@server21 ~]# bash ~/src.sh &
### --- 实验结果验证
~~~ 在服务器端创建,删除文件,查看备份端是否正常
~~~ 创建同步
[root@server21 ~]# touch /filesrc/a.txt
[root@server21 ~]# sending incremental file list
a.txt
[root@server22 ~]# ls /filedst/
a.txt
[root@server21 ~]# touch /filesrc/xxx.txt
[root@server21 ~]# sending incremental file list // 服务端自动执行
xxx.txt
sent 82 bytes received 31 bytes 75.33 bytes/sec
total size is 0 speedup is 0.00
~~~ 更改文件内容
[root@server22 ~]# ls /filedst/
a.txt xxx.txt
[root@server21 ~]# echo "1111111111aaaaaaaa" >>/filesrc/a.txt
[root@server21 ~]# sending incremental file list // 服务端自动执行
a.txt
sent 91 bytes received 31 bytes 81.33 bytes/sec
total size is 14 speedup is 0.11
echo "1111111111aaaaaaaa" >>/filesrc/a.txt
[root@server22 ~]# cat /filedst/a.txt
aaaaaaaaaaaaa
1111111111aaaaaaaa
拓展:跳整inotify监控的文件数量
调整inotify内核参数(/etc/sysctl.conf) | |
mak_queue_events | 监控队列大小 |
mak_user_instances | 是多监控实例数 |
max_user_watches | 每个实例最多监控文件数 |
三、配置unison+inotify实现双向实时同步
### --- 配置unison+inotify实现双向实时同步
~~~ rsync在单向同步上支持的非常好,且效率很高,但是在双向同步支持较差;
~~~ unison则是同步的优秀工具,但其缺点是#同步效率较低、
~~~ rsync单向同步就可以满足我们的需求,
### --- 环境要求
### --- 准备好同步所需的两个目录
~~~ 如若用root来实现登录的话,生成秘钥对,以便于免密码验证
~~~ 准备好inotify和unison的软件包
### --- 安装步骤:
[root@server21 ~]# rm -rf /filesrc/*
[root@server22 ~]# rm -rf /filedst/*
[root@server21 ~]# ps aux |grep bash // 停止脚本
root 4458 0.0 0.0 106072 1308 pts/2 S 11:37 0:00 bash /root/src.sh
root 4460 0.0 0.0 106072 816 pts/2 S 11:37 0:00 bash /root/src.sh
[root@server21 ~]# kill 4458
[root@server21 ~]# kill 4460
### --- 先安装inotify(客户端)
[root@server21 ~]# cp -a inotify-tools.zip /filesrc/ // 将文件传输到20.20.20.22下,
[root@server22 ~]# ls /filedst/
inotify-tools.zip
[root@server22 ~]# mv /filedst/inotify-tools.zip .
[root@server22 ~]# unzip inotify-tools.zip
[root@server22 ~]# cd inotify-tools
[root@server22 inotify-tools]# ls
inotify-tools-3.14.tar.gz ocaml-3.10.1.tar.gz unison-2.13.16.tar.gz
[root@server22 inotify-tools]# tar -zxvf inotify-tools-3.14.tar.gz
[root@server22 inotify-tools]# cd inotify-tools-3.14
[root@server22 inotify-tools-3.14]# yum install -y gcc**
[root@server22 inotify-tools-3.14]# ./configure && make && make install
### --- 再安装ocaml
[root@server22 inotify-tools-3.14]# cd ..
[root@server21 ~]# cd inotify-tools
[root@server21 inotify-tools]# tar -zxvf ocaml-3.10.1.tar.gz
[root@server21 inotify-tools]# cd ocaml-3.10.1
[root@server21 ocaml-3.10.1]# ./configure // 忽略所有报错
[root@server21 ocaml-3.10.1]# make world opt
[root@server21 ocaml-3.10.1]# make install
### --- 同步流程部署客户端ocml:20.20.20.22
### --- 安装unison(服务端,客户端)
[root@server21 ocaml-3.10.1]# cd ..
[root@server21 inotify-tools]# tar -zxvf unison-2.13.16.tar.gz
[root@server21 inotify-tools]# cd unison-2.13.16
[root@server21 unison-2.13.16]# make UISTYLE=text THREADS=true STATIC=true // 已经存在Makefile文件,不需要./configure
make[1]: [tags] Error 127 (ignored) // 错误:忽略即可
[root@server21 unison-2.13.16]# cp unison /usr/local/bin/ // 把生成的脚本拷贝出来
### --- 同步流程部署客户端unison:20.20.20.22
### --- 配置脚本
~~~ 注:双向自动同步,监控目录和数据同步时,源目录不能使用*通配符传输,
~~~ 否则会变成死循环。
~~~ #filesrc端
[root@server21 ~]# vim filesrc.sh
#!/bin/bash
a="inotifywait -mrq -e create,delete,modify /filesrc"
b="/usr/local/bin/unison -batch /filesrc/ ssh://20.20.20.22//filedst/"
#-batch:批处理
$a | while read directory event file
do
$b
done
[root@server21 ~]# bash filesrc.sh &
[1] 10586
~~~ filedst端
[root@server22 ~]# vim filedst.sh
#!/bin/bash
a="inotifywait -mrq -e create,delete,modify /filedst"
b="/usr/local/bin/unison -batch /filedst/ ssh://20.20.20.21//filesrc/"
#-batch:批处理
$a | while read directory event file
do
$b
done
[root@server22 ~]# bash filedst.sh &
[1] 10998
### --- 测试
~~~ 将两个脚本放入后台执行:bash filesrc.sh &
~~~ 分别在两个主机上创建主机查看是否可以实现双向实时同步(可能会有延迟)
### --- 创建同步
[root@server21 ~]# touch /filesrc/a.txt
[root@server21 ~]# Contacting server... // 自动执行命令
Looking for changes
[root@server22 ~]# Contacting server... // 客户端自动执行命令
[root@server22 ~]# ls /filedst/
a.txt
[root@server22 ~]# touch /filedst/1.txt
### --- 删除同步
[root@server22 ~]# rm -rf /filedst/1.txt
[root@server22 ~]# Contacting server... // 自动执行,删除的时候可能会有延迟,生产环境多检查
[root@server21 ~]# Contacting server... // 服务端自动执行
Looking for changes
[root@server21 ~]# ls /filesrc/
1.txt a.txt
### --- 改变文件内容
[root@server21 ~]# echo "1111111111aaaaaaaa" >>/filesrc/a.txt
[root@server21 ~]# Contacting server... // 自动执行
[root@server22 ~]# Contacting server... // 客户端自动执行
Contacting server...
[root@server22 ~]# cat /filedst/a.txt
1111111111aaaaaaaa
[root@server22 ~]# echo "aaaaaaaa111111111" >>/filedst/a.txt
[root@server22 ~]# Contacting server... // 自动执行
[root@server21 ~]# Contacting server... // 服务端自动执行
[root@server21 ~]# cat /filesrc/a.txt
1111111111aaaaaaaa
aaaaaaaa111111111