apache-kafka - Kafka 2.2.0 中现有 ISR 的领导人选举失败
问题描述
我有一个具有以下配置/部署详细信息的 3 节点 kafka-cluster(代理版本 2.2.0):
- 每个主题的分区数:我们的应用程序主题有 3-4 个分区。
__consumer_offsets
分区由 Kafka 自行确定 -100
分区 - ReplicationFactor:2(包括主题:
__consumer_offsets
主题) - Broker-Id 是:
0, 1
和2
- 当一个节点关闭时,相应的 Zookeeper 实例也会关闭。即部署更多的是作为单个设备运行对每个设备的 Kafka + ZK
我正在测试单节点中断行为并关闭broker-id 0
(以及相应的托管 ZK 实例)
我观察到的是:在降低之前broker-id 0
,以下是通过describe-topic CLI
for topic:检索到的分布__consumer_offsets
。我们的应用程序主题的行为也是相同的
关闭后broker-id 0
,相同分区的相同输出如下所示:
现在,主要关心的是Leader: -1"
。当某些分区(例如上面的分区)的领导者有效ISR broker-id 2
且何时是活动的时,为什么分区 -不选择这些分区的领导者?broker-id 2
2, 5, 8
broker-id 2
0, 3, 6, 9
broker-id 2
我试图找出是否存在双重故障 - 即。不止一个经纪人同时倒闭。broker-id 1
但是,在和的日志中找不到任何相同的证据2
如上所述,我希望分区 -0, 3, 6, 9
在出现故障broker-id 2
时作为领导者broker-id 0
。
请澄清
- 为什么没有达到上述预期
- 还请说明是否有任何特定的代理日志消息要扫描,以说明在这种情况下为什么
broker-id 2
没有被选为分区的领导者0, 3, 6, 9
- 除了单节点中断之外的任何其他情况都可能导致这种情况
- 我还检查了 ZK 集成是否完好无损,并且当一个节点被关闭时,它只在两个节点上工作正常
解决方案
我怀疑问题是不干净的领导选举(缺乏)和一个小的 ISR(同步副本)集:
代理 0 崩溃后,分区 0 是无领导的。它还将 0 显示为 ISR 集的单个(!)成员 - 这意味着 kafka 元数据状态代理 0 具有唯一的用户数据(已确认给原始生产者),这是在其他任何地方都找不到的。允许除 0 之外的任何代理成为此分区的领导者将导致数据丢失 - 如果/当 0 重新加入时,它将截断其“头部”数据以匹配新领导者所拥有的 - 从而丢弃此唯一数据。您需要启用不干净的领导者选举的设置才能发生这种情况。
例如,分区 1 从代理 0 过渡到代理 1,这意味着在代理 0 关闭后,成功为您的集群选择了一个新的 kafka 控制器。
您可以探索以防止这种情况发生的其他选项是增加代理端的 min isr(以及您的整体复制因子,否则任何代理的丢失都会使分区变为只读)和/或增加生产者端的 acks 设置
有关这些设置的更多详细信息,请参阅https://www.cloudera.com/documentation/kafka/latest/topics/kafka_ha.html。
推荐阅读
- visual-studio-code - 是否有类似于 VIM 的 VSCode 快捷方式或命令用于 grepping 行?
- iis - IIS 10.0 AppPool 崩溃
- cmake - 扩展名为 .OBJ 的 CMake 和文本文件
- java - JSON值类型是否需要严格定义?
- c - Tic Tac Toe 2D Char Array 未在 row=0 中更新,col=0--C
- javascript - 在 Firestore 中创建排行榜
- python - 如何在猜数字游戏中添加不同级别和退出选项?
- php - 卡在数据库查询,laravel
- python - 在不聚合的情况下转置 Pandas DataFrame
- python - 如何获取每批中使用的数据的索引?