您的位置:首页 > 运维架构 > Linux

linux学习笔记-实时同步数据方案(inotify+rsync)

2017-11-06 23:44 405 查看
实时同步数据方案(inotify+rsync)

第1章 实现思路

1.1文件或目录监控

使用inotify工具对文件或目录实时监控。

1.2文件上传

使用rsync服务来上传文件或目录。

第2章 实现过程

2.1服务规划

2.1.1服务器规划表

rsync服务器端
1台
运行rsync进程,提供远程同步服务
rsync+inotify客户端
1台
监控文件或目录的变化后,通过rsync传输
说明:总共需要2台服务器完成本次项目

2.1.2主机IP规划表

服务器说明
IP地址
主机名称规则
rsync服务器端
172.16.1.41/24
backup
rsync+inotify客户端
172.16.1.8/24
web01

2.1.3主机名解析

172.16.1.41 backup
172.16.1.8 web01

2.2软件安装

backup服务器安装rsync服务端,安装过程参见前面文章。
web01服务器安装rsync客户端,inotify,安装过程参见前面文章。

2.3开发inotify客户端脚本

2.3.1创建需要监听的目录及文件

在web01服务器上用/backup目录来做测试:
[root@web01 ~]# mkdir /backup && ls -ld/backup
drwxr-xr-x 2 root root 4096 Nov  5 19:52 /backup

2.3.2实现监控功能

[root@web01 backup]# touch test    #<==在监控目录下创建一个test文件
[root@web01 ~]# /usr/bin/inotifywait -mrq--format '%w%f' -e create,delete /backup/  #<==目录监控
/backup/test

2.3.3实现文件传输功能

[root@web01 backup]# rsync -avz testrsync_backup@172.16.1.41::inotify_backup--password-file=/etc/rsync.password   #<==上传文件到指定的服务器
sending incremental file list
test

sent 61 bytes received 27 bytes  176.00bytes/sec
total size is 0 speedup is 0.00
[root@backup inotify_backup]# pwd &&ls  #<==验证上传的服务器
/inotify_backup
test

2.3.4开发脚本

在客户端开发脚本如下:
#!/bin/bash

#Defien var
Ip=`ifconfig eth1 | awk -F "[ :]+"'NR==2{print $4}'`
ServerIp=172.16.1.41     #<==这是Rsync服务端的地址
BackPath=/backup         #<==需要监控的某个目录
User=rsync_backup        #<==rsync的匿名访问用户
Moudle=inotify_backup    #<==rsync服务的模块
passwd=/etc/rsync.password   #<==rsync服务的客户端密码文件

#upload single file
function upload(){
rsync -az$file $User@$ServerIp::$Moudle/$Ip --password-file=$passwd
}
#full upload
function full_upload(){
cd$BackPath &&\
rsync -az--delete ./ $User@$ServerIp::$Moudle/$Ip --password-file=$passwd
}

#monitor paht /backup
function monitor(){
/usr/bin/inotifywait -mrq --format '%wf%' -eclose_write,delete $BackPath \
| while read file
do
if [ -f$file ];then
upload &>/dev/null
else
full_upload &>/dev/null
fi
done

}

function main(){
monitor
}
main

2.4结果测试

2.4.1运行脚本

因为是一个实时的监控服务,所以我们用后台运行&的命令来执行。
[root@web01 scripts]# pwd
/service/scripts
[root@web01 scripts]# ll
total 4
-rwxr--r-- 1 root root 855 Nov  5 20:24 inotify_monitor.sh
[root@web01 scripts]# /bin/sh inotify_monitor.sh&     #<==没有结果就是最好的结果
[root@web01 scripts]# jobs    #<==可以使用jobs命令来查看后台运行的脚本
[1]+ Running                 shinotify_monitor.sh &
查看脚本是否运行
[root@web01 backup]# jobs
[1]+ Running                 sh/service/scripts/inotify_monitor.sh &
结束后台运行的脚本
[root@web01 backup]# kill % 1    #<==这个1是jobs的进程号
[1]+ Terminated              sh/service/scripts/inotify_monitor.sh
[root@web01 backup]# jobs
[root@web01 backup]#

2.4.2创建文件测试

在监控目录下创建一个test文件,然后在服务器端查看结果。
[root@backup inotify_backup]# ll     #<==首先服务器端下面是空的
total 0
[root@web01 backup]# touch test    #<==客户端执行创建文件命令,生成一个test文件
[root@web01 backup]# ls
test
[root@backup inotify_backup]# ll   #<==查看服务器端生成了一个客户IP的文件夹
total 4
drwxr-xr-x 2 rsync rsync 4096 Nov  5 20:32 172.16.1.8
[root@backup inotify_backup]# tree172.16.1.8/   #<==可以看到该文件下面有新建的test文件,成功!
172.16.1.8/
└── test

0 directories, 1 file

2.4.3添加内容测试

[root@web01 backup]# echo "hello world">> test   #<==客户端给test文件添加字符
[root@web01 backup]# cat test
hello world
[root@backup inotify_backup]# cat172.16.1.8/test  #<==服务器端也同步过来了
hello world

2.4.4删除测试

[root@web01 backup]# rm -f test   #<==客户端删除文件
[root@web01 backup]# ls
[root@backup 172.16.1.8]# ll      #<==服务器端也没有文件了
total 0

2.4.5执行过程分析

[root@web01 backup]# sh -x/service/scripts/inotify_monitor.sh
++ ifconfig eth1
++ awk -F '[ :]+' 'NR==2{print $4}'
+ Ip=172.16.1.8
+ ServerIp=172.16.1.41
+ BackPath=/backup
+ User=rsync_backup
+ Moudle=inotify_backup
+ passwd=/etc/rsync.password
+ main
+ monitor
+ /usr/bin/inotifywait -mrq --format %w%f -eclose_write,delete /backup
+ read file

+ '[' -f /backup/test ']'
+ upload
+ rsync -az /backup/test rsync_backup@172.16.1.41::inotify_backup/172.16.1.8--password-file=/etc/rsync.password
+ read file
+ '[' -f /backup/test ']'
+ upload
+ rsync -az /backup/testrsync_backup@172.16.1.41::inotify_backup/172.16.1.8--password-file=/etc/rsync.password
+ read file
+ '[' -f /backup/test ']'
+ full_upload
+ cd /backup
+ rsync -az --delete ./rsync_backup@172.16.1.41::inotify_backup/172.16.1.8--password-file=/etc/rsync.password
+ read file

第3章 小结

1、inotify(sersync) + rsync,是文件级别的实时同步。
2、可以将脚本设置为开机启动,实时监控。
3、设置脚本后台运行命令:&;查看后台脚本:jps;结束运行kill % JID
4、第三方软件的同步功能:mysql同步,oracle,mongodb
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 实时同步