背景

  我们在很早之前大约在2015年8月份左右我们开始使用Rocketmq作为公司消息中间件,那个时候RocketMQ还没有捐赠给Acaphe。

  RocketMQ版本还是3.2.6,中间升级了一次版本,目前版本是3.5.8。

  但是随着RocketMQ版本不断更新并且功能与稳定性也不断提高,所以打算升级为4.3.X版本

  上一次升级停机了10分钟不到还是很快的,这次的目标是不停机升级版本。(题外话,上次因为升级还燃起了一波“干架”)

架构深入了解

  先简单附上一张RocketMQ的整体架构图,通过架构图我们可以从中分析出几种不停机版本升级方案

  

  简单解释一下这个方案就是2主2从 多个nameserver,本公司架构一样,只是节点多了点而已,3主3从 2个nameserver

  通过这个架构图我们设想了几个错略方案

  1. 新加两台(一主一从)服务器Broker节点升级4.3.2,然后注册到Name Server(如果目前服务器可以承受压力可以不用新加),然后逐台切换最后在切换NameServer节点。
  2. 先替换一台NameServer节点,然后倒入相关topic等信息,然后切换Broker节点。
  3. 如果方案1 2 都不能实现不停机,那就只能申请同样资源服务器再架设一套,最后切换IP或host(RocketMQ可以依赖hostname或IP地址所以比较麻烦,同时之前数据不好做同步)。
  4. 最后的防线停机维护了,违背了不停机维护的初衷。

