如何识别ActiveMQ Classic HA主从架构中的当前master broker
ActiveMQ Classic 共享JDBC主从集群当前Master节点识别方案
共享JDBC模式的Master/Slave集群选举完全基于共享MySQL库的排他锁实现,你可以通过以下三种可靠方式持续追踪当前生效的Master节点,故障转移发生后识别结果会自动同步更新:
- 查询共享MySQL库的锁持有状态
这是最准确的判定方式,集群中只有成功抢到ACTIVEMQ_LOCK表排他行锁的Broker才能作为Master对外提供服务,其余未拿到锁的节点会一直处于Slave待命状态,不会监听客户端连接。你可以定时执行如下SQL查询锁持有信息:
查询结果中返回的Broker信息就是当前的Master节点,故障转移完成后,旧Master会主动释放锁(或异常断开后锁被数据库自动回收),新晋升的Master抢到锁后,该表的查询结果会同步更新为新节点的信息。SELECT BROKER_NAME, BROKER_ID FROM ACTIVEMQ_LOCK; - 通过JMX接口遍历节点角色
你可以提前在所有Broker节点的配置中开启JMX远程访问,定时轮询所有集群节点的JMX MBean指标,找到BrokerService下Slave属性值为false的节点,即为当前运行的Master。故障转移发生后,新晋升Master的该属性值会自动从true切换为false,追踪时需要覆盖所有集群节点,不要固定轮询单个节点避免遗漏。 - 基于客户端故障转移监听器获取
如果是在业务客户端侧做跟踪,可以在使用failover传输协议连接集群时,注册官方提供的故障转移事件监听器,每次客户端完成故障切换、成功连接到新Master时,会触发连接成功事件,你可以直接从事件参数中拿到当前Master的实际连接地址,该结果和客户端实际可用的服务节点完全一致,不需要额外依赖数据库或JMX的访问权限。
注意:不要用单个节点的端口连通性作为Master判定依据,Slave节点在待命状态下不会开放客户端监听端口,仅靠端口探测容易在故障转移窗口期出现误判。
内容的提问来源于stack exchange,提问作者Areej Fatimah
相关产品推荐
相关产品推荐

