一、项目背景

  由于当前生产环境RocketMQ机器使用年限较长,已经过保,并且其中一台曾经发生过异常宕机事件。并且早期网络规划较乱,生产、开发、测试等网络没有分开,公司决定对当前网络进行规划,区分各个环境网段、机柜,涉及到MQ集群需要迁移,由于物理机比较老旧,使用决定使用新机器替换老机器,并且之前的MQ集群为多master模式,当master宕机是会导致部分消息不可消费,决定将模式同时修改为多master多slave同步双写同步刷盘模式(本公司生产MQ压力较小,如果MQ压力大可以使用异步刷盘模式)

二、多master多slave集群功能性测试及集群测试结果如下

三、迁移步骤及遇到问题和解决方案

1.更新当前topic路由负载到所有broker上

执行该操作的原因:由于公司RocketMQ早期上线是没有深入研究,很多特性都不很了解,够用就行,很多地方没有考虑到。经过测试环境测试并查看生产MQ路由现象,发现如果topic首次发送的消息30秒内少于(N-)*+1个(N表示master个数),那么该topic路由只会存在部分broker上,这样会存在两个问题:.topic无法达到负载均衡的效果 .如果topic所在的broker宕机,会导致该topic无法生产及消费
topic路由更新方案(二选一,具体看你心情选择)

1.1.通过rocketmq控制台修改(生产验证通过)

1.2.使用其他broker上的Topics.json文件替换本地,该文件在storePathRootDir配置项指定的的目录下config目录内,替换后重启服务生效(生产验证通过)

注意事项:通常Topics.json文件会从当前MQ集群的第一台机器上拷贝。例,我们当前生产MQ集群分别为158. 158.8 158.9 ,集群中第一台broker为158.,默认情况下如果不人为指定topic路由信息,其他两台可能不会存在所以的topic路由,但是,第一台(158.7)通常会都拥有所以topic的路由信息

2.依次修改当前生产MQ集群模式,由多master修改为多master多slave模式,并设置同步双写同步刷盘(后续模式看具体情况定),步骤忽略,会主从部署添加slave应该不在话下,此步操作无风险

3.关闭一台master,并等待slave消息消费完毕,注意下面的操作步骤:

.首先先通知nameserver,我这台broker马上要下线啦,不要再给我发消息啦,阿里提供的命令如下
sh mqadmin wipeWritePerm -b brokerName -n namesrvAddr
实际执行的命令为
sh mqadmin wipeWritePerm -b broker-a -n 172.16.158.7:
sh mqadmin wipeWritePerm -b broker-a -n 172.16.158.8:
sh mqadmin wipeWritePerm -b broker-a -n 172.16.158.9:
有几台nameserver就执行几次,虽然帮助问题提示可以以;符号为分隔符,一次写入多个,但是执行报错
2.等待1~2分钟后关闭当前broker(因为延迟类消息slave无法消费,所以略微多等一下)
sh mqshutdown broker #关闭broker

4.修改master的IP地址或者关机,修改slaveIP地址为master地址并修改配置文件为master模式,重启生效

碰到的问题:
slave升级为master时,查看日志,日志文件有大量"WARN ScheduleMessageTimerThread - findMapedFileByOffset offset not ..." 日志,并且消息无法写入
解决方法:
删掉当前服务器storePathRootDir配置项指定的的目录下所有,在启动服务,拷贝其他服务器Topics.json到本地,在重启(生产验证通过,也许有更简单的方法,暂时没想到)

5.参照3、4步骤依次修改其他两个broker集群

6.为新master添加slave

