翼度科技»论坛 云主机 服务器技术 查看内容

docker安装RocketMQ的实现(附填坑经验connect to failed)

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
本人安装版本:最新版(rocketmq-4.4.0),以下均对应4.4.0版本

一、docker部署RocketMQ


1、简易说明

在RocketMQ中,有三个关键组件:Namesrv(Name Server)、Broker和Console-ng(管理控制台)。

  • Namesrv(Name Server):Namesrv是RocketMQ的命名服务,负责管理整个RocketMQ集群的路由信息。每个RocketMQ集群中都至少需要一个Namesrv实例。它维护了Broker的网络信息、Topic的路由规则以及Consumer的消费进度等元数据,并提供给Producer和Consumer使用。
  • Broker:Broker是RocketMQ的消息存储和处理节点,负责存储消息、处理消息的读写请求和转发消息等功能。在RocketMQ集群中,可以有多个Broker实例,各个Broker通过与Namesrv交互来维护消息的元数据和路由信息,以实现高可用、负载均衡的消息传输。
  • Console-ng(管理控制台):Console-ng是RocketMQ官方提供的管理控制台,用于管理和监控RocketMQ集群。它提供了图形化界面,可以进行Topic、Consumer等的配置管理、消息查询与追踪、监控指标展示等操作。Console-ng对于集群的监控和运维非常有用。
这三个组件共同构成了RocketMQ的核心架构,并协同工作以实现高可用、高性能的消息传输和数据管理。您可以通过启动Namesrv、Broker来搭建一个RocketMQ集群,并使用Console-ng进行集群的管理与监控。

2、docker拉取RocketMQ镜像\RocketMQ控制台

拉取最新的RocketMQ,如果下载指定版本可以去docker官网查看
注:Namesrv、Broker均采用rocketmqinc/rocketmq同一个镜像
  1. # 最新(rocketmq)
  2. docker pull rocketmqinc/rocketmq
  3. # 指定版本号(rocketmq)
  4. docker pull rocketmqinc/rocketmq:<版本号>

  5. # 最新(RocketMQ控制台)
  6. docker pull  pangliang/rocketmq-console-ng
复制代码
3、获取RocketMQ配置文件

可以启动RocketMQ,然后从docker容器中拷贝出配置文件,拷出配置文件后启动的容器就可以删除了
  1. docker run -d --name rmqnamesrv -p 9876:9876 rocketmqinc/rocketmq:latest sh mqnamesrv
  2. # 进入容器(用于进入容器找到broker.conf 的位置)
  3. docker exec -it 容器ID /bin/bash
  4. # 从容器中下载文件到虚拟机
  5. docker cp 容器ID:/opt/rocketmq-4.4.0/conf/broker.conf 虚拟机路径
