涛声依旧在 发表于 2024-8-4 06:24:25

一文搞懂Kafka中的listeners配置策略


[*]listeners中的plaintext controller external是什么意思?
[*]Kraft模式下controller和broker有何区别?
[*]集群节点之间同步什么数据,通过哪个端口,是否可以自界说端口?
[*]客户端通过哪个端口连接到kafka,通过9092连接的是什么,broker照旧controller?
[*]为controller配置了单独的端口有什么用?
[*]control.plane.listener.name与controller.listener.names有何区别?
为了保护Kafka集群安全,那么就要包管Kafka各节点之间的通讯安全。每个Kafka节点必须指定一组Listener,用于接收来自客户端和别的Kafka节点的请求。为了对客户端进行身份验证,可以为每个Listener设置一种安全机制,以确保对集群内部或客户端之间的通讯进行加密。
通过配置listeners,Kafka节点可以监听多个端口。这个属性可以接收以逗号分隔的Listener列表。必须为每个Kafka节点指定至少一个Listener。Listener的格式如下:
{LISTENER_NAME}://{hostname}:{port}

LISTENER_NAME通常是一个见名知意的名称,用于说明Listener的目的。比方,把接收客户端流量的Listener称为CLIENT:
listeners=CLIENT://localhost:9092
Listener的安全协议在单独的配置中指定:
listener.security.protocol.map
这个配置项的值是一个map集合,Listener与安全协议使用冒号分隔,元素之间使用逗号分隔。云云以来就为每个Listener指定了安全协议。比方,指定CLIENTListener将使用SSL,而BROKERListener将使用PLAINTEXT。
listener.security.protocol.map=CLIENT:SSL,BROKER:PLAINTEXT
安全协议有如下选项(不区分巨细写):

[*]PLAINTEXT
[*]SSL
[*]SASL_PLAINTEXT
[*]SASL_SSL
我们先看PLAINTEXT,该协议不提供安全性,也不需要任何额外的配置。后续章节中再介绍怎样配置其余的协议。
如果每个Listener使用单独的安全协议,也可以使用安全协议名称直接作为listeners中的Listener名称。基于上面的示例,我们可以像下面如许界说:
listeners=SSL://localhost:9092,PLAINTEXT://localhost:9093
但是,我们发起为Listener提供显式名称,因为这会让每个Listener的用途更清晰。
可以通过inter.broker.listener.name来配置Broker之间通讯的Listener。Broker之间的通讯重要是分区复制。如果没有指定,则Broker间Listener由security.inter.broker.protocol指定的安全协议确定,缺省为PLAINTEXT。
在KRaft集群中,配置项process.roles用于指定节点的角色,允许指定的角色有broker和controller,或者同时指定二者。配置项inter.broker.listener.name专门用于指定Broker之间的通讯使用哪个Listener。另一方面,控制器必须使用单独的Listener,该Listener由controller.listener.names配置。并且与inter.broker.listener.name的值类似。
   对于依赖Zookeeper的经典集群,可以通过control.plane.listener.name配置一个单独的Listener,用于转达从活动Controller节点到Broker节点的元数据。如许做的利益是,可以使用一个单独的线程处置惩罚这部分通讯,这使得应用程序流量不妨碍元数据更改的及时转达(比方分区leader和ISR更新)。请注意,如果未设置control.plane.listener.name,则使用与inter.broker.listener(译注:可以叫做数据平面Listener)类似的Listener。
controller接收来自别的controller节点和broker节点的请求。由于这个原因,纵然节点不是控制器角色(即它只是一个Broker),它仍旧必须指定控制器Listener以及配置它所需的任何安全属性(译注:controller要知道集群中全部的节点信息,因此指定这个配置项,就可以把broker自身信息上报给controller)。比方,我们大概在独立Broker上使用以下配置:
process.roles=broker # 本节点是broker节点
listeners=BROKER://localhost:9092
inter.broker.listener.name=BROKER
controller.quorum.voters=0@localhost:9093 # 指定全部控制器节点
controller.listener.names=CONTROLLER # 指定控制器Listener
listener.security.protocol.map=BROKER:SASL_SSL,CONTROLLER:SASL_SSL # 指定控制器Listener安全协议
在本例中,固然配置了控制器Listener,但是它并未包含在listeners中,因为broker节点不需要开放控制器Listener。在这种情况下将使用controller.quorum.voters配置的端口。这是投票权配置项,它指定了所有控制器的列表。
对于同时启用broker和controller角色的KRaft集群节点,配置是类似的。唯一的区别是控制器Listener必须包含在listeners中:
process.roles=broker,controller
listeners=BROKER://localhost:9092,CONTROLLER://localhost:9093 # 此处需要同时指定代理Listener和控制器Listener
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
controller.quorum.voters中指定的端口要与listeners列表中公开的控制器Listener之一完全匹配。投票者精确匹配一个公开的控制器Listener。比方,这里CONTROLLERListener绑定到端口9093。然后,由controller.quorum.voters指定的连接字符串也必须使用端口9093。
控制器将接收controller.listener.names指定的任意Listener上的请求。通常只有一个控制器Listener,但也大概有更多。比方,集群通过滚动更新将活动Listener从一个端口或安全协议更改为另一个端口或安全协议的方法(一次滚动公开新的Listener,一次滚动删除旧的Listener)。当指定了多个控制器Listener时,列表中的第一个Listener将用于发送请求。
在下一节中,将介绍怎样在Listener上启用SSL以进行加密和身份验证。接下来的部分将介绍使用SASL的其他身份验证机制。
总结

Listener格式如下:
{LISTENER_NAME}://{hostname}:{port}

listeners配置项允许配置多个Listener:
listeners=CLIENT://localhost:9092,CONTROLLER://localhost:9093
同时需要通过listener.security.protocol.map为每个Listener指定安全协议。
在传统ZK集群上,使用control.plane.listener.name指定控制器Listener,而Kraft集群上则通过controller.listener.names指定控制器Listener。
   参考:
https://kafka.apache.org/documentation/#listener_configuration

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 一文搞懂Kafka中的listeners配置策略