首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kafka分区领导者-1只在SSL上

Kafka分区领导者-1只在SSL上
EN

Stack Overflow用户
提问于 2021-08-09 00:47:43
回答 1查看 94关注 0票数 1

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

使用Kafka版本2.7.0。

除了一个集群之外,所有区域和所有集群都可以在SSL上正常工作。

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

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

代码语言:javascript
复制
# 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上执行相同的命令时,kafkacat发现:

  1. 0代理
  2. 列出主题和分区,但没有领导者

代码语言:javascript
复制
# 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,都能很好地工作。

inter.broker.protocol和与动物园管理员集群的通信是明文的。SSL目前只用于与Kafka客户端对话。尚未使用任何身份验证,客户端也不验证服务器的证书。

集群是使用AMI的Packer和部署的Terraform构建的,所有这些都是自动的。我反复检查过,与其他集群相比,这个集群的配置并没有什么不同。

使用的证书由我们加密。我甚至尝试从该区域的其他集群复制证书,这很好,但仍然得到了相同的结果。

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

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

编辑:更多的调查显示,此集群上Kafka代理的Zookeeper记录遗漏了SSL映射:

代码语言:javascript
复制
{"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"}

相对于“健康”集群:

代码语言:javascript
复制
{"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"}

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

代理的server.properties文件过去没有listener.security.protocol行,因为我们想要默认值,但是即使这样取消注释也没有什么区别:

代码语言:javascript
复制
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL

所以现在的问题是--卡夫卡从哪里得到它在动物园管理员记录中的信息?

EN

回答 1

Stack Overflow用户

发布于 2021-08-10 00:57:49

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

代码语言:javascript
复制
# /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上工作,就像对纯文本一样。

删除命令:

代码语言:javascript
复制
/opt/kafka/bin/kafka-configs.sh --bootstrap-server $(hostname):9092 --entity-type brokers --entity-name x --alter --delete-config advertised.listeners

其中x是集群中的每个broker.id

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68705781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档