RocketMQ发消息连接失败之指定borker的ip地址

本文档记录了在开发过程中遇到的RocketMQ发送消息时出现的RemotingConnectException,错误显示尝试连接的Broker地址10.100.2.0与预期的内网IP不符。问题根源在于Broker启动时读取了错误的网络配置。通过检查网络环境,发现该IP属于之前K8S环境的flannel网络。解决方案是手动指定Broker的IP地址,修改`broker.properties`文件,并重启Broker服务。经过这些步骤,问题得到解决,Broker成功使用正确的IP地址运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

一、问题

开发中遇到如下问题:在发送rocketmq消息的时候,包连接异常(RemotingConnectException)
连接broker地址为:10.100.2.0:10911 这一看就不像我的内网地址(我的172开头)。
报错信息如下:

Caused by: org.apache.rocketmq.client.exception.MQClientException: Send [3] times, still failed, cost [6005]ms, Topic: recordTopic, BrokersSent: [nb003, nb003, nb003]
See http://rocketmq.apache.org/docs/faq/ for further details.
        at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:665)
        at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1343)
        at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:344)
        at org.apache.rocketmq.spring.core.RocketMQTemplate.syncSend(RocketMQTemplate.java:555)
        ... 73 common frames omitted
Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to 10.100.2.0:10911 failed
        at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:394)
        at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:503)
        at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:487)
        at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:431)
        at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:854)
        at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:584)
        ... 76 common frames omitted

查看控制台:发现问题一致。
在这里插入图片描述

二、问题排查

先排查网络情况:ip addr
在这里插入图片描述
由上图发现,默认网卡的内网ip为172.xx.xx.xx (知道这个意思就行)
而实际报错里的 10.100.2.0 为之前安装K8S环境时候安装的网络插件 flannel 的ip段。故是broker 在启动时候网卡读错了。导致ip不对,从而导致连接异常。

三、解决方案

指定broker的ip地址,再启动broker
我的rocketmq的根路径为:/usr/local/rocketmq-all-4.9.1-bin-release
操作如下:
【172.xx.xx.xx改为你自己的ip哈】

[root@nb003 conf]# cd /usr/local/rocketmq-all-4.9.1-bin-release/conf
[root@nb003 conf]# echo "brokerIP1=172.xx.xx.xx" > broker.properties
[root@nb003 conf]# ls
2m-2s-async  2m-2s-sync  2m-noslave  broker.conf  broker.properties  dledger  logback_broker.xml  logback_namesrv.xml  logback_tools.xml  plain_acl.yml  tools.yml
# 先停止broker
[root@nb003 conf]# cd /usr/local/rocketmq-all-4.9.1-bin-release/bin
[root@nb003 bin]# ./mqshutdown broker
The mqbroker(2783) is running...
Send shutdown request to mqbroker(2783) OK
# 再启动broker,并指定配置文件(建议全路径)
[root@nb003 bin]# nohup sh mqbroker -n localhost:9876 -c /usr/local/rocketmq-all-4.9.1-bin-release/conf/broker.properties &
[1] 8705
[root@nb003 bin]# nohup: ignoring input and appending output to ‘nohup.out’

重新查看集群信息:ip已经正确。
在这里插入图片描述

END

