Rocketmq5.1.1的版本的k8s部署proxy和broker一起启动,这个时候broker还没启动完成 nameserver里面没有topic信息 也无法创建topic 然后proxy会报如下错误, 然后会重启(k8s重新拉起):
2023-06-16 16:08:42 WARN main - get Topic [DefaultHeartBeatSyncerTopic] RouteInfoFromNameServer is not exist value 2023-06-16 16:08:42 WARN main - get Topic [DefaultHeartBeatSyncerTopic] RouteInfoFromNameServer is not exist value 2023-06-16 16:08:42 WARN main - get Topic [rocketmq-standalone] RouteInfoFromNameServer is not exist value 2023-06-16 16:08:42 ERROR main - create topic DefaultHeartBeatSyncerTopic failed. org.apache.rocketmq.client.exception.MQClientException: CODE: 17 DESC: No topic route info in name server for the topic这个感觉不太合理 如果创建不了topic也不应该让程序直接宕掉,麻烦帮忙看下 我觉得这个地方应该有重试机制好点 不要直接宕掉,刚试了下metricsExporterType=PROM 默认端口是5557 但是我把它在Prometheus的配置里面,并没有任何连接信息,显示的是连接拒绝 这个是还需要配置什么参数吗 我开启了broker的acl
根据您提供的信息,问题可能出现在 RocketMQ 5.1.1 版本的 K8s 部署中。以下是对您遇到的问题的解释和建议:
为了解决这个问题,您可以尝试增加 Proxy 的重试机制,使其在获取不到路由信息时进行重试,而不是直接宕掉。您可以检查 Proxy 配置文件中的相关参数,如 namesrvAddr
(NameServer 的地址)和 retryTimesWhenSendFailed
(发送失败时的重试次数),并进行适当的调整。
为了解决这个问题,您需要确保在 Prometheus 的配置文件中正确指定了 Metrics Exporter 的地址和端口。您可以检查 Prometheus 的配置文件,找到与 RocketMQ 相关的配置项,并确认其正确性。
此外,如果您已经启用了 Broker 的 ACL(访问控制列表),还需要确保 Metrics Exporter 在连接时具有足够的权限。您可以根据 RocketMQ 的文档或联系阿里云的技术支持,获取有关 Metrics Exporter 的详细配置和权限设置的指导。
如果问题
RocketMQ 在启动时确实需要先从 NameServer 获取 Topic 路由信息,否则无法正常工作。由于您的部署方式是同时启动 Proxy 和 Broker,而且 Broker 还没有启动完成,所以 Proxy 在获取 Topic 路由信息时出现了异常,导致程序崩溃。
为了避免这种情况,您可以尝试使用以下方法:
使用单独的 Deployment 部署 Broker 和 Proxy,分开启动。Broker 先启动完毕后再启动 Proxy。
尝试使用自定义的 TopicConfig,手动创建 Topic 并将其注册到 NameServer 中。这样在启动 Proxy 时就可以直接获取到 Topic 路由信息而无需等待 Broker 启动完成。例如:
TopicConfig topicConfig = new TopicConfig("your_topic", /*numOfQueue=*/4, /*defaultTopic=*/false);
producer.createTopic(key, topicConfig);
关于 MetricsExporterType=PROM 的问题,您需要将 Prometheus 的配置文件中相应的 targets 配置为 Proxy 的 IP 地址和端口号,例如:
scrape_configs:
- job_name: 'rocketmq'
static_configs:
- targets: ['proxy_ip:5557']
最后,如果您的 Broker 启用了 ACL,可能需要在配置文件中指定访问控制规则以允许 Proxy 访问。例如,在 broker.conf 文件中添加以下配置:
aclDenyTopicWrite=*
aclDenyTopicRead=*
aclDenyGroupWrite=*
aclDenyGroupRead=*
aclAllowAddress=proxy_ip
这样就可以指定只允许来自 Proxy 的 IP 地址访问 Broker 了。
在 Kubernetes 上启动 RocketMQ 集群时,确实会出现 create topic DefaultHeartBeatSyncerTopic failed
的问题,这是因为在集群中启动时,可能会同时启动多个 Broker 实例,由于没有正确的数据同步,导致 NameServer 中没有找到对应的 Topic 信息,从而报错。解决这个问题的方法是可以通过设置 Broker 的环境变量来控制启动的时机。
具体来说,可以为 Broker Pod 中的环境变量 WAIT_NAMESRV_TIME
、WAIT_STORE_MSG_OK
、MAX_ZK_REGISTER_RETRIES
、MAX_ZK_RECOVERY_RETRY
、WAIT_TIME_IN_SECONDS_WHEN_SLAVE_BUSY
设置一些合理的数值,来保证在 Broker 启动完成后再启动 Proxy Pod,从而避免出现 No topic route info in name server for the topic
的错误。
关于 metricsExporterType=PROM 的问题,您需要在 Prometheus 的 prometheus.yml
文件中配置 scrape_configs
,指定监控的端口:
scrape_configs:
- job_name: 'rocketmq-broker'
honor_labels: true
scrape_interval: 30s # 获取数据的时间间隔
scrape_timeout: 10s # 请求超时时间
metrics_path: /metrics
scheme: http
static_configs:
- targets: ['localhost:xxxx'] # 这里的 xxxx 替换为您 Broker 监控的端口号
然后重启 Prometheus 生效。
至于 Broker 的 ACL 配置,需要确保在 broker.conf
文件中设置了正确的配置项,如 aclEnable=true
和 autoCreateTopicEnable=false
,同时还需要在控制台或 SDK 中正确配置了 ACL 的信息,才能生效。
在RocketMQ 5.1.1的版本中,Proxy和Broker是可以一起部署的,但是在启动时,Broker需要先于Proxy启动。因为Proxy是通过访问NameServer获取Topic信息,而NameServer是通过向Broker注册获取Topic信息的,因此如果Broker还未启动完成,NameServer中就无法获取到Topic信息,导致Proxy启动时无法获取到Topic信息,从而无法为消费者提供服务。
解决这个问题的方法是,在启动Proxy之前,先启动Broker并等待Broker启动完成后再启动Proxy。可以通过在Kubernetes中使用livenessProbe和readinessProbe探针来实现这一点,以确保Broker启动完成后再启动Proxy。
至于Proxy报错的问题,可以考虑增加重试机制,例如在获取Topic信息时出现错误时,可以等待一段时间后再次尝试获取,直到成功为止。另外,也可以考虑在程序出现异常时进行捕获和处理,避免程序直接宕掉。
楼主你好,这个问题可能是由于proxy启动的过早,导致nameserver还没有准备好topic信息。建议增加一个等待时间,在proxy启动之前等待nameserver准备好topic信息。
你可以尝试在proxy容器中执行以下命令来等待nameserver准备好:
while true; do nslookup nameserver && break; done
这个命令会一直执行nslookup命令,直到能够成功解析出nameserver。在此期间,proxy会一直等待。当nameserver准备好后,proxy才会启动,并且可以成功访问nameserver上的topic信息。
这个错误可能是因为在启动k8s上的RocketMQ集群时,没有设置正确的NameServer地址,导致在初始化阶段无法解析到对应的Topic信息。为了避免程序直接宕掉,您可以考虑加入重试机制。您可以在创建Topic失败后,添加一段等待时间,然后再次尝试创建。例如,可以将等待时间设置为5秒钟。 关于MetricsExporter,它是用于将RocketMQ集群的性能指标(如队列、队列监控、路由、连接等)输出到Prometheus上的工具。在配置MetricsExporter时,需要指定一个Prometheus的地址。如果您没有配置,则默认端口是5557,这意味着默认情况下MetricsExporter会监听该端口。如果您在Prometheus上没有任何连接信息,可能是MetricsExporter没有正常运行,您可以检查一下MetricsExporter的配置是否正确。
在您的部署环境中,因为 Proxy 与 Broker 同时启动,导致 Proxy 连接 NameServer 时可能会出现 Topic 不存在的错误。这是因为在 RocketMQ 中,Topic 的路由信息需要在 NameServer 注册后才能被查找到。而在您使用的部署方式下,Broker 可能还未完成启动和注册到 NameServer 上,因此无法获取到相应 Topic 的路由信息。
针对这种情况,建议您可以通过以下方法来解决:
将 Broker 和 Proxy 分开部署,并分别启动:将 Broker 和 Proxy 分开部署并分别启动,以便确保 Broker 能够正常启动和注册到 NameServer 上,然后再启动 Proxy。
增加重试机制:在 Proxy 启动时增加一个重试机制,在连接 NameServer 时如果出现 Topic 不存在的错误,可以尝试进行多次重试,直至成功连接或者达到最大重试次数。
至于 Metrics Exporter 的问题,可以检查一下防火墙是否有限制,或者是检查配置文件是否正确。具体的问题需要根据实际情况进行排除和解决。
这个问题主要是由于在启动proxy时,所需的topic信息还没有在nameserver中注册。这意味着proxy会一直查询nameserver以查找必要的路由信息,直到它找到了或者达到了重试次数限制。
这种情况下,您可以考虑在proxy的配置文件中添加一个重试机制,以在等待nameserver中的topic信息注册完成之前,尝试初始化程序。这样即使topic信息还没有完全注册到nameserver中,也不会导致程序宕机。
另外,关于metricsExporterType=PROM的问题,请确保您的Prometheus配置中已经正确配置了该端口,并且broker的防火墙也允许该端口的流量通过。如果所有这些都已经配置正确,那么您可以尝试重新启动broker来确保metricsExporterType=PROM设置已成功应用。如果您开启了broker的acl,还需要确保Prometheus可以通过acl进行访问。
最后,建议您升级RocketMQ到最新版本,以便充分利用改进和修复的特性,同时可以避免旧版本可能存在的错误和问题。
prome上可以看看这个target的状态,还要prome和broker网络要通,exporter应该不用acl验证的,可以设置下启动顺序, 先启动broker,再启动proxy, 避免不必要的异常日志,此回答整理自钉群“群2-Apache RocketMQ 中国开发者钉钉群”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/