kafka中提供了listeners和advertised.listeners两个配置项,两个配置项的具体含义和作用是什么,有些什么区别,以及应该如何进行配置呢?
【概念理解】
要搞清楚这些问题,首先得搞清楚两个逻辑概念:一个是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。