当前位置: 首页 > 知识库问答 >
问题:

Kafka分区领导者-1仅通过SSL

祁凯泽
2023-03-14

我正在努力通过SSL移动所有Kafka流量。每个区域有两个集群。

使用Kafka 2.7.0版。

除一个集群外,所有区域和所有集群都可以通过SSL正常工作。

在其他工具中,我使用< code>kafkacat来探测集群。

kafkacat-L通过明文连接对此集群执行时,它会列出所有代理、主题和分区,并显示每个分区的领导者:

# kafkacat -b kafka-cluster1-kafka-brokers.domain.com:9092 -L | head
Metadata for all topics (from broker -1: kafka-cluster1-kafka-brokers.domain.com:9092/bootstrap):
 4 brokers:
  broker 1 at kafka-cluster1-kafka-1.domain.com:9092 (controller)
  broker 4 at kafka-cluster1-kafka-4.domain.com:9092
  broker 2 at kafka-cluster1-kafka-2.domain.com:9092
  broker 3 at kafka-cluster1-kafka-3.domain.com:9092
 49 topics:
  topic "topic.name" with 4 partitions:
    partition 0, leader 3, replicas: 3,2,1, isrs: 1,2,3
    partition 1, leader 1, replicas: 1,3,4, isrs: 1,3,4

当通过 SSL 执行相同的命令时,Kafka猫会发现:

  1. 0经纪人
  2. 列出主题和分区,但没有标题
# kafkacat -b kafka-cluster1-kafka-brokers.domain.com:9093 -X security.protocol=SSL -X ssl.endpoint.identification.algorithm=none -X enable.ssl.certificate.verification=false -L | head
Metadata for all topics (from broker -1: ssl://kafka-cluster1-kafka-brokers.domain.com:9093/bootstrap):
 0 brokers:
 49 topics:
  topic "topic_name" with 4 partitions:
    partition 0, leader -1, replicas: 3,2,1, isrs: 1,2,3, Broker: Leader not available
    partition 1, leader -1, replicas: 1,3,4, isrs: 1,3,4, Broker: Leader not available
    partition 2, leader -1, replicas: 4,1,2, isrs: 1,2,4, Broker: Leader not available
    partition 3, leader -1, replicas: 2,4,3, isrs: 2,3,4, Broker: Leader not available

对该地区的另一个集群使用相同的命令,无论是通过明文还是通过SSL,都可以完美地工作。

< code > inter . broker . protocol 以及与Zookeeper集群的通信是明文。SSL目前仅用于与Kafka客户端对话。还没有使用身份验证,客户端也没有验证服务器的证书。

集群是使用打包器进行AMI构建的,使用Terraform进行部署,这一切都是自动的。我已经三重检查了此群集的配置与其他群集相比没有任何不同。

使用的证书是由Let's Encrypt发行的。我甚至尝试从该区域的另一个集群复制证书,这样做很好,但我仍然得到相同的结果。

除了主机名之外,使用 SSL 的群集和不使用 SSL 的群集之间的配置是相同的。

还有什么会导致这种奇怪的行为?

编辑:更多调查显示,此集群上 Kafka 代理的动物园管理员记录缺少 SSL 映射:

{"features":{},"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://kafka-cluster1-kafka-1.domain.com:9092"],"rack":"ap-southeast-2a","jmx_port":9999,"port":9092,"host":"kafka-cluster1-kafka-1.domain.com","version":5,"timestamp":"1628554957052"}

与“健康”集群相反:

{"features":{},"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT","SSL":"SSL"},"endpoints":["PLAINTEXT://kafka-cluster2-kafka-1.domain.com:9092","SSL://kafka-cluster2-kafka-1.domain.com:9093"],"rack":"ap-southeast-2a","jmx_port":9999,"port":9092,"host":"kafka-cluster2-kafka-1.domain.com","version":5,"timestamp":"1626842428002"}

当我们停止代理时,Zookeeper记录会被删除,但当我们启动它时,会出现相同的错误内容。

