声明:这是我在大学毕业后进入第一家互联网工作学习的内容
背景
阿里云企业级RocketMQ费用较高,不如自建MQ,这个任务又交给我了,由于我正好认识一个RocketMQ社区的大佬,参与MQ的改良,找大佬取了下经。
RocketMQ介绍
简介
RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点:
能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力
选用理由:
- 强调集群无单点,可扩展,任意一点高可用,水平可扩展。
- 海量消息堆积能力,消息堆积后,写入低延迟。
- 支持上万个队列
- 消息失败重试机制
- 消息可查询
- 开源社区活跃
- 成熟度(经过双十一考验)
关键概念
主题与标签
主题 Tpoic:第一级消息类型,书的标题
标签 Tags:第二级消息类型,书的目录,可以基于 Tag 做消息过滤
例如:
- 主题: 订单交易
- 标签:
订单交易-创建
订单交易-付款
订单交易-完成
发送与订阅群组

生产组:用于消息的发送。
消费组:用于消息的订阅处理。
生产组和消费组,方便扩缩机器,增减处理能力,集群组的名字,用于标记用途中的一 员。每次只会随机的发给每个集群中的一员。
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 root@172.31.26.23:/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控制台

总结
至此生产环境MQ搭建完成,本篇还有参数调优的方面没有介绍,而且部署方式也是伪集群,不是真正的高可用,如果有资源的话最好每台机器都部署一个broker,最后附上大佬博客,在此感谢。
http://wuwenliang.net/
参考资料
版权声明:
原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。
本文详细介绍了一种基于RocketMQ的分布式消息中间件部署方案,包括多Master多Slave异步复制模式的配置过程,以及在两台高性能主机上的伪集群实现。
1904

被折叠的 条评论
为什么被折叠?



