开发者社区 > 云原生 > 云消息队列 > 正文

Rocketmq5.1.1的版本的k8s部署proxy和broker一起启动,这个时候broker?

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

展开
收起
真的很搞笑 2023-06-18 19:04:32 564 0
9 条回答
写回答
取消 提交回答
  • 根据您提供的信息,问题可能出现在 RocketMQ 5.1.1 版本的 K8s 部署中。以下是对您遇到的问题的解释和建议:

    1. 关于 Proxy 报错和重启:在启动 Proxy 的过程中,如果 Broker 还没有完全启动完成,可能会导致 Proxy 无法获取 RouteInfo(路由信息)并创建 Topic,从而报错并重启。这是因为 Proxy 需要获取 Topic 的路由信息才能正常工作。

    为了解决这个问题,您可以尝试增加 Proxy 的重试机制,使其在获取不到路由信息时进行重试,而不是直接宕掉。您可以检查 Proxy 配置文件中的相关参数,如 namesrvAddr(NameServer 的地址)和 retryTimesWhenSendFailed(发送失败时的重试次数),并进行适当的调整。

    1. 关于 Metrics Exporter(指标导出器):根据您的描述,您已经将 Metrics Exporter 的类型设置为 Prometheus,并配置了默认的端口为 5557。但是在 Prometheus 的配置中,连接被拒绝,这可能是由于未正确配置 Metrics Exporter 的参数导致的。

    为了解决这个问题,您需要确保在 Prometheus 的配置文件中正确指定了 Metrics Exporter 的地址和端口。您可以检查 Prometheus 的配置文件,找到与 RocketMQ 相关的配置项,并确认其正确性。

    此外,如果您已经启用了 Broker 的 ACL(访问控制列表),还需要确保 Metrics Exporter 在连接时具有足够的权限。您可以根据 RocketMQ 的文档或联系阿里云的技术支持,获取有关 Metrics Exporter 的详细配置和权限设置的指导。

    如果问题

    2023-06-20 08:08:57
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    RocketMQ 在启动时确实需要先从 NameServer 获取 Topic 路由信息,否则无法正常工作。由于您的部署方式是同时启动 Proxy 和 Broker,而且 Broker 还没有启动完成,所以 Proxy 在获取 Topic 路由信息时出现了异常,导致程序崩溃。

    为了避免这种情况,您可以尝试使用以下方法:

    1. 使用单独的 Deployment 部署 Broker 和 Proxy,分开启动。Broker 先启动完毕后再启动 Proxy。

    2. 尝试使用自定义的 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 了。

    2023-06-19 23:55:36
    赞同 展开评论 打赏
  • 在 Kubernetes 上启动 RocketMQ 集群时,确实会出现 create topic DefaultHeartBeatSyncerTopic failed 的问题,这是因为在集群中启动时,可能会同时启动多个 Broker 实例,由于没有正确的数据同步,导致 NameServer 中没有找到对应的 Topic 信息,从而报错。解决这个问题的方法是可以通过设置 Broker 的环境变量来控制启动的时机。

    具体来说,可以为 Broker Pod 中的环境变量 WAIT_NAMESRV_TIMEWAIT_STORE_MSG_OKMAX_ZK_REGISTER_RETRIESMAX_ZK_RECOVERY_RETRYWAIT_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=trueautoCreateTopicEnable=false,同时还需要在控制台或 SDK 中正确配置了 ACL 的信息,才能生效。

    2023-06-19 08:47:46
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    在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信息时出现错误时,可以等待一段时间后再次尝试获取,直到成功为止。另外,也可以考虑在程序出现异常时进行捕获和处理,避免程序直接宕掉。

    2023-06-19 08:08:49
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,这个问题可能是由于proxy启动的过早,导致nameserver还没有准备好topic信息。建议增加一个等待时间,在proxy启动之前等待nameserver准备好topic信息。

    你可以尝试在proxy容器中执行以下命令来等待nameserver准备好:

    while true; do nslookup nameserver && break; done
    

    这个命令会一直执行nslookup命令,直到能够成功解析出nameserver。在此期间,proxy会一直等待。当nameserver准备好后,proxy才会启动,并且可以成功访问nameserver上的topic信息。

    2023-06-19 08:03:06
    赞同 展开评论 打赏
  • 这个错误可能是因为在启动k8s上的RocketMQ集群时,没有设置正确的NameServer地址,导致在初始化阶段无法解析到对应的Topic信息。为了避免程序直接宕掉,您可以考虑加入重试机制。您可以在创建Topic失败后,添加一段等待时间,然后再次尝试创建。例如,可以将等待时间设置为5秒钟。 关于MetricsExporter,它是用于将RocketMQ集群的性能指标(如队列、队列监控、路由、连接等)输出到Prometheus上的工具。在配置MetricsExporter时,需要指定一个Prometheus的地址。如果您没有配置,则默认端口是5557,这意味着默认情况下MetricsExporter会监听该端口。如果您在Prometheus上没有任何连接信息,可能是MetricsExporter没有正常运行,您可以检查一下MetricsExporter的配置是否正确。

    2023-06-18 21:52:09
    赞同 展开评论 打赏
  • 在您的部署环境中,因为 Proxy 与 Broker 同时启动,导致 Proxy 连接 NameServer 时可能会出现 Topic 不存在的错误。这是因为在 RocketMQ 中,Topic 的路由信息需要在 NameServer 注册后才能被查找到。而在您使用的部署方式下,Broker 可能还未完成启动和注册到 NameServer 上,因此无法获取到相应 Topic 的路由信息。

    针对这种情况,建议您可以通过以下方法来解决:

    1. 将 Broker 和 Proxy 分开部署,并分别启动:将 Broker 和 Proxy 分开部署并分别启动,以便确保 Broker 能够正常启动和注册到 NameServer 上,然后再启动 Proxy。

    2. 增加重试机制:在 Proxy 启动时增加一个重试机制,在连接 NameServer 时如果出现 Topic 不存在的错误,可以尝试进行多次重试,直至成功连接或者达到最大重试次数。

    至于 Metrics Exporter 的问题,可以检查一下防火墙是否有限制,或者是检查配置文件是否正确。具体的问题需要根据实际情况进行排除和解决。

    2023-06-18 20:59:36
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    这个问题主要是由于在启动proxy时,所需的topic信息还没有在nameserver中注册。这意味着proxy会一直查询nameserver以查找必要的路由信息,直到它找到了或者达到了重试次数限制。

    这种情况下,您可以考虑在proxy的配置文件中添加一个重试机制,以在等待nameserver中的topic信息注册完成之前,尝试初始化程序。这样即使topic信息还没有完全注册到nameserver中,也不会导致程序宕机。

    另外,关于metricsExporterType=PROM的问题,请确保您的Prometheus配置中已经正确配置了该端口,并且broker的防火墙也允许该端口的流量通过。如果所有这些都已经配置正确,那么您可以尝试重新启动broker来确保metricsExporterType=PROM设置已成功应用。如果您开启了broker的acl,还需要确保Prometheus可以通过acl进行访问。

    最后,建议您升级RocketMQ到最新版本,以便充分利用改进和修复的特性,同时可以避免旧版本可能存在的错误和问题。

    2023-06-18 19:16:53
    赞同 展开评论 打赏
  • prome上可以看看这个target的状态,还要prome和broker网络要通,exporter应该不用acl验证的,可以设置下启动顺序, 先启动broker,再启动proxy, 避免不必要的异常日志,此回答整理自钉群“群2-Apache RocketMQ 中国开发者钉钉群”

    2023-06-18 19:14:51
    赞同 展开评论 打赏
滑动查看更多

涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/

相关产品

  • 云消息队列 MQ
  • 热门讨论

    热门文章

    相关电子书

    更多
    ACK 云原生弹性方案—云原生时代的加速器 立即下载
    ACK集群类型选择最佳实践 立即下载
    企业运维之云原生和Kubernetes 实战 立即下载

    相关镜像