Skip to content

自动主从切换

suiyuzeng edited this page Jan 31, 2019 · 1 revision

1.方案简介

主从切换,一个主要问题是探活,不同的场景,对探活的要求也不同。此方案主要考虑场景是网络抖动和Broker内部分模块异常场景。一次主从切换,对业务方是有一定的影响的,尤其是顺序消费场景,实际生产环境中,部分网络设备抖动造成的短暂超时,很快能恢复,不切换影响会更小些;还有一部分异常,来自机器,如磁盘故障无法写入,zk抢占临时节点选主方式,不能检测此类异常。根据RocketMQ的天然优势,在nameserver处,通过发送消息的方式确认是否Broker可以正常工作,同时多个nameserver共同检测,提高检测的准确性,如下图;

具体切换流程如下:

  1. 各NameServer通过抢占特定的临时节点,选出Leader节点,只有Leader节点可以发起主从切换;
  2. 各NameServer向master节点发送消息,根据发送发送探活消息失败率是否超过阈值判断是否健康,并将此Brokername状态更新到NameServer节点中;
  3. NameServer的切换模块的Leader发现自己跟Broker的Master链接异常,然后检查其他节点NameServer是否也发现Master掉线,如果掉线数量超过阈值,启动切换流程;
  4. 如果Master存在,将Broker Master切换为Slave; 5.从原有的Slave中,选出Offset最大的Broker,并将其切换为Master;

2.部署

依赖zk,NameServer的配置文件中需要添加对应的配置项,并且配置启用自动主从切换;

  • zkPath:zk路径
  • roleSwitchEnable=true
  • clusterName:nameserver集群名称,会在zk路径下创建集群节点存储状态信息;

3.主要配置

  • detectIntervalMs,探活检测间隔,默认5000
  • roleAutoSwitchEnable,探活检测到异常,是否自动切换,默认true
  • lastContinuousFailCount,单台NameServer连续发送探测消息失败超过此值,认为Broker异常,默认5
  • unhealthyRateNsDetect,单台NameServer发送探测消息失败率超时此值,认为Broker异常,默认0.6f
  • unhealthyRateAllNs,NameServer中认为Master异常的的比例,超过此值,启动切换流程,默认2/3.0f

如果roleAutoSwitchEnable=false, Master异常后,需要手动发送切换,具体如下: ./mqadmin enableBrokerRoleSwitch -b brokername -c clustername -n nameservers


Clone this wiki locally