一、背景
ibmmq是一种传统架构的mq产品,运行稳定,有其自身优点,但在高可用(HA)这一块需要使用公司根据自身需求选用高可用(HA)产品,但由于市面HA商业产品较贵,所以使用linux操作系统级的heartbeat产品是最廉价合适的。关于ibmmq网络共享存储的选用有很多,最贴近生产环境的是ISCSI协议的存储,所以使用ISCSI做为mq服务器共享存储(下文有一点存储方面的知识)。
部署架构图:
二、解决思路
1、搭建共享存储环境;
2、安装heartbeat;
3、安装mq软件;
4、相关脚本补齐;
5、测试
三、使用技术栈及版本
1、linux版本:redhat6.7
2、共享存储,iscsi
Target版本:scsi-target-utils-1.0.24-18.el6.x86_64
Initiator版本:iscsi-initiator-utils-6.2.0.873-27.el6_9.x86_64
网络共享存储介绍:按照网络结构分:扫盲文章:http://www.ptyqm.com/19026.html
根据生产环境情况,只考虑两种共享存储实现
1)NAS:网络附加存储,NFS共享存储实现简单,方便使用,以文件系统的形式被使用,因为是以文件系统的方式提供,所以在数据传输速度上比较慢;
2)IP-SAN:IP存储通过TCP/IP协议实现,目前主要实现的协议有:iscsi(Internet Small Computer System Interface),可以在虚拟机实现,且贴近生产环境。
iscsi:一种文件块级别的协议,传输速度较快,通过tcp/ip共享存储设备。可以将本地磁盘做成lvm(逻辑卷管理),是在linux中对磁盘的分区的一种管理机制,是在磁盘分区和文件系统之间增加了一个逻辑层,为文件系统屏蔽磁盘分区布局,优点在于可以随时调节逻辑卷,增加或者减少空间。
iscsi在使用中区分为target端和initiator端,target端即为提供存储端,initiator端为使用网络存储端。
target和initiator端分别安装各种软件即可,安装好即可通过配置和命令使用。方便之处在于在initiator端看到的网络存储只相当于本地的一块磁盘,例如/dev/sdb,剩下的只需格式化后即可使用。
参考译文:https://linux.cn/article-4971-1.html
其后几篇都非常详细的介绍了iscsi的使用,原版英文在:https://www.tecmint.com/create-centralized-secure-storage-using-iscsi-targetin-linux/
都是良心好文。
3、高可用软件heartbeat
heartbeat软件是linux提供的,但需要单独安装的。安装在有需求的节点上即可。
这个软件可以将某一个网卡,例如eth0,虚拟一个ip对外提供,这个vip也是heartbeat中的resource,需要master和salve彼此使用。
这个软件可以通过心跳线(另一块网卡如eth1)与自己的salve或者master发送心跳包,已检测对方是否active,心跳间隔和判定died时间都可在配置文件中配置。
这个软件也可以不通过心跳线来做ha,但是缺点在于可能会产生脑裂现象,尤其在网络情况不好的情况下。
这里注意,心跳包是通过udp协议进行发送的,惊喜之处在于heartbeat不仅名字好听,而且不仅可以实现unicast,multicast还有broadcast也可以做,这样就可以通过这种方式实现集群的ha方案,这里先mark一下,有需要再进行研究。
heartbeat在使用时会有很多坑,下文会提。
推荐好文:https://www.cnblogs.com/zhanjindong/p/3618055.html
版本:heartbeat-3.0.4-2.el6.x86_64
当然在安装时不止这一个包,下文会提其他的包。
四、难点
1、搭建iscsi困难,对linux磁盘和存储关系及命令不熟悉;
2、安装软件缺依赖严重,生产环境为内网环境,必须将所有rpm下载齐全才可安装;
3、对于heartbeat原理的不熟知,不知道vip在其中是如何被使用的,且不知其切换过程;
4、在heartbeat主备软件切换时,关于脚本的书写不熟悉。
五、时间点预估
1、一天研究iscsi存储及其实现和基本原理,并搭建其环境,测试完成(侧重使用);
2、一天研究heartbeat安装过程,了解其原理,安装mq软件尝试配置;
3、一天测试heartbeat,观察其异常现象并分析解决;
4、总结实现过程,为上线准备安装包,梳理流程。
六、虚拟机实现
1、在LVM服务器配置iscsi的target服务器配置lvm以及配置target服务器的配置文件,使其本地lvm发布至网络;共享存储大小配置为10G;
本地创建好的lvm:
target服务器的/etc/tgt/targets.conf配置
再次检查iscsi的target服务器的对外发布情况
2、在MQMaster和MQSalve服务器安装iscsi的initiator并发现target服务的共享lvm,这里的坑在于target端的认证一定要齐。
在login到target服务器后,以后再次重启linux系统,都可以直接login到target上。
当login之后,可以在在本地磁盘上看到新的一块盘:
之后只需要给sdb创建一个新的分区,然后对新创建的分区进行格式化,就可以将存储mount到本地的任意一个目录之上了,从而和正常的文件系统一致,进行使用。
那么对于MQSalve而言,因为在MQMaster之上进行了对sdb创建分区的操作,那么在MQSalve上使用iscsi的话,需要进行对于sdb的格式化,然后mount操作即可。
这里经过多次实验,最好不要将共享网络存储同时mount在两个主备节点之上,目前会发现出现数据错误的情况,甚至会出现整个文件系统无法正常使用的情况。
3、在MQMaster和MQSalve分别安装mq软件;
4、安装heartbeat软件,在MQMaster和MQSalve上;
关于安装heartbeat,因为考虑生产环境为内网环境,无互联网接入,那么安装rpm包的依赖问题就成了大问题,这是一个极大的坑。
目前采用了先将软件包通过yum方式将所有的rpm包下载到了本地,然后拿出来进行整个目录rpm的安装。这里使用的小技巧为:
heartbeat软件分成了三个小项目,直接yum下载是不可以的。
yum install yum-plugin-downloadonly
这样就将所有的rpm下载了下来,到时候可以直接取到正式环境安装,如果再有关联短缺,那么可以通过同样方式进行下载其他相关rpm,这种方式总比去一个一个地找rpm要方便,尤其在没有运维的情况之下。
安装:
rpm -ivh ./rpms/*
5、配置heartbeat软件并踩坑。
安装好heartbeat软件后,其会默认在/etc下创建目录:ha.d
这时自己必须将3个配置文件:如上图红框,找到后cp过来。。。
天坑1:authkeys文件的权限只能是600,否则heartbeat一直会不停地报错,不知是heartbeat版本问题还是其他。。。
天坑2:自己写的脚本必须放在resource.d这个目录之下,进去后还会发现很多服务的相关脚本,这一点也没官方提示,找了半天。。。
关于authkeys这个文件的配置网上一拉一大把,随便拽一个,master和salve一致就可以用,但是必须是:
关于haresource文件的配置,哈,ha的资源文件:文件中提供了很多配置的说明,截取一段:
根据翻译,依照空格进行separate,第一位提供服务的域名,这点是小坑,注意一定要在hosts中增加域名配置,否则不生效。。。报错。。。第二是服务的ip地址可以有多个,可以指定网卡和默认的子网掩码,可以广播地址,最后是执行的脚本。。。
我的配置:MQMaster 192.168.0.208/24/eth0 mq,第一为主节点的名字,第二为vip和子网掩码以及指定vip的网卡,最后是我的脚本mq,这样配置主从节点必须一致,但在官方指导中,有这样一句话:
#They must match the names of the nodes listed in ha.cf, which in turn
# must match the `uname -n` of some node in the cluster. So they aren't
# virtual in any sense of the word.
主节点的名字hostname,必须在另一个配置文件ha.cf中出现,且指定出现的属性项为:node MQMaster,否则VIP会失败~
这里使用heartbeat注意,不需要先行创建VIP,heartbeat会自行根据haresource中的资源配置进行相应网卡的VIP创建,在heartbeat软件的认知中,VIP是一种及其重要的资源:启动heartbeat master后:
后文在日志中也可以看到heartbeat的启动过程。
关于ha.cf的配置:
这就比较简单了,完事后,通过service heartbeat stop/restart/start进行对服务的操作即可,此服务随操作系统启动,但据测试,坑的地方在于,有时候只启动master机器,它并不会拿来资源,而heartbeat服务却是运行状态,需要手动重启一下服务才可以。。。
6、分析heartbeat日志文件。
完成一次切换的过程大致就如日志所示,将MQMaster换成MQSalve就变得一致了。
7、测试heartbeat,得到测试结果。
不多讲解,唯一发现在网络环境不好的情况下,会经常发生脑裂的现象。。。恶略的结果就是损害网络存储。。。故心跳线是必须怼的。。。并且必须是直插。。。不能走交换机,不靠谱,否则一旦损毁存储,那么应用软件都得重新安装,事情是小,重点是。。。数据没了。。。所以共享存储做raid10也很重要。。。
七、致谢
感谢外公司两位同事之前的探究并提供了heartbeat的解决思路和mq软件的脚本。
感谢文章中的好文和一些网络文章,受益良多。