listeners
listeners
学名叫监听器,其实就是告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。
advertised.listeners
advertised.listeners
Advertised 的含义表示宣称的、公布的,就是说这组监听器是 Broker 用于对外发布的,参数的作用就是将Broker的Listener信息发布到Zookeeper中
-
概念理解
-
两个逻辑概念:一个是kafka的侦听ip,一个是kafka的broker ip。
-
所谓kafka的侦听ip,顾名思义,就是tcp的侦听ip。可以在某个固定的ip上侦听,也可以是全网段进行侦听(0.0.0.0)。如果是在某个固定ip上侦听,例如“127.0.0.1”,那么只有与该ip正确连接的客户端能成功连接到kafka;而如果是全网段侦听,那么可以与kafka所在机器的任意ip进行连接并访问kafka。
-
但与kafka连接成功后,并不意味着就能成功进行生产和消费。
-
成功连接kafka的侦听ip,意味着tcp的三次握手已经成功了,在这之后会进行kafka层面的协议交互,例如用户登录认证,元数据信息获取,向topic生产,消费等。其中最重要的就是元数据信息的获取。
-
kafka的元数据信息包括topic的名称,topic的分区(partition),每个分区的leader所在的broker的ID,以及每个broker的ip地址等。
-
由于向topic的分区进行生产消费,最终都要和分区的leader进行交互。因此,获取到元数据信息后,客户端(生产者或消费者)会和topic分区的leader所在的broker建立新的tcp连接以进行后续的生产消费。这就是kafka的broker ip的作用,即真正用于生产消费的ip地址。
【配置理解】
-
理解了上述两个概念后,再来看listeners和advertised.listeners两个配置项,应该就很容易理解了。
-
listeners配置的是kafka的tcp侦听ip地址;advertised.listeners配置的是kafka的broker ip。
-
在没有配置advertised.listeners的情况下,默认取值为kafka所在机器的主机名,端口与listeners中配置的端口一致。也就是kafka的broker ip是kafka所在机器的主机名。很多情况下,与kafka连接成功但无法正确生产消费的原因就是kafka的主机名无法被正确解析,最常见的就是kafka的主机名为localhost。
-
另外,kafka成功注册zookeeper后,会将broker ip写入到kafka中。这样kafka集群中的每个节点都能知道其他所有节点的broker ip。因此,kafka的客户端无论连接到集群的哪个节点上,都能正确获取到整个集群的元数据信息。
【使用】
-
通常在单网段的情况下(kafka所在机器除回环地址外只有一个访问ip),listeners可配置成指定ip:port;而在多网段的情况下,主要是利用客户端对主机名解析成可访问的网段的ip来正确访问kafka。
-
例如,kafka机器有192和172两个网段,listeners配置为0.0.0.0,主机名配置为node1,advertised.listeners不进行配置。
与192网段能通的客户端将node1配置为kafka的192网段的ip地址,与172网段能通的客户端将node1配置为kafka的172网段的ip地址,这样不同网段的客户端就都能正确访问kafka了。 -
当然也可以通过advertised.listeners指定broker ip。