生产环境部署高可用RocketMQ


声明:这是我在大学毕业后进入第一家互联网工作学习的内容


背景

阿里云企业级RocketMQ费用较高,不如自建MQ,这个任务又交给我了,由于我正好认识一个RocketMQ社区的大佬,参与MQ的改良,找大佬取了下经。

RocketMQ介绍

简介

RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点:

能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力

选用理由:

  • 强调集群无单点,可扩展,任意一点高可用,水平可扩展。
  • 海量消息堆积能力,消息堆积后,写入低延迟。
  • 支持上万个队列
  • 消息失败重试机制
  • 消息可查询
  • 开源社区活跃
  • 成熟度(经过双十一考验)

关键概念

主题与标签

主题 Tpoic:第一级消息类型,书的标题

标签 Tags:第二级消息类型,书的目录,可以基于 Tag 做消息过滤

例如:

  • 主题: 订单交易
  • 标签:
    订单交易-创建
    订单交易-付款
    订单交易-完成

发送与订阅群组

生产环境部署高可用RocketMQ_第1张图片

生产组:用于消息的发送。

消费组:用于消息的订阅处理。

生产组和消费组,方便扩缩机器,增减处理能力,集群组的名字,用于标记用途中的一 员。每次只会随机的发给每个集群中的一员。

RocketMQ 集群方式

推荐的几种 Broker 集群部署方式,这里的 Slave 不可写,但可读,类似于 Mysql 主备方式。

单个 Master

这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用,不建议线上环境使用。

多 Master 模式

一个集群无 Slave,全是 Master,例如 2 个 Master 或者 3 个 Master

  • 优点:配置简单,单个 Master 宕机或重启维护对应用无影响,在磁盘配置为 RAID10 时,即使机器宕机不可恢复情况下,由与 RAID10 磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢)。性能最高。
  • 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息 实时性会受到受到影响。

启动方式:

  • 先启动 NameServer
  • 在机器 A,启动第一个 Master
  • 在机器 B,启动第二个 Master

多 Master 多 Slave 模式,异步复制

每个 Master 配置一个 Slave,有多对 Master-Slave,HA 采用异步复制方式,主备有短 暂消息延迟,毫秒级。

  • 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为 Master 宕 机后,消费者仍然可以从 Slave 消费,此过程对应用透明。不需要人工干预。性能同多 Master 模式几乎一样。
  • 缺点:Master 宕机,磁盘损坏情况,会丢失少量消息。

启动方式:

  • 先启动 NameServer
  • 在机器 A,启动第一个 Master
  • 在机器 B,启动第二个 Master
  • 在机器 C,启动第一个 Slave
  • 在机器 D,启动第二个 Slave

多 Master 多 Slave 模式,同步双写

每个 Master 配置一个 Slave,有多对 Master-Slave,HA 采用同步双写方式,主备都写 成功,向应用返回成功。

  • 优点:数据与服务都无单点,Master 宕机情况下,消息无延迟,服务可用性与数据可 用性都非常高
  • 缺点:性能比异步复制模式略低,大约低 10%左右,发送单个消息的 RT 会略高。目 前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。

启动方式:

  • 先启动 NameServer
  • 在机器 A,启动第一个 Master
  • 在机器 B,启动第二个 Master
  • 在机器 C,启动第一个 Slave
  • 在机器 D,启动第二个 Slave

以上 Broker 与 Slave 配对是通过指定相同的 brokerName 参数来配对,Master 的 BrokerId 必须是 0,Slave 的 BrokerId 必须是大与 0 的数。另外一个 Master 下面可以挂 载多个 Slave,同一 Master 下的多个 Slave 通过指定不同的 BrokerId 来区分。

总结

MQ每种部署方式都有优缺点,不过我们生产环境的业务是需要全程无人干预,不考虑性能情况,希望MQ高可用,做好监控报警规则即可。

综上我选择 多 Master 多 Slave 模式,异步复制模式

RocketMQ部署异步复制模式

部署环境双主双从异步复制,由于生产环境机器只配备了2台高性能主机,16c 32g,我准备做一个伪集群。

