RocketMQ集群部署方式

RocketMQ网络部署图

RocketMQ网络部署图

RocketMQ网络部署图如下图所示:

RocketMQ网络部署图

RocketMQ网络部署特点

  • NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
  • Broker部署相对复杂,Broker分为MasterSlave,一个Master可以对应多个Slave,但是一个Slave只能对应一个MasterMasterSlave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId0表示Master,非0表示SlaveMaster也可以部署多个。每个BrokerNameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer
  • ProducerNameServer集群中的其中一个节点(随机选择)建立长连接,定期从Name ServerTopic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
  • ConsumerNameServer集群中的其中一个节点(随机选择)建立长连接,定期从Name ServerTopic路由信息,并向提供Topic服务的MasterSlave建立长连接,且定时向MasterSlave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。

NameServer集群

NameServer集群如下:

NameServer集群 IP地址
NameServer-1 192.168.1.101
NameServer-2 192.168.1.102

分别启动

# nohup sh bin/mqnamesrv &
# tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...

RocketMQ配置文件

众所周知,RocketMQ有多种集群部署方式,它们的配置文件也是分开的,如下:

# ls -rlt /usr/local/apache-rocketmq/conf
total 36
-rw-r--r-- 1 root root  3761 Jan 14 07:18 logback_tools.xml
-rw-r--r-- 1 root root  3836 Jan 14 07:18 logback_namesrv.xml
-rw-r--r-- 1 root root 14978 Jan 14 07:18 logback_broker.xml
-rw-r--r-- 1 root root   949 Jan 14 07:18 broker.conf
drwxr-xr-x 2 root root   118 Jan 14 07:18 2m-2s-sync
drwxr-xr-x 2 root root   118 Jan 14 07:18 2m-2s-async
-rw-r--r-- 1 root root   833 Jan 14 08:24 tools.yml
drwxr-xr-x 2 root root    91 Jan 14 08:24 2m-noslave
-rw-r--r-- 1 root root  1277 Jan 17 11:20 plain_acl.yml

说明:

2m-noslave:多Master模式
2m-2s-sync:多Master多Slave模式,同步双写
2m-2s-async:多Master多Slave模式,异步复制

RocketMQ默认提供的配置文件都是最基本的,很多配置都是默认值,在生产环境中我们需要根据实际情况进行修改。样例配置如下:

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a|broker-b
#0表示Master,>0表示Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=192.168.1.101:9876;192.168.1.102:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/alibaba-rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/alibaba-rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/alibaba-rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/alibaba-rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/alibaba-rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/alibaba-rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

Broker集群部署

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

单个Master

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

多Master模式

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

brokerName brokerId brokerRole IP地址
broker-a 0 ASYNC_MASTER 192.168.1.101
broker-b 0 ASYNC_MASTER 192.168.1.102

优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢失(异步刷盘丢失少量消息,同步刷盘一条不丢)。性能最高。

缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。

启动步骤:

(1)启动NameServer集群

(2)在192.168.1.101,启动第一个Master

# nohup sh bin/mqbroker -c conf/2m-noslave/broker-a.properties autoCreateTopicEnable=true &
# tail -f logs/rocketmqlogs/broker.log
The broker[%s, 192.168.1.101] boot success...

配置文件conf/2m-noslave/broker-a.properties

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
namesrvAddr=192.168.1.101:9876;192.168.1.102:9876
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

Broker启动状态

# sh bin/mqadmin clusterList -n localhost:9876
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
#Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
DefaultCluster    broker-a                0     192.168.1.101:10911    V4_4_0                   0.00(0,0ms)         0.00(0,0ms)          0 433638.17 0.0202
DefaultCluster    broker-b                0     192.168.1.102:10911    V4_4_0                   0.00(0,0ms)         0.00(0,0ms)          0 433638.17 0.0169

(3)在192.168.1.102,启动第二个Master

# mkdir logs
# nohup sh bin/mqbroker -c conf/2m-noslave/broker-b.properties autoCreateTopicEnable=true >logs/broker.log 2>&1 &
# tail -f logs/broker.log
The broker[%s, 192.168.1.102] boot success...

配置文件conf/2m-noslave/broker-b.properties

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
namesrvAddr=192.168.1.101:9876;192.168.1.102:9876
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

Broker启动状态

# sh bin/mqadmin clusterList -n localhost:9876
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
#Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
DefaultCluster    broker-a                0     192.168.1.101:10911    V4_4_0                   0.00(0,0ms)         0.00(0,0ms)          0 433638.26 0.0202
DefaultCluster    broker-b                0     192.168.1.102:10911    V4_4_0                   0.00(0,0ms)         0.00(0,0ms)          0 433638.26 0.0170

多Master多Slave模式,异步复制

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

