kafka 报错 - Cannot assign requested address

这篇具有很好参考价值的文章主要介绍了kafka 报错 - Cannot assign requested address。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

在华为云服务器上跑了 zookeeper 和 kafka 的 broker,想内外网分流,重点就是做不到从外网去消费,比如用自己的 windows 笔记本去消费。

配置 server.properties 的 listener 为 broker 所在机子的的内网 IP 后,终于能 start 了:

listener=PLAINTEXT://192.168.0.154:9092

zookeeper 查看 kafka broker 的地址:

get /brokers/ids/0
{"features":{},"listener_security_protocol_map":{"PUBLIC":"PLAINTEXT"},"endpoints":["PUBLIC://192.168.0.154:9092"],"jmx_port":-1,"port":9092,"host":"192.168.0.154","version":5,"timestamp":"1686651266529"}

地址是 “endpoints”:[“PUBLIC://192.168.0.154:9092”]

从 broker 机子的本地创建 topic:

bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --topic test0

结果疯狂滚屏:

workClient)
[2023-06-13 18:21:48,162] WARN [AdminClient clientId=adminclient-1] Connection to node -1 (localhost/127.0.1.1:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
[2023-06-13 18:21:49,266] WARN [AdminClient clientId=adminclient-1] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

换个姿势创建:

bin/kafka-topics.sh --create --bootstrap-server 192.168.0.154:9092 --topic test0

成功了:

kafka 报错 - Cannot assign requested address

broker 本机来 produce。

kafka 报错 - Cannot assign requested address

换同网段机子 192.168.0.28 来消费:

kafka 报错 - Cannot assign requested address

外网 windows 去消费:

D:\Programs\MQ\kafka\kafka_2.12-3.2.3\bin\windows>kafka-console-consumer.bat --topic test0 --from-beginning --bootstrap-server 121.37.xx.xxx:9092
[2023-06-13 18:44:40,678] WARN [Consumer clientId=console-consumer, groupId=console-consumer-76813] Connection to node 0 (/192.168.0.154:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

访问不到。

listeners & advertised.listeners

让我们来看下官网的说明:

章节来源:(7. Security - 7.2 Listener Configuration)

每个服务器上必须至少定义一个监听器。 listeners 中定义的每个监听器的格式如下:

{LISTENER_NAME}://{hostname}:{port}

LISTENER_NAME通常是一个描述性的名字,定义了监听器的用途。例如,许多配置为客户端流量使用单独的监听器,所以他们可能在配置中把相应的监听器称为`CLIENT’.

listener.security.protocol.map。该值是一个逗号分隔的列表,列出了映射到其安全协议的每个监听器。例如,下面值配置指定 CLIENT 监听器将使用 SSL,而BROKER 监听器将使用明文(plaintext)。

listener.security.protocol.map=CLIENT:SSL,BROKER:PLAINTEXT

下面给出了安全协议的可能选项:

  1. PLAINTEXT
  2. SSL
  3. SASL_PLAINTEXT
  4. SASL_SSL

明文(PLAINTEXT)协议不提供安全性,不需要任何额外的配置。在下面的章节中,本文将介绍如何配置其余的协议。

也可以在监听器中使用安全协议名称作为监听器名称。

在 listeners list 中,可以通过将 inter.broker.listener.name ,来哪一个声明监听器用于 broker 间的通信。broker 间监听器的主要目的是分区复制。如果没有定义,那么 broker 间的监听器由 security.inter.broker.protocol 定义的安全协议决定,该协议默认为PLAINTEXT

对于依赖 Zookeeper 存储集群元数据 metadata 的传统集群 cluster,可以声明一个单独的 listener,用于从活动控制器 controller 到 broker 的元数据 metadata 传播。这是由 control.plane.listener.name 定义的。当 controller 需要向 cluster 中的 broker 推送 metadata 更新时,它将使用这个监听器 listener。使用控制平面监听器(contol.plane.listener)的好处是,它使用一个单独的处理线程,这使得应用程序流量不太可能阻碍元数据变化的及时传播(如分区领导和ISR更新)。

控制器 controller 接收来自其他控制器 controller 和 broker 的请求。由于这个原因,即使一个服务器没有启用控制器角色(即它只是一个 broker),它仍然必须定义控制器监听器以及配置它所需的任何安全属性。例如,我们可以在一个独立的 broker 上使用以下配置:

process.roles=broker
listeners=BROKER://localhost:9092
inter.broker.listener.name=BROKER
controller.quorum.voters=0@localhost:9093
controller.listener.names=CONTROLLER
listener.security.protocol.map=BROKER:SASL_SSL,CONTROLLER:SASL_SSL

在这个例子中,控制器监听器仍然被配置为使用 SASL_SSL 安全协议,但它不包括在 listeners 中,因为 broker 没有暴露控制器监听器本身。在这种情况下,将使用的端口来自 controller.quorum.voters 配置,它定义了完整的控制器列表。


(3.1 Broker Configs)

🌵 listeners
\############################# Socket Server Settings #############################
\# The address the socket server listens on. If not configured, the host name will be equal to the value of

\# java.net.InetAddress.getCanonicalHostName(), with PLAINTEXT listener name, and port 9092.

\#   FORMAT:
\#     listeners = listener_name://host_name:port
\#   EXAMPLE:
\#     listeners = PLAINTEXT://your.host.name:9092
\#listeners=PLAINTEXT://:9092

Listener List - Comma-separated list of URIs we will listen on and the listener names. If the listener name is not a security protocol, listener.security.protocol.map must also be set.
Listener names and port numbers must be unique.
Specify hostname as 0.0.0.0 to bind to all interfaces.
Leave hostname empty to bind to default interface.
Examples of legal listener lists:
PLAINTEXT://myhost:9092,SSL://:9091
CLIENT://0.0.0.0:9092,REPLICATION://localhost:9093

监听器
Listener List - 以逗号分隔的我们要监听的 URI 列表和监听器名称。如果监听器的名字不是安全协议,listenener.security.protocol.map 也必须被设置。
监听器名称和端口号必须是唯一的。
指定 hostname 为 0.0.0.0 以绑定所有接口。
把 hostname 留空就可以绑定到默认接口。
合法监听器列表的例子。
PLAINTEXT://myhost:9092,SSL://:9091
CLIENT://0.0.0.0:9092,REPLICATION://localhost:9093

(/key:value -> ListenerName: Uri/)

🌵 advertised.listeners
\# Listener name, hostname and port the broker will advertise to clients.
\# If not set, it uses the value for "listeners".
\#advertised.listeners=PLAINTEXT://your.host.name:9092
advertised.listeners=

/监听器名称、主机名和端口,broker将向 clients 公布/

Listeners to publish to ZooKeeper for clients to use, if different than the listeners config property. In IaaS environments, this may need to be different from the interface to which the broker binds. If this is not set, the value for listeners will be used. Unlike listeners, it is not valid to advertise the 0.0.0.0 meta-address.

发布至 zookeeper 注册中心的 listeners, 为了让 clients (从zk拿来)使用。


只需外网访问 kafka

你肯定想到了最简单的一个方法,listeners使用外网ip

listeners=PLAINTEXT://101.89.163.1:9092

如果宿主机有外网网卡,这么配当然没问题。如果没有(ifconfig看不到外网ip的网卡,基本上就不存在这个外网网卡),很可能和我使用的的宿主机(华为云ECS)一样是通过 NAT 映射或者啥办法搞出来的外网 ip,此时 kafka 无法监听这个外网 ip(因为不存在,启动就会报错)。

[2023-06-13 18:57:53,738] INFO App info kafka.server for 0 unregistered (org.apache.kafka.common.utils.AppInfoParser)
[2023-06-13 18:57:53,738] INFO [KafkaServer id=0] shut down completed (kafka.server.KafkaServer)
[2023-06-13 18:57:53,738] ERROR Exiting Kafka due to fatal exception during startup. (kafka.Kafka$)
org.apache.kafka.common.KafkaException: Socket server failed to bind to 121.37.xx.xxx:9092: Cannot assign requested address.
	at kafka.network.Acceptor.openServerSocket(SocketServer.scala:684)
	at kafka.network.Acceptor.<init>(SocketServer.scala:576)

failed to bind to 121.37.xx.xxx:9092: Cannot assign requested address.

这时候就是advertised.listeners真正发挥作用的时候了。使用如下配置:

listeners=PLAINTEXT://192.168.0.213:9092 //内网IP
advertised.listeners=PLAINTEXT://101.89.163.1:9092 //外网IP

此时一个完整的 kafka 客户端访问服务端的流程:

  • 客户端访问 101.89.163.1:9092,被 kafka 宿主机所在环境映射到内网192.168.0.213:9092,访问到了kafka节点,请求获得 kafka 服务端的访问地址
  • kafka 从 zookeeper 拿到自己和其他兄弟节点通过 advertised.listeners 注册到 zookeeper 的101.89.163.1:9092 等外网地址,作为 kafka 的服务端访问地址返回给客户端
  • 客户端拿这些地址访问 kafka 集群,被 kafka 宿主机所在环境映射到各kafka节点的内网ip,访问到了kafka服务端…完美循环

你可能会问已经配置了访问地址,为什么还要在第一次访问的时候请求获得 kafka 的访问地址。因为如果是 kafka 集群,你可以选择只给客户端配置一个 kafka 节点的地址(这样是不推荐的),但是客户端必须要访问集群中的每一个节点,所以必须通过这个节点获得集群中每一个节点的访问地址。
如果不配置advertised.listeners=PLAINTEXT://101.89.163.1:9092,你会发现虽然你给kafka 客户端配置的访问地址是 101.89.163.1:9092,但是kafka客户端访问时报错,报错原因是Connection to node -1[192.168.0.213:9092] could not be established. Broker may not be available.。这就是因为不配置advertised.listenersadvertised.listeners 默认使用listeners配置的地址,客户端拿到的就是listeners配置的内网地址


内外网分流

如果是有外网网卡的情况,直接配置外网 ip 有没有问题呢?
如果既要内网访问,又要外网访问,本来可以走内网的流量都走外网网卡,显然不合适;而且有的环境可能被配置成这些 kafka 宿主机是没有外网访问权限的,即虽然他可以访问自己的外网ip,但是访问不了兄弟节点的外网ip。这时候就要配置内外网分流。网上教程就有很多了。


像上面这样设置完后,再从外网(我的windows)访问 broker:

成功。

broker 的日志:

[2023-06-13 19:11:22,003] INFO [GroupMetadataManager brokerId=0] Finished loading offsets and group metadata from __consumer_offsets-28 in 48 milliseconds for epoch 0, of which 48 milliseconds was spent in the scheduler. (kafka.coordinator.group.GroupMetadataManager)
[2023-06-13 19:11:49,972] INFO [GroupCoordinator 0]: Dynamic member with unknown member id joins group console-consumer-85874 in Empty state. Created a new member id console-consumer-da4137d8-6b3a-4983-bf0e-e1dcd49f876b and request the member to rejoin with this id. (kafka.coordinator.group.GroupCoordinator)
[2023-06-13 19:11:50,009] INFO [GroupCoordinator 0]: Preparing to rebalance group console-consumer-85874 in state PreparingRebalance with old generation 0 (__consumer_offsets-23) (reason: Adding new member console-consumer-da4137d8-6b3a-4983-bf0e-e1dcd49f876b with group instance id None; client reason: rebalance failed due to MemberIdRequiredException) (kafka.coordinator.group.GroupCoordinator)
[2023-06-13 19:11:50,015] INFO [GroupCoordinator 0]: Stabilized group console-consumer-85874 generation 1 (__consumer_offsets-23) with 1 members (kafka.coordinator.group.GroupCoordinator)
[2023-06-13 19:11:50,048] INFO [GroupCoordinator 0]: Assignment received from leader console-consumer-da4137d8-6b3a-4983-bf0e-e1dcd49f876b for group console-consumer-85874 for generation 1. The group has 1 members, 0 of which are static. (kafka.coordinator.group.GroupCoordinator)

…for group console-consumer-85874 for generation 1. The group has 1 members,


consumer端:

kafka 报错 - Cannot assign requested address

跑了五次,创了五个consumer:

kafka 报错 - Cannot assign requested address文章来源地址https://www.toymoban.com/news/detail-488077.html

到了这里,关于kafka 报错 - Cannot assign requested address的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • The client socket has failed to connect to X (errno: 99 - Cannot assign requested address).

    在跑DDP模型时遇到了如下问题. [W socket.cpp:558] [c10d] The client socket has failed to connect to [localhost]:12355 (errno: 99 - Cannot assign requested address). 测试用的代码如下: 上述代码直接运行会报上述的问题,但是好像不会影响运行(?) 一开始我还以为是端口被占用了,经过检查发现并没有问题,猜测

    2024年02月11日
    浏览(30)
  • Warning: Could not create server TCP listening socket Cannot assign request

    一、问题:docker部署redis时发现docker ps命令查看redis端口号为空  二、原因:在网上查找基本都是6379端口被占用 三、解决方法 1、先docker stop停掉redis容器 2、通过修改redis挂载在linux上的redis.conf文件,将bind 127.0.0.1ip地址放开,之前注释掉了。 bind 127.0.0.1 这个是绑定了我们的主

    2024年02月03日
    浏览(48)
  • 【Docker系列】docke报错 non-overlapping IPv4 address pool among the defaults to assign to the network 解决方法

    目录 1. 问题 1.1 问题描述 1.2 原因: 1.3 排查步骤:  1.3.1 查看docker 网络 1.3.2 查看网络数量  1.4 解决方案 1.4.1 删除没使用的网络 1.4.2 修改docker默认网络地址 1.4.3 yml指定网络 2.投票   好运气不会凭空而来,要么藏在努力里,要么藏在坚持里。 文章标记颜色说明: 黄色 :重

    2024年02月02日
    浏览(37)
  • 查看Kafka集群下所有的topic报错“Timed out waiting for a node assignment. Call: listTopics“

    没有配置主机IP地址。 取消掉 listeners 的注释,然后修改值为 listeners=PLAINTEXT://192.168.88.142:9092 ,其中 192.168.88.142 是当前服务器的IP地址。 注意:Kafka集群中每台服务器上的 server.properties 配置文件都需要修改 listeners 配置项,都修改为自己对应服务器的IP地址。 修改配置后,关

    2024年02月16日
    浏览(34)
  • 【Kafka】ZooKeeper启动失败报错java.net.BindException: Address already in use: bind

    Kafka 2.8.1 ZooKeeper启动失败。 2181端口被占用。 打开cmd。 无结果返回,找不到占用2181端口的程序。 修改config/zookeeper.properties 找到: 改为: 重新启动ZooKeeper,启动成功。 记得修改config/server.properties,不然Kafka Server无法连接。 找到: 改为: 在解决端口被占用的问题时,首先需

    2024年02月09日
    浏览(49)
  • 登录kafka报错:Could notstart Jolokia agent: java.net.BindException: Address in use

    在执行kafka命令增加或删除topic的时候,发现总是报错。  Address in use?端口还是ip被占用了。只能禁用了,再执行命令。 禁用代码: 然后就可以拉~  总体步骤: 1.先进入k8s的kafka pod 2.进入kafka的bin目录 3.两个unset 4.执行  kafka-topics.sh --create xxxxxxxxx --zookeeper xxxx1:2181,xxxx2:

    2024年01月24日
    浏览(23)
  • Java错误:微服务报错Cannot execute request on any known serve

     报Cannot execute request on any known server 这个错: 连接Eureka服务端地址不对。 检查 .yml 文件或者 .properties 文件配置 下划线+下划线后面的小写字母等同于去掉下划线大写下划线后面的字母(驼峰原则)   应该设置为: 查看.yml或者 .properties 链接Eureka的URL地址是否正确 1、default

    2024年03月14日
    浏览(28)
  • Java 调用Elasticsearch报错java.lang.IllegalStateException: Request cannot be executed; I/O reactor statu

    一、问题描述 线上ES查询服务出现奇怪的问题,调用es查询数据的接口进行过一次查询,过几分钟之后再次用这个接口进行查询就不行了。 二、报错排查 简短报错:java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STOPPED 三、解决问题 经过排查发现可能是出现异常

    2024年02月20日
    浏览(37)
  • ES 查询报错 I/O 异常解决方法: Request cannot be executed; I/O reactor status: STOPPED

    增加一个restClientBuilderCustomizer的bean 参考 https://www.shuzhiduo.com/A/kPzONDQadx/

    2024年02月06日
    浏览(28)
  • 错误:cannot convert ‘ ’ to ‘int’ in assignment

    这是原始代码 在对数组进行赋值的时候出现的这样的错误 /tmp/compiler_lf42y8wv/src: 在函数‘int main()’中: /tmp/compiler_lf42y8wv/src:8:51: 错误:cannot convert ‘花括号内的初始值列表’ to ‘int’ in assignment 8 | s[12]={31,29,31,30,31,30,31,31,30,31,30,31}; | ^ /tmp/compiler_lf42y8wv/src:10:51: 错误:cannot c

    2024年02月04日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包