代理的< code>server.properties文件过去没有< code > listener . security . protocol 行,因为我们需要缺省值,但是即使像这样取消注释也没有什么不同:

listener.security.protocol.map=PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL

所以现在的问题是——Kafka从哪里获得它放入《动物园管理员》记录中的信息?

共有1个答案

南门星河
2023-03-14

问题是Kafka动态配置是在该集群上设置的,并且覆盖了文本文件中设置的“静态”配置。

# /opt/kafka/bin/kafka-configs.sh --bootstrap-server $(hostname):9092 --entity-type brokers --entity-name 1 --describe
Dynamic configs for broker 1 are:
  advertised.listeners=PLAINTEXT://kafka-cluster1-kafka-1.domain.com:9092 sensitive=false synonyms={DYNAMIC_BROKER_CONFIG:advertised.listeners=PLAINTEXT://kafka-cluster1-kafka-1.domain.com:9092, STATIC_BROKER_CONFIG:advertised.listeners=PLAINTEXT://kafka-cluster1-kafka-1.domain.com:9092,SSL://kafka-cluster1-kafka-1.domain.com:9093}

其他没有此问题的集群将此记录为空。删除如果为坏集群修复了问题,并且kafkacat开始通过SSL工作,就像它对PLAINTEXT所做的那样。

要删除的命令:

/opt/kafka/bin/kafka-configs.sh --bootstrap-server $(hostname):9092 --entity-type brokers --entity-name x --alter --delete-config advertised.listeners

其中< code>x是群集中的每个< code>broker.id。

 类似资料:
  • 我们从每个kafka机器的中得到了许多错误(集群中有kafka) 根据我的理解,每个主题都由一个或多个经纪人服务--一个是领导者,其余的经纪人是追随者。

  • 可能是Kafka的复制品——该服务器不是该主题分区的领导者,但没有公认的答案,也没有明确的解决方案。 我有一个简单的java程序来向Kafka传达信息: 我得到了以下例外: 当我尝试使用时,我得到以下错误: 当我描述我的主题时,我有以下信息: 我试着创建一个新的主题,并按照《快速入门指南》中提到的那样生成消息,然后上述步骤都很有效。 我应该在或producer configuration(生产者配

  • 第一次与Kafka和多克合作。我正试图向Kafka发布一条消息,但出现了一个错误(请看下面)。问题是什么? 2020-07-21 16:37:40274警告[Kafka制作人网络线程|制作人-1]组织。阿帕奇。Kafka。客户。NetworkClient$DefaultMetadataUpdater:[Producer-clientId=Producer-1]1个分区的前导代理没有匹配的侦听器,包

  • 我已经编写了一个streams应用程序,用于在由5个代理和10个分区组成的集群上与主题对话。我在这里尝试了多种组合,比如10个应用程序实例(在10台不同的机器上),每个实例有1个流线程,5个实例每个实例有2个线程。但由于某种原因,当我签入kafka manager时,分区和流线程之间的1:1映射没有发生。一些线程正在拾取2个分区,而一些线程没有拾取任何分区。你能帮我做同样的事吗??所有线程都是同一

  • 我有一个单一的消费者在消费一个话题。主题有6个分区。分配给该组的单个使用者。我会像下面的那样进行轮询,当没有记录返回时,我会退出使用者提取。 从文档来看,我相信当没有记录要消耗时,轮询返回空,并且持续时间10000足以重新平衡和获取记录。大多数情况下,poll从所有分区中消耗记录,但有些情况下,poll从3个分区中提取记录并返回空记录而不消耗其他3个分区。 顺便说一句,我使用的是2.0.1的Kaf

  • 我知道kafka将一个主题的数据安排在许多分区上,一个消费者组中的消费者被分配到不同的分区,从那里他们可以接收数据: 我的问题是: 术语,它们是由主机/IP标识的,还是由客户端连接标识的? 换句话说,如果我启动两个线程或进程,使用相同的消费者组运行相同的Kafka客户端代码,它们被认为是一个消费者还是两个消费者?