方案实践测试

  从方案1开始进行测试,

  我们将4.3.2版本的broker注册到NameServer3.5.8的版本上出现了如下错误:

 

  然后去看了源码

  

  报错了很明显这是两个版本不兼容有意为之,所以方案1被否定

  


  接下来我们尝试方案2

  让Broker3.5.8版本的节点注册到NameServer4.3.2版本的节点,我们开始

  现根据官方文档启动NameServer(v4.3.2)服务

  sh bin/mqnamesrv

  

  NameServer成功启动

  接下来我们启动broker(v3.5.8)服务

  sh bin/mqbroker -n IP:9876 -c conf/2m-2s-async/broker-a.properties

  

  启动成功,查看日志是否有异常

  

  没有抛出异常,注册成功,同时使用程序进行测试发送消息成功,这里程序代码就不贴上来了。

  控制台也显示正常

  

  从上面测简单测试来看方案2是基本可行的,接下来切换broker节点为4.3.2,看看是否文件兼容

  

  主从版本复制没有问题,同步OK,看看消息如何,如下图消息解析也没有问题

  

  接下来我们测试方案2的业务连续性

  通过上面的简单测试发现方案2可行 方案二如下

  

  接下来开始方案二的具体实施RocketMQ各节点平滑过渡切换步骤

  1、首先备份各种配置文件以防出现问题不能回滚,其中主要备份的有rocketmq程序包,store文件夹中的除commitlog文件夹外的文件(commitlog文件夹内容太多备份困难,并且从节点也有相同的一份,就没有备份)

  

  2、修改相关配置文件,主要针对4.3.2版本进行修改(有些不一定要改根据实际机器环境如jdk)

     包括如下runserver.sh runbroker.sh 修改堆栈内存大小适应宿主机,还有相应的jdk环境,如果没有设置JAVA_HOME的话

     设置相关文件的可执行权限一般有 os.sh runbroker.sh runserver.sh

      命令 chmod u+x os.sh runbroker.sh runserver.sh

      设置各个节点配置文件,2m-2s-async文件夹下的配置保持与上一个版本保持一致(尤其是存储路径store

    

  3、开始切换namesrv节点

    首先打开namesrv节点宿主机(老版本正在运行的)执行如下命令停止namesrv

    sh mqshutdown namesrv 

    

    停止成功

    启动4.3.2版本namesrv命令如下

    nohup sh bin/mqnamesrv &

    依次启动多个namesrv节点,并查看日志注意是否有异常

  4、开始切换broker节点

    步骤与切换namesrv类似不过broker节点有主从的概念

    首先找到集群中的一台master几点进行切换,执行如下命令关停主节点

    sh mqshutdown broker

    

    启动4.3.2版本broker命令如下

    nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties &

    启动之后日志如下

    

    

    接下来进行从节点启动切换

    步骤与主节点相同

    其他节点进行依次重启切换

    最后贴一张全部切换完成的图

    

总结

  通过上面的步骤已经接近完美的进行版本平滑升级,生产和消费几乎感觉不到,其实在过程当中是有卡顿现象出现的

  其中尤其要注意的是备份和新版本的各个配置文件要做好,否则会很恼火

  同时要留意主从之间数据差距不要太大

  还好我们生产环境只有6台服务器(3m-3s)加入有十几二十节点我手动改就要疯了,所以使用docker部署未尝不是一件可选方案

  在这里记录希望对大家有参考意义

RocketMQ从3.5.8升级到4.3.2版本实战记录的更多相关文章

  1. 升级python到2.7版本pip不可用

    升级python到2.7版本pip不可用 [root@localhost pip-7.1.2]# pip Traceback (most recent call last): File "/ ...

  2. 升级python的sqlite库版本

    今天了解了一下用python获取chrome cookie信息,在研究的过程中,发现打开数据库失败,后来调查了一下发现是由于sqlite3库太老的缘故,起码需要3.8以上,然后看了一下python 2 ...

  3. 出错场景是升级oracle驱动,将版本从ojdbc14升级到ojdbc6,hibernate执行原生态sql语句会报如下错误

    出错场景是升级oracle驱动,将版本从ojdbc14升级到ojdbc6,hibernate执行原生态sql语句会报如下错误:org.hibernate.MappingException: No Di ...

  4. 升级node后还是原来版本问题

    解决升级node后,已经安装了最新的版本,但是默认的node版本不是最新版本还是当前版本. 最近遇到个错误:The engine node is incompatible with this modu ...

  5. CentOS 6下gcc升级的操作记录(由默认的4.4.7升级到6.4.0版本)

    机房一台centos6.9机器部署了jenkins发布系统,开发人员在用node编译js,发现依赖的gcc版本低了,故需要将gcc升级到高版本(至少5.0版本以上),这里选择升级到6.4.0版本,下面 ...

  6. 升级 Elasticsearch 集群数量实战记录

    搜索引擎 升级 Elasticsearch 集群数量实战记录 现在线上有一个elasticsearch集群搜索服务有三台elasticsearch实例(es1.es2.es3),打算将其升级为5台(增 ...

  7. 快速升级openwrt的linux内核版本

    一.分析 要升级openwrt的linux内核版本,关键是要制作内核配置文件 二.内核配置文件制作方法 2.1当前openwrt对应的某个开发板有对应的内核配置文件,比如此时的openwrt的linu ...

  8. 在windows7系统下如何查看及升级powershell到3.0版本

    最近在学习.net core web api 开发,用到了Mysql.Data.EntityFrameworkCore框架,在根据数据库表生成对应实体类时提示必须先升级本机powershell到3.0 ...

  9. Mac卸载mysql并安装mysql升级到8.0.13版本

    引言 今天mysql升级到8.0.13版本,遇到了很多问题,在此进行总结方便以后查看. 卸载mysql brew uninstall mysql sudo rm /usr/local/mysql su ...

随机推荐

  1. sqlserver2012 在视图中建索引

      第一种 如果已经有视图但是要加索引只需要执行 以下SQL就好(前提是此视图必须                    绑定到架构) CREATE UNIQUE CLUSTERED INDEX in ...

  2. Windows Server 2016-OU组织单位日常操作

    技术无所谓贵贱,既然曾经做过就总该是要留下点什么,毕竟做技术这些年给我们留下太多太多的成长经历,总有人问这些已经很皮毛了为什么还要写,其实没那么多花哨理由,就是想着做或者不做这一块总是要对过往做个简单 ...

  3. Linux iptables用法与NAT

    1.相关概念 2.iptables相关用法 3.NAT(DNAT与SNAT) 相关概念 防火墙除了软件及硬件的分类,也可对数据封包的取得方式来分类,可分为代理服务器(Proxy)及封包过滤机制(IP ...

  4. Jason Wang:记录自己所想所得(第一次作业)

    这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 我在这个课程的目标是 学会现代软件工程的思想,运用到实际中去 这个作业在哪个具体方面帮助我实现目标 ...

  5. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十九║Vue基础: 样式动态绑定+生命周期

    回顾 哈喽大家好,前后端分离系列文章又开始了,今天周一,还是感谢大家花时间来观看我写的博客,周末呢,没有写文章,但是也没有闲着,主要是研究了下遗留问题,看过之前文章的应该知道,之前的在AOP使用Red ...

  6. 广告等第三方应用嵌入到web页面方案 之 使用iframe嵌入

    有些项目中可能会遇到这样的需求, 需要在一个项目中嵌入其他的项目的页面或者功能.并且需要这两个页面之间能够进行交互. 本文主要介绍如何实现这种第三方应用的嵌入, 主要有以下几个方向: 1.iframe ...

  7. Ocelot-基于.NET Core的开源网关实现

    写在前面 API网关是系统内部服务暴露在外部的一个访问入口,类似于代理服务器,就像一个公司的门卫承担着寻址.限制进入.安全检查.位置引导等工作,我们可以形象的用下图来表示: 外部设备需要访问内部系统服 ...

  8. swagger文档转换为WebApiClient声明式代码

    1 swagger简介 Swagger是一个规范且完整的框架,提供描述.生产.消费和可视化RESTful Web Service.其核心是使用json来规范描述RESTful接口,另外有提供UI来查看 ...

  9. 【大数据安全】CDH集群禁用Kerberos

    在调试Kerberos的时候可能会有需要禁用的场景.以下是各组件禁用Kerberos的相关配置. 环境 CDH版本:5.11.2 Linux版本:7.4.1708 Docker版本:Docker ve ...

  10. Linux高级命令进阶(week1_day2)--技术流ken

    输出重定向 场景:一般命令的输出都会显示在终端中,有些时候需要将一些命令的执行结果想要保存到文件中进行后续的分析/统计,则这时候需要使用到的输出重定向技术. >:覆盖输出,会覆盖掉原先的文件内容 ...