RocketMQ多master迁移至多master多slave模式的更多相关文章

  1. RocketMQ多Master多Slave模式部署

    每个 Master 配置一个 Slave,有多对Master-Slave,HA采用同步双写方式,主备都写成功,向应用返回成功. 优点:数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性 ...

  2. MySQL master/slave 模式

    1 .复制 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的 数据复制到其它主机(slaves)上,并重 ...

  3. ActiveMQ集群支持Master/Slave模式

    现在ActiveMQ, 在Failover方面有两种解决方案:Pure Master Slave和Shared File System Master Slave.      先看Pure Master ...

  4. hadoop的master和slave模式

    hadoop的集群是基于master/slave模式. namenode和jobtracker属于master,datanode和tasktracker属于slave,master只有一个,而slav ...

  5. Mysql在master上查看有哪些slave

    mysql> select * from information_schema.processlist as p where p.command = 'Binlog Dump'; 或 mysql ...

  6. redis配置master-slave模式

    由于云服务器存在闪断现象,项目线上会存在基于redis的功能在闪断时段内出现异常,所以redis需要做master-slave模式.直接上代码: 原单机redis,RedisConnectionFac ...

  7. jenkins的Master/Slave模式

    一. Master/Slave模式 分担jenkins服务器的压力,任务分配到其它执行机来执行 Master:Jenkins服务器 Slave:执行机(奴隶机).执行Master分配的任务,并返回任务 ...

  8. jmeter的master远程运行和停止slave

    jmeter可以部署成master-slave或者叫client-server模式,一个master(client)可以同时控制多个slave(server). 在linux系统下,master(cl ...

  9. Jenkins—Master/Slave模式

    Jenkins可部署在windows或者linux平台上,项目系统的用户多数为windows系统.如果Jenkins部署在linux上,而自动化任务要在windows平台执行,那么就需要使用Jenki ...

随机推荐

  1. windows 安装使用jupyter及 基础配置

    jupyter 是什么Jupyter Notebooks 是一个交互式笔记本,支持运行 40 多种编程语言,它的本质是一个 开源的 Web 应用程序,我们可以将其用于创建和共享代码与文档,他可以支持实 ...

  2. 【趣学程序】Linux上安装Tengine(Nginx)

    linux 安装tengine tengine是什么 tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳 ...

  3. Revit二次开发 屏蔽复制构件产生的重复类型提示窗

    做了很久码农,也没个写博客的习惯,这次开始第一次写博客. 这个问题也是折腾了我接近一天时间,网上也没有任何的相关博文,于是决定分享一下,以供同样拥有此问题的小伙伴们参考. 内容源于目前在做的一个项目, ...

  4. dependencies和devDependencies区别

    vue-cli3.x项目的package.json中,有两种依赖: dependencies:项目依赖.在编码阶段和呈现页面阶段都需要的,也就是说,项目依赖即在开发环境中,又在生产环境中.如js框架v ...

  5. vi 上下左右变ABCD乱码解决方法

    CentOS echo "set nocompatible" >> ~/.vimrc source ~/.vimrc debian sudo apt-get remov ...

  6. vuejs之路由应用之二

    现在我们开始一个应用: 一个应用中包含4个组件,我们暂且可以想象是4个页面,首先是App.vue,App.vue中又包含3个子组件:About.vue,Home.vue,Document.vue Ap ...

  7. js 常用工具方法

    1.格式化字符串 String.prototype.format = function () { let args = arguments; return this.replace(/\{(\d+)\ ...

  8. js对象比较

    使用闭包实现 js 对象按指定属性进行大小比较 需要比较的对象 let obj1 = { name:'张三', age:19 }; let obj2 = { name:'李四', age:22 }; ...

  9. [PHP] PDO对象与mysql的连接超时

    在php中每一个new的PDO对象,都会去连接mysql,都会创建一条tcp连接.当pdo对象赋予的变量是一个的时候,那么他只会保持一个tcp连接,没有被引用的对象连接会直接断掉.如果不对这个对象进行 ...

  10. vue中显示原网页代码--codemirror

    在项目中遇到了一个需求,后台返回string类型的html源码,要求前端这边按照codeview这种类型把这个源码展示出来.现总结如下 1.如果没啥样式的需求,只是要求该缩进缩进的话,可以直接使用in ...