服务器环境

IP 角色
172.31.26.22 nameServer1,broker-a,broker-b-slave
172.31.26.23 nameServer2,broker-b,broker-a-slave

安装环境

需求 版本
操作系统 centos7.6
JDK 1.8
RocketMQ版本 rocketmq-all-4.3.2-bin-release.zip
RocketMQ控制台 rocketmq-console-ng-1.0.0.jar
RocketMQ目录 /opt
RocketMQ日志 /opt/rocketmq-all-4.3.2-bin-release/logs/
时间同步 ntpdate ntp1.aliyun.com

MQ安装包及控制台链接如下:

链接:https://pan.baidu.com/s/1QOv2deLsczD4QYXxQc1Juw
提取码:jui6

部署过程

将rocketmq-all-4.3.2-bin-release.zip、rocketmq-console-ng-1.0.0.jar放到任意一台服务器上,配置完成然后分发到其他服务器上即可。

解压

[root@VM-26-22 ~]# cd /opt/
[root@VM-26-22 ~]# unzip rocketmq-all-4.3.2-bin-release.zip

修改jvm启动参数

[root@VM-26-22 ~]# cd /opt/rocketmq-all-4.3.2-bin-release/bin
[root@VM-26-22 bin]# tree
.
├── cachedog.sh
├── cleancache.sh
├── cleancache.v1.sh
├── mqadmin
├── mqadmin.cmd
├── mqadmin.xml
├── mqbroker
├── mqbroker.cmd
├── mqbroker.numanode0
├── mqbroker.numanode1
├── mqbroker.numanode2
├── mqbroker.numanode3
├── mqbroker.xml
├── mqnamesrv
├── mqnamesrv.cmd
├── mqnamesrv.xml
├── mqshutdown
├── mqshutdown.cmd
├── os.sh
├── play.cmd
├── play.sh
├── README.md
├── runbroker.cmd
├── runbroker.sh
├── runserver.cmd
├── runserver.sh
├── setcache.sh
├── startfsrv.sh
├── tools.cmd
└── tools.sh

找到 runserver.sh 和broker.sh
查看系统参数

由于我不太懂jvm调优,但是大佬说32g的机器运行1个namesrv和2个borker就可以用官方自带的配置,不过以后我对这个参数调优会研究一下,先这么装吧。

vim runserver.sh
-server -Xms4g -Xmx4g -Xmn2g
vim runbroker.sh
-server -Xms8g -Xmx8g -Xmn4g

修改broker.conf

一共有4个配置文件,现在我们一次性配置好,由于有一些默认配置,不需要修改的我就没有列上,如果对消息队列自动开启topic及调整消息大小等有要求可以自行百度添加这些参数。

下面的配置的IP根据实际IP替换即可

注意:本配置默认不自动创建topic,需要手动添加

[root@VM-26-22 ~]# cd /opt/rocketmq-all-4.3.2-bin-release/conf/2m-2s-async
[root@VM-26-22 2m-2s-async]# tree
.
├── broker-a.properties
├── broker-a-s.properties
├── broker-b.properties
└── broker-b-s.properties

主节点broker配置

vim broker-a.properties

brokerClusterName=DefaultCluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
brokerIP1=172.31.26.22
#nameServer 地址,分号分割 
namesrvAddr=172.31.26.22:9876;172.31.26.23:9876 
#0 表示 Master,>0 表示 Slave 
brokerId=0 
#Broker 对外服务的监听端口
listenPort=10911 
#删除文件时间点,默认凌晨 4 点 
deleteWhen=04 
#文件保留时间,默认 48 小时 
fileReservedTime=24
#存储路径 
storePathRootDir=/opt/rocketmq-all-4.3.2-bin-release/store-a 
#Broker的角色
brokerRole=Master 
#刷盘方式  ASYNC_FLUSH  异步刷盘  SYNC_FLUSH  同步刷盘 
flushDiskType=ASYNC_FLUSH

