【问题标题】:Kafka partition leader -1 ONLY over SSLKafka 分区领导者 -1 仅通过 SSL
【发布时间】:2021-10-12 18:38:11
【问题描述】:

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

使用 Kafka 版本 2.7.0。

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

在其他工具中,我使用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 执行相同的命令时,kafkacat 发现:

  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,都可以完美运行。

inter.broker.protocol 和与 Zookeeper 集群的通信是明文。 SSL 目前仅用于与 Kafka 客户端通信。尚未使用身份验证,并且客户端不验证服务器的证书。

集群是使用 Packer for AMI 和 Terraform 进行部署构建的,这一切都是自动的。我反复检查了这个集群的配置与其他集群的配置没有什么不同。

使用的证书由 Let's Encrypt 颁发。我什至尝试从该区域的其他集群复制证书,效果很好,但我仍然得到相同的结果。

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

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

编辑:更多调查显示此集群上 Kafka 代理的 Zookeeper 记录错过了 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 记录在我们停止代理时被删除,但在我们启动时显示相同的错误内容。

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

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

所以现在的问题是——Kafka 从哪里得到它放入 Zookeeper 记录的信息?

【问题讨论】:

    标签: ssl apache-kafka apache-zookeeper kafkacat


    【解决方案1】:

    问题原来是在该集群上设置了 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}
    

    没有此问题的其他集群将此记录为空。 删除坏集群的 if 解决了问题,kafkacat 开始通过 SSL 工作,就像它对 PLAINTEXT 所做的一样。

    要删除的命令:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-08
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2018-05-25
      • 2023-04-05
      • 2020-10-18
      相关资源
      最近更新 更多