### K8S 上部署 RocketMQ 失败原因分析 在 Kubernetes (K8S) 平台上部署 Apache RocketMQ 可能会遇到多种问题,这些问题通常涉及配置错误、网络连通性不足或存储路径不匹配等因素。以下是常见的失败原因及其对应的解决方案: #### 1. **挂载卷配置错误** 如果 YAML 文件中的 `volumeMounts` 或 `volumes` 配置不当,可能导致容器启动失败或服务不可用。例如,在引用中提到的案例显示,挂载配置文件时未正确指定路径或权限设置可能引发异常[^2]。 - 解决方案: 确保挂载路径与实际需求一致,并验证主机上的目录是否存在且具有适当权限。例如: ```yaml volumeMounts: - name: rocketmqbroker-config mountPath: /usr/local/rocketmq-4.8.0/conf/broker.conf subPath: broker.conf - name: rocketmqbroker-data mountPath: /root/store - name: rocketmqbroker-logs mountPath: /root/logs volumes: - name: rocketmqbroker-config configMap: name: rocketmqbroker defaultMode: 0755 - name: rocketmqbroker-data hostPath: path: /data/rocketmq/store type: DirectoryOrCreate - name: rocketmqbroker-logs hostPath: path: /data/rocketmq/logs type: DirectoryOrCreate ``` #### 2. **Broker 注册 IP 不可达** 当 Broker 节点向 NameServer 注册其 Pod 的内部 IP 地址时,外部客户端可能会因为无法访问该地址连接失败。这种现象常见于混合环境下的部署场景[^3]。 - 解决方案: 通过修改 RocketMQ 的配置参数,使 Broker 使用可被外部访问的 IP 进行注册。可以在 `broker.conf` 中添加以下内容: ```properties listenAddress=${POD_IP}:${BROKER_PORT} advertisedListener=PLAINTEXT://${EXTERNAL_IP}:${BROKER_PORT} ``` 其中 `${POD_IP}` 是当前节点的内部 IP,`${EXTERNAL_IP}` 则应替换为可以对外暴露的有效地址。 #### 3. **时间同步问题** 由于分布式系统的时间敏感特性,不同节点之间存在较大的时间偏差也可能影响正常运行。特别是在跨地域或多数据中心环境中更为明显[^2]。 - 解决方案: 统一所有参与计算设备的操作系统时间和硬件时钟至协调世界时(UTC),或者至少保持在一个合理范围内差异之内。可以通过 NTP 协议实现自动化调整功能;另外也可以利用自定义镜像预先设定好区域信息作为默认值传递进去减少人为失误几率。 #### 4. **资源限制不合理** CPU 和内存分配不足同样会造成应用崩溃退出的情况发生。如果没有显式声明请求量和限额,则调度器将依据默认策略决定实例放置位置从而增加不确定性风险程度。 - 解决方案: 明确指出每种角色所需的最小保障额度以及最大允许消耗上限数值范围内的具体数字单位形式表示出来供参考使用即可满足基本要求标准。 ```yaml resources: requests: memory: "2Gi" cpu: "500m" limits: memory: "4Gi" cpu: "1" ``` --- ### 示例代码片段 下面提供了一个完整的 Deployment 定义样例用于指导如何正确编写相关字段属性值来规避上述提及过的各类潜在隐患状况的发生概率降到最低限度水平之上再进一步优化性能表现效果达到预期目标为止结束整个过程环节完成全部操作步骤流程图展示完毕之后继续往下阅读相关内容材料学习更多专业知识技能提升自我价值创造更大社会贡献机会窗口期来临之前做好充分准备迎接挑战时刻到来吧朋友们加油干起来啊! ```yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: rocketmq-broker spec: serviceName: "rocketmq-headless" replicas: 3 selector: matchLabels: app: rocketmq-broker template: metadata: labels: app: rocketmq-broker spec: containers: - name: rocketmq-broker image: apache/rocketmq:latest env: - name: NAMESRV_ADDR value: "rocketmq-namesrv.default.svc.cluster.local:9876" - name: BROKER_ID value: "0" - name: LISTEN_ADDRESS valueFrom: fieldRef: fieldPath: status.podIP - name: ADVERTISED_LISTENER value: "PLAINTEXT://$(LISTEN_ADDRESS):10911" resources: requests: memory: "2Gi" cpu: "500m" limits: memory: "4Gi" cpu: "1" volumeMounts: - name: data-volume mountPath: "/root/store" - name: log-volume mountPath: "/root/logs" volumes: - name: data-volume persistentVolumeClaim: claimName: rocketmq-pvc - name: log-volume emptyDir: {} --- apiVersion: v1 kind: Service metadata: name: rocketmq-headless spec: clusterIP: None selector: app: rocketmq-broker ports: - port: 10911 name: client ``` --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一掬净土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值