因为当前生产环境RocketMQ机器使用年限较长,已通过保,而且其中一台曾经发生过异常宕机事件。而且早期网络规划较乱,生产、开发、测试等网络没有分开,公司决定对当前网络进行规划,区分各个环境网段、机柜,涉及到MQ集群须要迁移,因为物理机比较老旧,使用决定使用新机器替换老机器,而且以前的MQ集群为多master模式,当master宕机是会致使部分消息不可消费,决定将模式同时修改成多master多slave同步双写同步刷盘模式(本公司生产MQ压力较小,若是MQ压力大可使用异步刷盘模式)
执行该操做的缘由:因为公司RocketMQ早期上线是没有深刻研究,不少特性都不很了解,够用就行,不少地方没有考虑到。通过测试环境测试并查看生产MQ路由现象,发现若是topic首次发送的消息30秒内少于(N-1)*4+1个(N表示master个数),那么该topic路由只会存在部分broker上,这样会存在两个问题:1.topic没法达到负载均衡的效果 2.若是topic所在的broker宕机,会致使该topic没法生产及消费
topic路由更新方案(二选一,具体看你心情选择)
1.1.经过rocketmq控制台修改(生产验证经过)json
1.2.使用其余broker上的Topics.json文件替换本地,该文件在storePathRootDir配置项指定的的目录下config目录内,替换后重启服务生效(生产验证经过)服务器
注意事项:一般Topics.json文件会从当前MQ集群的第一台机器上拷贝。例,咱们当前生产MQ集群分别为158.7 158.8 158.9 ,集群中第一台broker为158.7,默认状况下若是不人为指定topic路由信息,其余两台可能不会存在因此的topic路由,可是,第一台(158.7)一般会都拥有因此topic的路由信息
1.首先先通知nameserver,我这台broker立刻要下线啦,不要再给我发消息啦,阿里提供的命令以下 sh mqadmin wipeWritePerm -b brokerName -n namesrvAddr 实际执行的命令为 sh mqadmin wipeWritePerm -b broker-a -n 172.16.158.7:9876 sh mqadmin wipeWritePerm -b broker-a -n 172.16.158.8:9876 sh mqadmin wipeWritePerm -b broker-a -n 172.16.158.9:9876 有几台nameserver就执行几回,虽然帮助问题提示能够以;符号为分隔符,一次写入多个,可是执行报错 2.等待1~2分钟后关闭当前broker(由于延迟类消息slave没法消费,因此略微多等一下) sh mqshutdown broker #关闭broker
碰到的问题: slave升级为master时,查看日志,日志文件有大量"WARN ScheduleMessageTimerThread - findMapedFileByOffset offset not ..." 日志,而且消息没法写入
解决方法:
删掉当前服务器storePathRootDir配置项指定的的目录下全部,在启动服务,拷贝其余服务器Topics.json到本地,在重启(生产验证经过,也许有更简单的方法,暂时没想到)