免费注册


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

2021-01-08 人浏览

昨天我们已经学习了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

  1. # 首先启动Name Server
  2. __ewebeditor__sepstr__a3nbsp;nohup sh mqnamesrv &
  3.  
  4. # 验证Name Server 是否启动成功
  5. __ewebeditor__sepstr__a3nbsp;tail -f ~/logs/rocketmqlogs/namesrv.log

2.启动Broker集群

  1. 例如NameServer的IP为:192.168.1.1    192.168.1.2
  2. # 在机器A,启动第一个Master
  3. __ewebeditor__sepstr__a4nbsp;nohup sh mqbroker -n 192.168.1.1:9876;192.168.1.2 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a.properties &
  4.  
  5. # 在机器B,启动第二个Master
  6. __ewebeditor__sepstr__a4nbsp;nohup sh mqbroker -n 192.168.1.1:9876;192.168.1.2 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b.properties &
  7.  
  8. # 在机器C,启动第一个Slave
  9. __ewebeditor__sepstr__a4nbsp;nohup sh mqbroker -n 192.168.1.1:9876;192.168.1.2 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a-s.properties &
  10.  
  11. # 在机器D,启动第二个Slave
  12. __ewebeditor__sepstr__a4nbsp;nohup sh mqbroker -n 192.168.1.1:9876;192.168.1.2 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b-s.properties &

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

  1. #所属集群名字
  2. brokerClusterName=rocketmq-cluster
  3. #broker名字,注意此处不同的配置文件填写的不一样
  4. brokerName=broker-a
  5. #0 表示 Master,>0 表示 Slave
  6. brokerId=0
  7. #nameServer地址,分号分割
  8. namesrvAddr=192.168.1.1:9876;192.168.1.2:9876
  9. #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
  10. defaultTopicQueueNums=4
  11. #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
  12. autoCreateTopicEnable=true
  13. #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
  14. autoCreateSubscriptionGroup=true
  15. #Broker 对外服务的监听端口
  16. listenPort=10911
  17. #删除文件时间点,默认凌晨 4
  18. deleteWhen=04
  19. #文件保留时间,默认 48 小时
  20. fileReservedTime=120
  21. #commitLog每个文件的大小默认1G
  22. mapedFileSizeCommitLog=1073741824
  23. #ConsumeQueue每个文件默认存30W条,根据业务情况调整
  24. mapedFileSizeConsumeQueue=300000
  25. #destroyMapedFileIntervalForcibly=120000
  26. #redeleteHangedFileInterval=120000
  27. #检测物理文件磁盘空间
  28. diskMaxUsedSpaceRatio=88
  29. #存储路径(可以自己修改)
  30. storePathRootDir=/usr/local/rocketmq/store
  31. #commitLog 存储路径(可以自己修改)
  32. storePathCommitLog=/usr/local/rocketmq/store/commitlog
  33. #消费队列存储路径存储路径(可以自己修改)
  34. storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
  35. #消息索引存储路径(可以自己修改)
  36. storePathIndex=/usr/local/rocketmq/store/index
  37. #checkpoint 文件存储路径
  38. storeCheckpoint=/usr/local/rocketmq/store/checkpoint
  39. #abort 文件存储路径
  40. abortFile=/usr/local/rocketmq/store/abort
  41. #限制的消息大小
  42. maxMessageSize=65536
  43. #flushCommitLogLeastPages=4
  44. #flushConsumeQueueLeastPages=2
  45. #flushCommitLogThoroughInterval=10000
  46. #flushConsumeQueueThoroughInterval=60000
  47. #Broker 的角色
  48. #- ASYNC_MASTER 异步复制Master
  49. #- SYNC_MASTER 同步双写Master
  50. #- SLAVE
  51. brokerRole=SYNC_MASTER
  52. #刷盘方式
  53. #- ASYNC_FLUSH 异步刷盘
  54. #- SYNC_FLUSH 同步刷盘
  55. flushDiskType=SYNC_FLUSH
  56. #checkTransactionMessageEnable=false
  57. #发消息线程池数量
  58. #sendMessageThreadPoolNums=128
  59. #拉消息线程池数量
  60. #pullMessageThreadPoolNums=128

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

  1. #所属集群名字
  2. brokerClusterName=rocketmq-cluster
  3. #broker名字,注意此处不同的配置文件填写的不一样
  4. brokerName=broker-b
  5. #0 表示 Master,>0 表示 Slave
  6. brokerId=1
  7. #nameServer地址,分号分割
  8. namesrvAddr=192.168.1.1:9876;192.168.1.2:9876
  9. #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
  10. defaultTopicQueueNums=4
  11. #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
  12. autoCreateTopicEnable=true
  13. #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
  14. autoCreateSubscriptionGroup=true
  15. #Broker 对外服务的监听端口
  16. listenPort=10911
  17. #删除文件时间点,默认凌晨 4
  18. deleteWhen=04
  19. #文件保留时间,默认 48 小时
  20. fileReservedTime=120
  21. #commitLog每个文件的大小默认1G
  22. mapedFileSizeCommitLog=1073741824
  23. #ConsumeQueue每个文件默认存30W条,根据业务情况调整
  24. mapedFileSizeConsumeQueue=300000
  25. #destroyMapedFileIntervalForcibly=120000
  26. #redeleteHangedFileInterval=120000
  27. #检测物理文件磁盘空间
  28. diskMaxUsedSpaceRatio=88
  29. #存储路径(可以自己修改)
  30. storePathRootDir=/usr/local/rocketmq/store
  31. #commitLog 存储路径(可以自己修改)
  32. storePathCommitLog=/usr/local/rocketmq/store/commitlog
  33. #消费队列存储路径存储路径(可以自己修改)
  34. storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
  35. #消息索引存储路径(可以自己修改)
  36. storePathIndex=/usr/local/rocketmq/store/index
  37. #checkpoint 文件存储路径
  38. storeCheckpoint=/usr/local/rocketmq/store/checkpoint
  39. #abort 文件存储路径
  40. abortFile=/usr/local/rocketmq/store/abort
  41. #限制的消息大小
  42. maxMessageSize=65536
  43. #flushCommitLogLeastPages=4
  44. #flushConsumeQueueLeastPages=2
  45. #flushCommitLogThoroughInterval=10000
  46. #flushConsumeQueueThoroughInterval=60000
  47. #Broker 的角色
  48. #- ASYNC_MASTER 异步复制Master
  49. #- SYNC_MASTER 同步双写Master
  50. #- SLAVE
  51. brokerRole=SLAVE
  52. #刷盘方式
  53. #- ASYNC_FLUSH 异步刷盘
  54. #- SYNC_FLUSH 同步刷盘
  55. flushDiskType=ASYNC_FLUSH
  56. #checkTransactionMessageEnable=false
  57. #发消息线程池数量
  58. #sendMessageThreadPoolNums=128
  59. #拉消息线程池数量
  60. #pullMessageThreadPoolNums=128

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

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

  1. vi /usr/local/rocketmq/bin/runbroker.sh
  2. # 开发环境配置 JVM Configuration
  3. JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"
  4. vim /usr/local/rocketmq/bin/runserver.sh
  5. 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模块进行编译打包,然后运行就可以了。

  1. # 在打包前要闲配置我们的NameServer集群地址
  2. rocketmq.config.namesrvAddr=192.168.1.1:9876;192.168.1.2:9876
  3. git clone https://github.com/apache/rocketmq-externals
  4. cd rocketmq-console
  5. mvn clean package -Dmaven.test.skip=true
  6. #启动rocketmq-console
  7. java -jar rocketmq-console-ng-1.0.0.jar

启动成功后,就可以通过http://localhost:8080访问控制界面了:

往期回顾

                                


(文章转自故里学Java,鸣谢)

上一篇: 容器底层---超细节的Namespace机制讲解
下一篇: 各角色如何从DevOps中受益?

相关文章