复制代码
4、RocketMQ配置文件描述
  1. ongPollingEnable=true
  2. offsetCheckInSlave=false
  3. # nameServer地址,分号分割
  4. namesrvAddr=172.16.234.150:9876
  5. fetchNamesrvAddrByAddressServer=false
  6. #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
  7. autoCreateSubscriptionGroup=true
  8. #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
  9. autoCreateTopicEnable=true
  10. sendThreadPoolQueueCapacity=100000
  11. clusterTopicEnable=true
  12. filterServerNums=1
  13. pullMessageThreadPoolNums=20
  14. # broker名字,名字可重复,为了管理,每个master起一个名字,他的slave同他,eg:Amaster叫broker-a,他的slave也叫broker-a
  15. brokerName=knBroker
  16. #rocketmqHome=/usr/local/alibaba-rocketmq/
  17. sendMessageThreadPoolNums=24
  18. # 0 表示 Master,>0 表示 Slave
  19. brokerId=0
  20. brokerIP1=172.16.234.150
  21. brokerTopicEnable=true
  22. brokerPermission=6
  23. shortPollingTimeMills=1000
  24. clientManageThreadPoolNums=16
  25. adminBrokerThreadPoolNums=16
  26. flushConsumerOffsetInterval=5000
  27. flushConsumerOffsetHistoryInterval=60000
  28. # 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
  29. defaultTopicQueueNums=8
  30. rejectTransactionMessage=false
  31. notifyConsumerIdsChangedEnable=true
  32. pullThreadPoolQueueCapacity=100000
  33. # # 所属集群名字
  34. brokerClusterName=DefaultCluster
  35. putMsgIndexHightWater=600000
  36. maxTransferBytesOnMessageInDisk=65536
  37. #检测物理文件磁盘空间
  38. diskMaxUsedSpaceRatio=75
  39. checkCRCOnRecover=true
  40. haSlaveFallbehindMax=268435
  41. deleteConsumeQueueFilesInterval=100
  42. cleanResourceInterval=10000
  43. maxMsgsNumBatch=64
  44. flushConsumeQueueLeastPages=2
  45. syncFlushTimeout=5000
  46. #删除文件时间点,默认凌晨 4点
  47. deleteWhen=04
  48. #Broker 的角色
  49. brokerRole=ASYNC_MASTER
  50. destroyMapedFileIntervalForcibly=120000
  51. #commitLog每个文件的大小默认1G
  52. mapedFileSizeCommitLog=1073741824
  53. haSendHeartbeatInterval=5000
  54. #刷盘方式
  55. flushDiskType=ASYNC_FLUSH
  56. cleanFileForciblyEnable=true
  57. haHousekeepingInterval=20000
  58. redeleteHangedFileInterval=120000
  59. #限制的消息大小
  60. maxMessageSize=524288
  61. flushCommitLogTimed=false
  62. haMasterAddress=
  63. maxTransferCountOnMessageInDisk=4
  64. flushIntervalCommitLog=1000
  65. #文件保留时间,默认 48 小时
  66. fileReservedTime=72
  67. flushCommitLogThoroughInterval=10000
  68. maxHashSlotNum=5000
  69. maxIndexNum=20000
  70. messageIndexEnable=true
  71. #存储路径
  72. storePathRootDir=/root/store
  73. #commitLog 存储路径
  74. storePathCommitLog=/root/store/commitlog
  75. #消费队列存储路径存储路径
  76. storePathConsumeQueue=/root/store/consumequeue
  77. #消息索引存储路径
  78. storePathIndex=/root/store/index
  79. haListenPort=10912
  80. flushDelayOffsetInterval=10000
  81. haTransferBatchSize=32768
  82. deleteCommitLogFilesInterval=100
  83. maxTransferBytesOnMessageInMemory=262144
  84. accessMessageInMemoryMaxRatio=40
  85. flushConsumeQueueThoroughInterval=60000
  86. flushIntervalConsumeQueue=1000
  87. maxTransferCountOnMessageInMemory=32
  88. messageIndexSafe=false
  89. #ConsumeQueue每个文件默认存30W条,根据业务情况调整
  90. mapedFileSizeConsumeQueue=6000000
  91. messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
  92. flushCommitLogLeastPages=4
  93. serverChannelMaxIdleTimeSeconds=120
  94. #Broker 对外服务的监听端口
  95. listenPort=10911
  96. serverCallbackExecutorThreads=0
  97. serverAsyncSemaphoreValue=64
  98. serverSocketSndBufSize=131072
  99. serverSelectorThreads=3
  100. serverPooledByteBufAllocatorEnable=false
  101. serverWorkerThreads=8
  102. serverSocketRcvBufSize=131072
  103. serverOnewaySemaphoreValue=256
  104. clientWorkerThreads=4
  105. connectTimeoutMillis=3000
  106. clientSocketRcvBufSize=131072
  107. clientOnewaySemaphoreValue=2048
  108. clientChannelMaxIdleTimeSeconds=120
  109. clientPooledByteBufAllocatorEnable=false
  110. clientAsyncSemaphoreValue=2048
  111. channelNotActiveInterval=60000
  112. clientCallbackExecutorThreads=2
  113. clientSocketSndBufSize=131072
复制代码
5、docker启动RocketMQ

