大厂生产环境的RocketMQ都是这样部署的

昨天我们已经学习了RocketMQ的一些基本概念,架构设计和各个角色的功能。今天我们来聊聊RocketMQ的集群部署问题,关于RocketMQ的几种集群模式,你都知道吗,或者你们用的是哪一种集群模式呢?

集群模式

1、单Master模式

这种部署方式的风险比较大,一旦Broker宕掉,就会导致整个服务不可用,一般只在开发环境为了节约资源的时候使用,线上环境非常不建议使用。

2、多Master模式

这种模式会在一个集群中部署多个Master,没有Slave,这种模式也是存在一定的优缺点:

  • 优点:配置简单,单个Master宕掉其他几Master可以正常提供服务,在磁盘配置为RAID10时,消息基本上不会丢失,之所以不是百分百是因为异步刷盘可能会丢失少量消息,同步刷盘不会丢失消息。
  • 缺点:如果其中一个Master宕掉,这台机器上还没有消费的消息在恢复之前不能被消费,可能影响消息的消费时效。

3、多Master多Salve模式(异步)

每个Master配置一个Slave,有多对Master-Slave一起提供服务,HA采用异步复制方式,主备有很短暂的消息延迟,这种模式的优缺点:

  • 优点:即使磁盘损坏,也只是会丢失非常少的消息,消息的时效性也不会有影响,Master宕机后依然可以消费从Slave消费消息,并且这个过程不需要人工干预,性能和多Master模式接近。
  • 缺点:Master宕机磁盘损坏的情况下会丢失少量消息。

4、多Master多Slave模式(同步)

每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:

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

集群配置

以多Master多Salve模式-异步双写模式为例,看一下集群模式的启动:

1.启动NameServer

# 首先启动Name Server
$ nohup sh mqnamesrv &
 
# 验证Name Server 是否启动成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log

2.启动Broker集群

例如NameServer的IP为:192.168.1.1    192.168.1.2
# 在机器A,启动第一个Master
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a.properties &
 
# 在机器B,启动第二个Master
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b.properties &
 
# 在机器C,启动第一个Slave
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a-s.properties &
 
# 在机器D,启动第二个Slave
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b-s.properties &

机器A上部署的Master的配置文件:

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=192.168.1.1:9876;192.168.1.2: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/rocketmq/store
#commitLog 存储路径(可以自己修改)
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径(可以自己修改)
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径(可以自己修改)
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

机器C上部署的Slave配置文件:

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=192.168.1.1:9876;192.168.1.2: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/rocketmq/store
#commitLog 存储路径(可以自己修改)
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径(可以自己修改)
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径(可以自己修改)
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

机器B上的Master和机器D上的Slave和机器A、C上的配置文件除brokerName外全都一致。

需要注意的是,如果本地开发环境的配置不够高,需要修改runbroker.sh和runserver.sh两个文件,调整JVM参数,否则会启动失败

vi /usr/local/rocketmq/bin/runbroker.sh
# 开发环境配置 JVM Configuration
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"

vim /usr/local/rocketmq/bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

mqadmin管理工具

  1. 进入RocketMQ安装目录,在bin目录下执行命令方法:./mqadmin {command} {args}
  2. 几乎所有命令都需要配置-n表示NameServer地址,格式为ip:port
  3. 几乎所有命令都可以通过-h获取帮助
  4. 如果既有Broker地址(-b)配置项又有clusterName(-c)配置项,则优先以Broker地址执行命令,如果不配置Broker地址,则对集群中所有主机执行命令,只支持一个Broker地址。-b格式为ip:port,port默认是10911
  5. 在tools下可以看到很多命令,但并不是所有命令都能使用,只有在MQAdminStartup中初始化的命令才能使用,你也可以修改这个类,增加或自定义命令
  6. 由于版本更新问题,少部分命令可能未及时更新,遇到错误请直接阅读相关命令源码

相关的命令比较多可以在官网查看。

集群监控平台

incubator-rocketmq-externals这个项目是RocketMQ的一个扩展的开源项目,我们直接从github把这个项目clone下来,然后对其中的rocketmq-console模块进行编译打包,然后运行就可以了。

# 在打包前要闲配置我们的NameServer集群地址
rocketmq.config.namesrvAddr=192.168.1.1:9876;192.168.1.2:9876

git clone https://github.com/apache/rocketmq-externals
cd rocketmq-console
mvn clean package -Dmaven.test.skip=true

#启动rocketmq-console
java -jar rocketmq-console-ng-1.0.0.jar

启动成功后,就可以访问控制界面了:

更多高质量原创技术文可以关注我的公众号:故里学Java

你可能感兴趣的:(大厂生产环境的RocketMQ都是这样部署的)