vim broker-b.properties

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerIP1=172.31.26.23
namesrvAddr=172.31.26.22:9876;172.31.26.23:9876 
brokerId=0
deleteWhen=04
fileReservedTime=24
brokerRole=Master
flushDiskType=ASYNC_FLUSH
listenPort=10911
storePathRootDir=/opt/rocketmq-all-4.3.2-bin-release/store-b 


从节点broker配置

vim broker-a-s.properties

brokerClusterName=DefaultCluster
brokerIP1=172.31.26.23
namesrvAddr=172.31.26.22:9876;172.31.26.23:9876 
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=24
brokerRole = SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=10921
storePathRootDir=/opt/rocketmq-all-4.3.2-bin-release/store-a 

vim broker-b-s.properties

brokerClusterName=DefaultCluster
brokerIP1=172.31.26.22
namesrvAddr=172.31.26.22:9876;172.31.26.23:9876 
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=24
brokerRole = SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=10921
storePathRootDir=/opt/rocketmq-all-4.3.2-bin-release/store-b 

创建日志目录并分发

[root@VM-26-22 ~]#cd /opt/rocketmq-all-4.3.2-bin-release/

修改完成后将mq所有文件夹拷到每一台服务器上

[root@VM-26-22 ~]#scp -r /opt/rocketmq-all-4.3.2-bin-release  [email protected]:/opt/

启动

启动方式参考上面所说的,由于部署方式是伪集群,所以将机器C、D的从节点放到B、A机器上运行。

  • 先启动 172.31.26.22、172.31.26.23的NameServer
  • 在机器 172.31.26.22,启动第一个 broker-a
  • 在机器 172.31.26.23,启动第二个 broker-b
  • 在机器 172.31.26.23,启动第一个 broker-a-s
  • 在机器 172.31.26.22,启动第二个 broker-b-s
  • 在机器 172.31.26.22,启动rocketmq-console-ng-1.0.0.jar

先进入2台服务器分别启动NameServer

cd /opt/rocketmq-all-4.3.2-bin-release/bin
nohup sh mqnamesrv >/dev/null 2>&1 &

在机器172.31.26.22 执行

cd /opt/rocketmq-all-4.3.2-bin-release/bin
nohup sh mqbroker -c ../conf/2m-2s-async/broker-a.properties -n"172.31.26.22:9876;172.31.26.23:9876" > ../logs/broker-a.log 2>&1 &

在机器172.31.26.23 执行

cd /opt/rocketmq-all-4.3.2-bin-release/bin
nohup sh mqbroker -c ../conf/2m-2s-async/broker-b.properties -n"172.31.26.22:9876;172.31.26.23:9876" > ../logs/broker-b.log 2>&1 &

在机器172.31.26.23 执行

cd /opt/rocketmq-all-4.3.2-bin-release/bin
nohup sh mqbroker -c ../conf/2m-2s-async/broker-a-s.properties -n"172.31.26.22:9876;172.31.26.23:9876" > ../logs/broker-a.log 2>&1 &

在机器172.31.26.22 执行

cd /opt/rocketmq-all-4.3.2-bin-release/bin
nohup sh mqbroker -c ../conf/2m-2s-async/broker-b-s.properties -n"172.31.26.22:9876;172.31.26.23:9876" > ../logs/broker-b.log 2>&1 &

在机器172.31.26.22 找到rocketmq-console-ng-1.0.0.jar的目录 执行

nohup java -jar rocketmq-console-ng-1.0.0.jar --server.port=8080 --rocketmq.config.namesrvAddr='172.31.26.22:9876;172.31.26.23:9876' >/dev/null 2>&1 &

安装完成打开 http://172.31.26.22:8080 即可看到MQ控制台
生产环境部署高可用RocketMQ_第2张图片

总结

至此生产环境MQ搭建完成,本篇还有参数调优的方面没有介绍,而且部署方式也是伪集群,不是真正的高可用,如果有资源的话最好每台机器都部署一个broker,最后附上大佬博客,在此感谢。

http://wuwenliang.net/

参考资料

跟我学RocketMQ

Apache-RocketMQ

Github-RocketMQ


版权声明:

原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

你可能感兴趣的:(RocketMQ)