前言
Kafka是一种分布式流平台,广泛用于大数据处理和实时流处理任务。它的核心功能之一就是支持高效的消息传递和流数据的处理,尤其在微服务架构中,Kafka被用作事件流的主要通道。为了实现稳定、安全、可靠的数据传输,Kafka提供了多种配置选项来调节其网络行为。在这些配置项中,有几个参数尤其重要:listeners
、advertised.listeners
、listener.security.protocol.map
、inter.broker.listener.name
。
这些配置项的功能看似简单,但在大规模的分布式环境下,它们的正确配置关系着Kafka集群的性能、安全性及互操作性。本文将深入解析这几个配置项的含义、作用以及它们之间的相互关系,帮助你更好地理解并应用Kafka的配置。
详细内容
1. listeners
-
概念:
listeners
配置指定了Kafka监听客户端连接的网络接口及端口。Kafka允许通过不同的协议和端口与外部进行通信,listeners
参数指定了这些接口。 -
配置示例:
listeners=PLAINTEXT://0.0.0.0:9092
这个配置表示Kafka监听所有网络接口上的9092端口,使用
PLAINTEXT
协议(无加密)。 -
重要性:此配置决定了Kafka集群对外暴露的网络接口,若集群具有多个网络接口或者需要配置不同协议(如SSL或SASL认证),则
listeners
配置尤为重要。 -
应用场景:在一些场景中,例如开发环境或者测试环境中,可能只需要一个监听端口和协议。但是在生产环境中,你可能需要为Kafka集群配置多个监听器,以应对不同的安全需求或网络拓扑。
2. advertised.listeners
-
概念:
advertised.listeners
配置告诉客户端如何连接到Kafka集群。虽然listeners
定义了Kafka集群接受连接的地址,但客户端可能无法直接访问这个地址,尤其是在使用NAT(网络地址转换)或者跨多个网络区域时,advertised.listeners
提供了对客户端可访问的地址。 -
配置示例:
advertised.listeners=PLAINTEXT://kafka.example.com:9092
这表示Kafka集群会将
kafka.example.com:9092
作为集群对外的可访问地址。 -
重要性:
advertised.listeners
是解决网络拓扑中客户端与Kafka集群间连接问题的关键配置。特别是在集群节点处于不同网络环境时,advertised.listeners
使客户端能够正确连接。 -
应用场景:例如,Kafka集群中的节点可能部署在内网,而外部客户端需要通过一个负载均衡器或者反向代理访问Kafka,
advertised.listeners
可以用于提供对外暴露的域名和端口。
3. listener.security.protocol.map
-
概念:
listener.security.protocol.map
配置用来为每个listener
定义一个安全协议。Kafka支持多种安全协议,如PLAINTEXT
、SSL
、SASL_PLAINTEXT
和SASL_SSL
。此配置允许为每个监听器指定不同的安全协议。 -
配置示例:
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,SSL:SSL
这个配置意味着
PLAINTEXT
协议的监听器使用PLAINTEXT
安全协议,而SSL
协议的监听器使用SSL
安全协议。 -
重要性:在生产环境中,数据传输的安全性至关重要,特别是在公共网络上传输敏感数据时,必须使用加密协议(如SSL)。
listener.security.protocol.map
允许为不同的连接设置不同的安全级别。 -
应用场景:例如,你可能需要为内网流量使用
PLAINTEXT
协议,而为外网流量使用SSL
协议。这时,listener.security.protocol.map
提供了配置灵活性。
4. inter.broker.listener.name
-
概念:
inter.broker.listener.name
指定集群内部节点之间使用的监听器。Kafka集群中的各个Broker节点需要通过内部的通信协议互相交换元数据、处理分区迁移等任务。inter.broker.listener.name
配置了Kafka内部通信使用的监听器名称。 -
配置示例:
inter.broker.listener.name=INTERNAL
这个配置表示集群内部的通信将使用名为
INTERNAL
的监听器。 -
重要性:此配置项的设置对于集群内部通信的隔离至关重要。通常,内部通信会使用私有网络或安全的协议进行,以防止泄漏敏感信息。
-
应用场景:在多网卡或多子网环境中,可以将集群内部流量与外部流量分开,以提高安全性和网络性能。例如,可以为集群内部通信配置专用的
SSL
协议,而外部通信使用PLAINTEXT
协议。
5. 它们的关联性
listeners
和advertised.listeners
的关系:listeners
定义Kafka接受连接的地址,而advertised.listeners
告诉客户端如何连接到Kafka集群。这两个配置项互为补充。
listeners
和listener.security.protocol.map
的关系:listeners
定义了Kafka监听的端口和协议,而listener.security.protocol.map
为每个协议指定了具体的安全协议。两者结合决定了Kafka集群的网络安全策略。
inter.broker.listener.name
的角色:inter.broker.listener.name
与listeners
不同,它影响的是集群内部节点之间的通信。这个配置帮助将内部流量与外部流量进行隔离,确保集群在通信时不会泄漏敏感信息。
连接不上示例
初始连接
这里以springboot项目为例子
spring:
kafka:
bootstrap-servers: localhost:17124,localhost:17125,localhost:17126
在Spring Boot应用程序中,spring.kafka.bootstrap-servers
配置项指定了Kafka集群的引导服务器(Bootstrap Servers)。具体来说:
主要作用:
bootstrap-servers
定义了一组Kafka broker的地址,客户端通过这些地址与Kafka集群进行通信。引导服务器是Kafka集群的初始连接点,它们并不需要包含集群中的所有Broker节点,客户端在连接到这些引导服务器后,会通过它们获取集群的元数据(包括其他Broker的地址、Topic信息、分区信息等),然后与其他Broker进行后续的通信。
配置项解析:
spring:
kafka:
bootstrap-servers: localhost:17124,localhost:17125,localhost:17126
-
localhost:17124, localhost:17125, localhost:17126
:这三个地址是Kafka集群中的Broker节点的地址,通常是集群中多个节点的地址。Spring Kafka客户端会通过这些地址之一尝试建立连接。
localhost
是Kafka Broker所在的机器的地址(通常是主机名或者IP地址)。17124
、17125
、17126
是Kafka Broker监听的端口号。
工作原理:
- 当Kafka客户端(如生产者或消费者)启动时,它会先尝试连接到
bootstrap-servers
中列出的任意一个Kafka broker(这些通常是集群中的任意几个节点,客户端不需要知道集群中所有的节点)。 - 客户端成功连接到这些引导服务器后,会通过它们获取整个Kafka集群的元数据,包括所有Broker的地址、Topic、分区等信息。
- 客户端然后会与其他Kafka Broker进行通信,执行读写操作。
如果这里连接不上:问题就是ip和端口不可达,你排查的方向也是这里,如果是容器部署,要看看映射的端口是否一致,防火墙端口是否开启
创建topic超时或不可达
这里和上面有区别的,上面是获取相关信息,下面就是对broker进行操作了
重点关注advertised.listeners配置即可
我的报错是不知道acowbo-data-center-kafka-one
,然后我去看了配置文件server.properties
如下
这是我一开始部署的,直接使用了容器名称,不在同一个docker网络下无法访问
重点
重点强调几个问题
1、在advertised.listeners中的每一个前缀都要不同,否则会报错,比如我用了PLAINTEXT
2、在advertised.listeners中的每一个前缀在listener.security.protocol.map中都要存在,否则也会报错