以下将配置文件、日志、存储均挂载在本地
  1. # 1、namesrv
  2. docker run -d -p 9876:9876 \
  3. -v /mydata/rocketmq/namesrv/logs:/root/logs \
  4. -v /mydata/rocketmq/namesrv/store:/root/store \
  5. -v /mydata/rocketmq/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf \
  6. --name rmqnamesrv \
  7. rocketmqinc/rocketmq:latest sh mqnamesrv


  8. # 2、broker
  9. docker run -d  -p 10911:10911 -p 10909:10909 \
  10. -v /mydata/rocketmq/broker/logs:/root/logs \
  11. -v /mydata/rocketmq/broker/store:/root/store \
  12. -v /mydata/rocketmq/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf \
  13. --name rmqbroker \
  14. --add-host namesrv:172.16.234.150 \
  15. -e "NAMESRV_ADDR=namesrv:9876" \
  16. rocketmqinc/rocketmq:latest \
  17. sh mqbroker -n namesrv:9876 \
  18. -c /opt/rocketmq-4.4.0/conf/broker.conf autoCreateTopicEnable=true

  19. # 3、Console-ng
  20. docker run --name rocketmq-console \
  21. -e "JAVA_OPTS=-Drocketmq.namesrv.addr=172.16.234.150:9876 \
  22. -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
  23. -p 8080:8080 -t styletang/rocketmq-console-ng
复制代码
6、进入RocketMQ控制台

地址(IP+rocketmq-console端口):http://172.16.234.150:8080/#/


二、填坑经验


错误一: connect to <172.17.0.3:10909> failed

1、在启动Java项目后,发送MQ消息是报以下错误
2、RocketMQ控制台,集群地址显示为docker分配的IP
进入RocketMQ控制台,控制台显示的集群地址为172.17.0.3:10909,并非172.16.234.150:10909,172.17.0.3实际为docker内部分配的ID,需要此IP修改为虚拟机的IP
为了解决以上问题使用docker创建了一个网格【docker network create rocketmq-net + docker run -d --network rocketmq-net …】,但是没有解决此问题,实际导致此问题的是RocketMQ配置文件,请核查RocketMQ配置文件,或者采用上方提供的配置文件
  1. com.himyidea.framework.mq.MQRuntimeException: EC = 900101: MSG = 900101 | msg=MQ Client Failure
  2.         at com.himyidea.framework.mq.producer.impl.GeneralMQProducer.doSend(GeneralMQProducer.java:130)
  3.         at com.himyidea.framework.mq.producer.impl.GeneralMQProducer.sendMessage(GeneralMQProducer.java:105)
  4.         at java.lang.Thread.run(Thread.java:748)
  5. Caused by: com.alibaba.rocketmq.client.exception.MQClientException: Send [3] times, still failed, cost [9073]ms, Topic: report_data_topic, BrokersSent: [broker-a, broker-a, broker-a]
  6. See http://docs.aliyun.com/cn#/pub/ons/faq/exceptions&send_msg_failed for further details.
  7.         at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:522)
  8.         at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1030)
  9.         at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:989)
  10.         at com.alibaba.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:90)
  11.         at com.himyidea.framework.mq.producer.impl.GeneralMQProducer.doSend(GeneralMQProducer.java:126)
  12.         ... 85 more
  13. Caused by: com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <172.17.0.3:10909> failed
  14.         at com.alibaba.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:360)
  15.         at com.alibaba.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:267)
  16.         at com.alibaba.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:251)
  17.         at com.alibaba.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:214)
  18.         at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:671)
  19.         at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:440)
复制代码
错误二: maybe your broker machine memory too small

内存不足,以为是docker启动命令中未传内存信息,实际是虚拟机可用内存空间不足
  1. Caused by: com.alibaba.rocketmq.client.exception.MQBrokerException: CODE: 14  DESC: service not available now, maybe disk full, CL:  0.99 CQ: -1.00 INDEX: -1.00, maybe your broker machine memory too small.
复制代码
到此这篇关于docker安装RocketMQ的实现(附填坑经验connect to failed)的文章就介绍到这了,更多相关docker安装RocketMQ内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/server/3233599pd.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具