在中标麒麟操作系统下实现async+inotify 数据同步

一、背景

我们为轻轨售检票系统搭建高可用服务,系统用的是中标麒麟7.2,HA软件也是用麒麟的,不要问我为啥选这么奇葩的方案😂。

我要实现的是正常工作状态下,将主机的数据同步到备机上,在主机宕机时,备机操作主机备份过来的数据,当主机恢复时,数据会同步回主机。中标麒麟的HA 不具备数据同步功能,问售后有没有同步数据的解决方案,得到的答案是用DRBD 可以解决,但是他们没有把握可以实现。既然他们都没有把握我还是自己想办法把。在网上查了一下数据同步的方法,觉得实现起来并没有那么复杂,下面我就将我实现的过程和使用起来感受整理一下,供大家参考。

二、实现

网上用async + inotify 实现数据同步的例子还是很多的。我是参照这个连接实现的:https://cloud.tencent.com/developer/article/1333909

inotify 是一种强大的、细粒度的、异步的文件系统事件控制机制,linux 内核从 2.6.13 起,加入了 inotify 支持,通过 inotify 可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 正是实施监控的软件。

我的两台服务器情况:

服务器名称  IP-addr  status  工具安装  系统版本  操作目录
数据服务器 192.168.10.62 client rsync、inotify-tools NeoKylinOS-V7.2(类似Centos7.2) /opt/ftp
备份服务器 192.168.10.52 server rsync、inotify-tools NeoKylinOS-V7.2(类似Centos7.2) /opt/ftp
           

安装和配置环境

async 这个功能是 linux系统默认安装的(只要linux内核不是很旧)inotify是需要安装的,具体的实现过程请参照:https://cloud.tencent.com/developer/article/1333909。我就不写重复的东西了。

编写inotify 脚本

大家在自己实现inotify 同步的时候肯会在自己的环境中遇到不一样的问题,在我的环境中遇到的主要是 同步数据的命令,以及inotify 脚本的编写。下面我把我自己的inotify 脚本贴出供大家参考。

制作inotify脚本,注册inofity为服务。写一个 inotify 脚本放到/etc/rc.d/init.d/ 目录下,/etc/rc.d/init.d/inotify start ,启动后,可以用systemctl start inotify.service 启动。inotify 脚本如下:

#!/bin/bash
#chkconfig: 2345 38 46
. /etc/init.d/functions

if [ $# -ne 1 ];then
usage: $0 |start|stop|
exit 1
fi

case "$1" in
start)
/bin/sh /etc/rsyncd/inotify.sh &
echo $$ > /var/run/inotify.pid
if [ `ps -ef | grep inotify | grep -v grep | wc -l` -gt 2 ];then
action "inotify service is started" /bin/true
else
action "inotify service is started" /bin/false
fi
;;
stop)
kill -9 `cat /var/run/inotify.pid` > /dev/null 2>&1
pkill inotifywait
sleep 1
if [ `ps -ef | grep inotify | grep -v grep | wc -l` -eq 0 ];then
action "inotify service is stopped" /bin/true
else
action "inotify service is stopped" /bin/false
fi
;;
*)
usage: $0 |start|stop|
exit 1
esac

inotify的脚本/etc/rsyncd/inotify.sh,创建inotify 脚本:

[root@afc21 ftp]# vim /etc/rsyncd/inotify.sh

#!/bin/bashq
host=192.168.100.22 #server的ip(备份服务器)
src=/opt/ftp/ #所要监控的备份目录(此处可以自定义,但是要保证存在)
des=ftp #自定义的模块名,需要与client端定义的一致
password=/etc/rsyncd/rsync.password #密码文件
user=root #用户名(一个实际存在的账号)
inotify=/usr/local/inotify #inotify的安装目录

${inotify}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files
do
rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

 

 

 

 

 


 


 

posted on 2019-08-19 19:21  拾掇的往昔  阅读(909)  评论(0编辑  收藏  举报

导航