brokerName brokerId brokerRole IP地址
broker-a 0 ASYNC_MASTER 192.168.1.101
broker-a 1 SLAVE 192.168.1.102
broker-b 0 ASYNC_MASTER 192.168.1.103
broker-b 1 SLAVE 192.168.1.104

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

缺点:Master宕机,磁盘损坏情况,会丢失少量消息。

启动步骤:

(1)启动NameServer集群

(2)在192.168.1.101,启动第一个Master

# mkdir logs
# nohup sh bin/mqbroker -n localhost:9876 -c conf/2m-2s-async/broker-a.properties >logs/broker.log 2>&1 &
# tail -f logs/broker.log

(3)在192.168.1.102,启动第一个Slave

# mkdir logs
# nohup sh bin/mqbroker -n localhost:9876 -c conf/2m-2s-async/broker-a-s.properties >logs/broker.log 2>&1 &
# tail -f logs/broker.log

(4)在192.168.1.103,启动第二个Master

# mkdir logs
# nohup sh bin/mqbroker -n localhost:9876 -c conf/2m-2s-async/broker-b.properties >logs/broker.log 2>&1 &
# tail -f logs/broker.log

(5)在192.168.1.104,启动第二个Slave

# mkdir logs
# nohup sh bin/mqbroker -n localhost:9876 -c conf/2m-2s-async/broker-b-s.properties >logs/broker.log 2>&1 &
# tail -f logs/broker.log

多Master多Slave模式,同步双写

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

brokerName brokerId brokerRole IP地址
broker-a 0 SYNC_MASTER 192.168.1.101
broker-a 1 SLAVE 192.168.1.102
broker-b 0 SYNC_MASTER 192.168.1.103
broker-b 1 SLAVE 192.168.1.104

优点:数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高。

缺点:性能比异步复制模式略低,大约低10%左右,发送单个消息的RT会略高。目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。

启动步骤:

(1)启动NameServer集群

(2)在192.168.1.101,启动第一个Master

# mkdir logs
# nohup sh bin/mqbroker -n localhost:9876 -c conf/2m-2s-sync/broker-a.properties >logs/broker.log 2>&1 &
# tail -f logs/broker.log

(3)在192.168.1.102,启动第一个Slave

# mkdir logs
# nohup sh bin/mqbroker -n localhost:9876 -c conf/2m-2s-sync/broker-a-s.properties >logs/broker.log 2>&1 &
# tail -f logs/broker.log

(4)在192.168.1.103,启动第二个Master

# mkdir logs
# nohup sh bin/mqbroker -n localhost:9876 -c conf/2m-2s-sync/broker-b.properties >logs/broker.log 2>&1 &
# tail -f logs/broker.log

(5)在192.168.1.104,启动第二个Slave

# mkdir logs
# nohup sh bin/mqbroker -n localhost:9876 -c conf/2m-2s-sync/broker-b-s.properties >logs/broker.log 2>&1 &
# tail -f logs/broker.log

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

总结

异步复制和同步双写总结

RocketMQ异步复制和同步双写对比

集群方式对比

集群方式 运维特点 消息可靠性
(master宕机情况)
服务可用性
(master宕机情况)
其他特点 备注
单Master 结构简单,扩容方便,机器要求低 同步刷盘消息一条都不会丢 整体可用,未被消费的消息无法取得,影响实时性 性能最高
多Master 异步有毫秒级丢失,同步双写不丢失 差评,主备不能自动切换,且备机只能读不能写,会造成服务整体不可写 不考虑,除非自己提供主从切换的方案
Master-Slave(异步复制) 结构复杂,扩容方便 故障时会丢失消息 整体可用,实时性影响毫秒级别,该组服务只能读不能写 性能很高 适合消息可靠性中等,实时性中等的要求
Master-Slave(同步双写) 结构复杂,扩容方便 不丢消息 整体可用,不影响实时性,该组服务只能读不能写 性能比异步低10%,所以实时性也并不比异步方式太高 适合消息可靠性略高,实时性中等、性能要求不高的需求

高可用演练场景

RocketMQ高可用演练场景

项目 发送消息 发送消息过程中 接收消费消息
停用一个namesrv 不影响通信 不影响通信 不影响通信
停用全部namesrv 影响通信 不影响通信 影响通信,启动任意的namesrv可恢复
停用单个master broker 不影响通信 不影响通信 不影响通信
停用全部master broker 影响通信 影响通信,无法恢复 影响通信
停用一个slave broker 不影响通信 不影响通信 不影响通信
停用全部slave broker 不影响通信 影响通信,数秒恢复 不影响通信,数秒恢复

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/19/rocketmq-cluster-deployment-method/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
RocketMQ集群部署方式
RocketMQ网络部署图 RocketMQ网络部署图 RocketMQ网络部署图如下图所示: RocketMQ网络部署特点 NameServer是一个几乎无状态节点,可集群部署,节点之间无……
<<上一篇
下一篇>>
文章目录
关闭
目 录