1000000 / 60S 的 RocketMQ 不停机,扩容,平滑升级!
一、背景
1、各业务系统持续迭代过程中,JDK、SpringBoot、RocketMQ Client 等框架也进行了升级,高版本的 RocketMQ Client 发送的消息到低版本中,在控制台中午无法查看消息明细,致使业务日常排查问题等相当困难。
2、原业务端发送消息与本地事务很难做到一致性,要保障不丢失数据和数据不一致开发成本非常高,RocketMQ V4.4 版本增加了事务消息,引入事务消息后可大大降低实现这一特性的难度。
3、我们对 MQ 的依赖越来越强,MQ 的重要性和稳定性都已经可以和 DB 相当了,而 V4.x 版本增加了更多的新特性和监控手段,可以使我们更好的监控 MQ 的使用情况。
4、V4.x 版本由 Alibaba 维护移交到了 Apache 社区并有他进行维护,促使使用范围更广,也有更多的参与者参与进来,可靠性和及时响应性有了更高的保障。
5、新版本在吞吐率和对新的技术有了更好的支持,基于上述这些因素,我们考虑将 MQ 进行版本升级与改造。
6、升级版本 V3_2_6 -> V4.6.0
二、流程
因业务特性需求,对当前RocketMQ 集群进行不停机版本迭代升级,步骤如下。
请升级的架构师详细查看文档,进行查漏补缺以免造成不可挽回的事故
下面是此次升级使用的基础资料:
官方文档
https://rocketmq.apache.org/docs/quick-start/
https://rocketmq.apache.org/dowloading/releases/
Dledger 快速搭建指南:
https://github.com/apache/rocketmq/blob/master/docs/cn/dledger/quick_start.md
Apache RocketMQ 开发者指南:
https://github.com/apache/rocketmq/tree/master/docs/cn
升级前一定要熟读的两个架构图:
1、消息存储
2、消息刷盘
三、前期准备
1、当前环境版本状态
DEV: http://10.0.254.191:7080/ V3_5_8 2m
TEST: http://10.185.240.76:8081/ V3_5_8 2m
PRO:http://rocketmq.pro.siku.cn/ admin/secoo V3_2_6 2m
2、每个版本组件支持的jre环境
Version | Client | Broker | NameServer |
---|---|---|---|
4.0.0-incubating | >=1.7 | >=1.8 | >=1.8 |
4.1.0-incubating >=1.6 >=1.8 >=1.8 | |||
4.2.0 | >=1.6 | >=1.8 | >=1.8 |
4.3.x | >=1.6 | >=1.8 | >=1.8 |
4.4.x | >=1.6 | >=1.8 | >=1.8 |
4.5.x | >=1.6 | >=1.8 | >=1.8 |
4.6.x | >=1.6 | >=1.8 | >=1.8 |
4、升级时使用到的命令集合
启动
nohup sh bin/mqnamesrv &
nohup sh bin/mqbroker -c conf/2m-noslave/broker-b.properties &
broker的写权限关闭
bin/mqadmin updateBrokerConfig -b 192.168.x.x:10911 -n 192.168.x.x:9876 -k brokerPermission -v 4
恢复该节点的写权限
bin/mqadmin updateBrokerConfig -b 192.168.x.x:10911 -n 192.168.x.x:9876 -k brokerPermission -v 6
停止
bin/mqshutdown broker
bin/mqshutdown namesrv
查看集群信息,集群、BrokerName、BrokerId、TPS等信息
./bin/mqadmin clusterList -n localhost:9876
获取全部topic
./bin/mqadmin topicList -n localhost:9876 -c DevCluster > topiclist
获取topic 路由信息
./bin/mqadmin topicRoute -t demo-cluster -n localhost:9876
获取topic offset
./bin/mqadmin topicStatus -t demo-cluster -n localhost:9876
打印Topic订阅关系、TPS、积累量、24h读写总量等信息
./bin/mqadmin statsAll -n localhost:9876
修改broker 参数
./bin/mqadmin updateBrokerConfig -n localhost:9876 -b 10.0.xxx.2:10911 -k waitTimeMillsInSendQueue -v 500 -c TestCluster
发送消息
./bin/mqadmin sendMessage -n localhost:9876 -t lqtest -p "this is test"
消费
./bin/mqadmin consumeMessage -n localhost:9876 -t lqtest
5、官方版本特性收集
这里只标注了下重要的特性,有兴趣的可以查看 http://rocketmq.apache.org/release_notes/
4.0.0 (INCUBATING) 变为Apache
4.4.0 支持消息轨迹 、支持ACL
4.5.0 引入Dledger 的多副本技术
6、新集群4.6.0 集群模型选择
单Master模式
这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,可以用于本地测试。
多Master模式
一个集群无Slave,全是Master,例如2个Master或者3个Master,这种模式的优缺点如下:
优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高;
缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。
多Master多Slave模式-异步复制
每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:
优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;
缺点:Master宕机,磁盘损坏情况下会丢失少量消息。
多Master多Slave模式-同步双写(参考当前业务与并发度,选择此集群模式)
每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:
优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机
请结合自己的集群特点和稳定性进行选择升级,不一定最新的集群模式就是最适合你们得。一定要把平滑升级放在首位。
7、TOPIC 整理
可以写个脚本整理现有topic 目录,在升级完成后对topic 列表和分区进行整理校对。
因为topic在rocketmq的设计思想里,是作为同一个业务逻辑消息的组织形式,它仅仅是一个逻辑上的概念,而在一个topic下又包含若干个逻辑队列,即消息队列,消息内容实际是存放在队列中,而队列又存储在broker中
一定要进行特殊业务场景梳理 1)顺序消费 2)topic单broker配置
以免出现一个Topic只有一个queue的情况出现,导致消息丢失。随便找了个图,大家可以看下
8、新集群配置
brokerClusterName=MQCluster
brokerName=broker-ali-76
brokerId=0
deleteWhen=04
fileReservedTime=360
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
storePathCommitLog=/data/rocketmq/store/commitlog
storePathConsumerQueue=/data/rocketmq/store/consumequeue
storePathRootDir=/data/rocketmq/store
autoCreateSubscriptionGroup=true
## if msg tracing is open,the flag will be true
traceTopicEnable=true
listenPort=10911
namesrvAddr=10.48.xx.76:9876;10.48.xx.77:9876
四、升级步骤
当攻略做完以后,我们就可以开始搞起了。我选择的最终架构模式:多Master多Slave模式-同步双写
流程概述:
修改2m-2s-sync 、runbroker、runserver 配置参数
停掉3.2.6 nameserver 原IP PORT 启动4.6.0 nameserver,逐级替换完毕
停掉3.2.6 broker 启动4.6.0 broker(查看是否有单机topic问题),逐级替换完毕
测试集群稳定性,为新集群增加slave,升级完成
详细步骤:
准备操作
1、下载最新4.6.0版本部署包
cd /data/xxx_tomcat
wget http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.6.0/rocketmq-all-4.6.0-bin-release.zip
unzip rocketmq-all-4.6.0-bin-release
2、修改配置
cd /data/xxx_tomcat/rocketmq-4.6.0/conf/2m-2s-sync
修改51、50 机器broker配置
修改配置 2m-2s-sync
修改 runbroker JVM配置,以免使用了默认配置导致内存不够
3、两台M配置如下:
两台差别只在brokerName
brokerClusterName=MQCluster
brokerName=broker-60-50
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
storePathCommitLog=/data/alibaba-rocketmq/store/commitlog
storePathConsumerQueue=/data/rocketmq/store/consumequeue
storePathRootDir=/data/alibaba-rocketmq/store
autoCreateSubscriptionGroup=true
## if msg tracing is open,the flag will be true
traceTopicEnable=true
listenPort=10911
namesrvAddr=192.168.xxx.50:9876;192.168.xxx.51:9876
4、替换nameserver
jps -l
sh bin/mqshutdown namesrv
cd /data/xxx_tomcat/rocketmq-4.6.0
nohup sh bin/mqnamesrv &
./bin/mqadmin clusterList -n localhost:9876
5、替换broker
jps -l
sh bin/mqshutdown broker
cd /data/xxx_tomcat/rocketmq-4.6.0
ps -ef|grep mq //检查使用的配置文件
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b.properties &
./bin/mqadmin clusterList -n localhost:9876
最后我们来发个消息测试下
./bin/mqadmin sendMessage -n localhost:9876 -t lqtest -p "this is test"
./bin/mqadmin consumeMessage -n localhost:9876 -t lqtest
恭喜你到此你的集群就升级完毕了!!!
>原创不易,专注于分享技术干货文章的地方,可关注我获取更多神秘资料、视频资料,wx搜索:架构技术专栏
1000000 / 60S 的 RocketMQ 不停机,扩容,平滑升级!的更多相关文章
- RocketMQ 整合 DLedger(多副本)即主从切换实现平滑升级的设计技巧
目录 1.阅读源码之前的思考 2.从 Broker 启动流程看 DLedger 2.1 构建 DefaultMessageStore 2.2 增加节点状态变更事件监听器 2.3 调用 DefaultM ...
- RocketMQ从3.5.8升级到4.3.2版本实战记录
背景 我们在很早之前大约在2015年8月份左右我们开始使用Rocketmq作为公司消息中间件,那个时候RocketMQ还没有捐赠给Acaphe. RocketMQ版本还是3.2.6,中间升级了一次版本 ...
- 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版
背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...
- Nginx在线服务状态下平滑升级或新增模块的详细操作
今天应开发的需求,需要在Nginx增加一个模块,并不能影响现有的业务,所以就必须要平滑升级Nginx,好了,不多说了 1:查看现有的nginx编译参数 /usr/local/nginx/sbin/ng ...
- 让你的网站免费支持 HTTPS 及 Nginx 平滑升级
为什么要使用 HTTPS ? 首先来说一下 HTTP 与 HTTPS 协议的区别吧,他们的根本区别就是 HTTPS 在 HTTP 协议的基础上加入了 SSL 层,在传输层对网络连接进行加密.简单点说在 ...
- nginx 平滑升级tengine
wget http://tengine.taobao.org/download/tengine-1.5.1.tar.gz //下载Tengine1.5.1版本 tar zxvf tengine-1. ...
- 源码安装nginx以及平滑升级
源码安装nginx以及平滑升级 ...
- nginx平滑重启与平滑升级的方法
如何实现nginx平滑重启与平滑升级? 平滑重启 kill -HUP `cat /usr/local/www/nginx/logs/nginx.pid` 平滑升级nginx: cd /yujialin ...
- Nginx的平滑重启和平滑升级
一,Nginx的平滑重启如果改变了Nginx的配置文件(nginx.conf),想重启Nginx,可以发送系统信号给Nginx主进程的方式来进行.在重启之前,要确认Nginx配置文件的语法是正确的. ...
随机推荐
- UML活动图(Activity Diagram)
目录: 1.什么是活动图 2.活动图的构成 (1)起点 (2)重点 (3)活动名称 (4)判断条件 (5)同步条 (6)接收信号 (7)发送信号 (8)泳道 (9)转移 3.活动图实例--订单处理 4 ...
- Scala的安装和配置
1.Windows下搭建Scala开发环境 1)Scala需要Java运行时库,安装Scala需要首先安装JVM虚拟机并配置好,推荐安装JDK1.8 2)在http://www.scala-lang. ...
- eclipse git如何切换分支,拉取代码,合并代码,解决冲突等
(如果想看eclipse拉取git项目,移步到我上一篇文章)以下步骤是eclipse运用git的切换分支,拉取合并代码的基本操作: 1.切换远程分支:鼠标右键项目--team--switch to - ...
- 操作系统-中断(2)IA-32/Linux的向量中断方式
一.Intel定义下的异常和中断 不同体系和教材往往对异常和中断有不同的定义. Intel定义:中断是一种典型的由I/O设备触发的.与当前正在执行的指令无关的异步事件:而异常是处理器执行一条指令时,由 ...
- 计算机网络-链路层(2)多路访问控制协议(multiple access control protocol)
单一共享广播信道,如果两个或者两个以上结点同时传输,会互相干扰(interference) 冲突(collision):结点同时接收到两个或者多个信号→接收失败! MAC协议采用分布式算法决定结点如何 ...
- 不要再学 JSP 了,学 SpringBoot + Thymeleaf + Vue吧
老读者就请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 读 ...
- 精华技巧,学会这几招可以假装是Python高手
Python里面的技巧真的是太多了,菜鸟如何假装自己的是高手呢,下面教大家几招快速变成老司机的招数,尤其是在实战的项目中,用上这几招一定让你周围的同事刮目相看,哇这个代码有两把刷子. 很多人学习pyt ...
- android开发之当设置textview多少字后以省略号显示。限制TextView的字数
设置多少字后以省略号显示 <TextView android:id="@+id/tv" android:layout_width="wrap_conten ...
- eclipse android程序运行报错:Conversion to Dalvik format failed: Unable to execute dex:
[2013-06-19 16:59:01 - Dex Loader] Unable to execute dex: Multiple dex files define Landroid/support ...
- oeasy 教您玩转linux010101查看内核uname
linux([?l?n?ks]) 是什么????? 咱们这次讲点什么呢?这次咱们讲讲这个 linux([?l?n?ks]),什么是 linux([?l?n?ks])呢?这linux([?l?n?ks] ...