• 基于使用ISCSI存储的ibmmq通过heartbeat实现HA方案以及碰到的问题总结


    一、背景

      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软件的脚本。

       感谢文章中的好文和一些网络文章,受益良多。

  • 相关阅读:
    App唤起微信小程序和回调
    微信小程序 — 自定义picker选择器弹窗内容+textarea穿透bug
    微信小程序的场景值scene
    微信小程序textarea层级过高(盖住其他元素)
    微信小程序如何修改本地缓存key中的单个数据
    微信小程序---查看更多的显示与隐藏
    微信小程序文字超过行后隐藏并且显示省略号
    Flutter 页面下拉刷新和上拉加载
    json转换成dart类 JSON to Dart
    Flutter 保持页面状态
  • 原文地址:https://www.cnblogs.com/qfxydtk/p/11460565.html
Copyright © 2020-2023  润新知