cdh6.3.2集群有一台服务器宕机了,重新恢复后,发现kafka集群无法正常启动,报错日志如下,其中 TopicRunData 是kafka消费的topic。
1、错误分析
[Controller id=469 epoch=67] Controller 469 epoch 67 failed to change state for partition TopicRunData-2 from OfflinePartition to OnlinePartition kafka.common.StateChangeFailedException: Failed to elect leader for partition
TopicRunData -2 under strategy OfflinePartitionLeaderElectionStrategy at kafka.controller.PartitionStateMachine$$anonfun$doElectLeaderForPartitions$3.apply(PartitionStateMachine.scala:390) at kafka.controller.PartitionStateMachine$$anonfun$doElectLeaderForPartitions$3.apply(PartitionStateMachine.scala:388) at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59) at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48) at kafka.controller.PartitionStateMachine.doElectLeaderForPartitions(PartitionStateMachine.scala:388) at kafka.controller.PartitionStateMachine.electLeaderForPartitions(PartitionStateMachine.scala:315) at kafka.controller.PartitionStateMachine.doHandleStateChanges(PartitionStateMachine.scala:225) at kafka.controller.PartitionStateMachine.handleStateChanges(PartitionStateMachine.scala:141) at kafka.controller.PartitionStateMachine.triggerOnlinePartitionStateChange(PartitionStateMachine.scala:123) at kafka.controller.PartitionStateMachine.triggerOnlinePartitionStateChange(PartitionStateMachine.scala:109) at kafka.controller.KafkaController.kafka$controller$KafkaController$$onBrokerStartup(KafkaController.scala:382) at kafka.controller.KafkaController$BrokerChange$.process(KafkaController.scala:1318) at kafka.controller.ControllerEventManager$ControllerEventThread$$anonfun$doWork$1.apply$mcV$sp(ControllerEventManager.scala:94) at kafka.controller.ControllerEventManager$ControllerEventThread$$anonfun$doWork$1.apply(ControllerEventManager.scala:94) at kafka.controller.ControllerEventManager$ControllerEventThread$$anonfun$doWork$1.apply(ControllerEventManager.scala:94) at kafka.metrics.KafkaTimer.time(KafkaTimer.scala:31) at kafka.controller.ControllerEventManager$ControllerEventThread.doWork(ControllerEventManager.scala:93) at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:82)
从提供的错误信息来看,Kafka Broker中存在4个离线分区(offline partitions),并且在尝试将其中一个分区
TopicRunData -2
从OfflinePartition
状态转换到OnlinePartition
状态时失败了。具体原因是未能为该分区选举出领导者(leader)。这个异常是由kafka.common.StateChangeFailedException
引发的,并指出在使用OfflinePartitionLeaderElectionStrategy
策略下无法选出分区领导者。
结合上面的场景, 这是由于服务器宕机造成分区的数据不完整或元数据损坏 。
使用kafka-topics.sh
命令检查主题状态:
kafka-topics.sh --describe --topic TopicRunData --bootstrap-server cdh01:9092
看到信息如下:
Topic:TopicRunData PartitionCount:3 ReplicationFactor:1 Configs:min.insync.replicas=1,segment.bytes=1073741824,retention.ms=604800000,max.message.bytes=1000000,min.cleanable.dirty.ratio=0.5,unclean.leader.election.enable=false,retention.bytes=-1,delete.retention.ms=604800000
Topic: TopicRunData Partition: 0 Leader: 299 Replicas: 299 Isr: 299
Topic: TopicRunData Partition: 1 Leader: 384 Replicas: 384 Isr: 384
Topic: TopicRunData Partition: 2 Leader: none Replicas: 298 Isr:
这意味着每个分区的数据只在一个broker上保存,没有副本。这样如果该broker发生故障,相应的分区数据将不可用,从而影响到数据的高可用性。通常建议至少设置Replication Factor
为3以确保高可用。 可惜之前由于存储压力等原因只有1个副本。
分区2显示没有Leader(Leader: none),且ISR(In-Sync Replicas)列表为空。这表明分区2目前处于未分配状态,可能是由于负责该分区的broker(Replicas: 298)出现故障或者与ZooKeeper的通信出现问题。这种情况下,该分区的数据无法被消费或生产
2、手动选举leader
为
TopicRunData 主题中无leader的分区手动分配并重新选举leader。执行以下命令:
kafka-preferred-replica-election.sh --bootstrap-server cdh01:9092 --path-to-json-file partition.json
创建一个名为partition.json
的文件,其中包含以下内容:
{
"partitions": [
{
"topic": "TopicRunData",
"partition": 2
}
]
}
这将触发platformMutiRunData
主题第2分区的leader重新选举。
partition.json 有可能需要更多参数,请根据实际情况调整或找更详细的教程。
3、清空Topic来解决问题
由于无法手动选择,解决时间又紧迫,根据分析可能丢失数据少,所以想清空TopicRunData 主题的数据,从外部重新导入数据到 TopicRunData 。
注意:这将删除
TopicRunData 主题的所有数据。在执行此操作之前,请确保您了解此操作的后果,并备份好相关数据。
清空 TopicRunData 主题的数据:
kafka-topics.sh --delete --topic
TopicRunData --bootstrap-server cdh01:9092
然后重新创建该主题(如果需要):
kafka-topics.sh --create --topic
TopicRunData --bootstrap-server cdh01:9092 --replication-factor 1 --partitions 3
检查Kafka集群状态:
kafka-consumer-groups.sh --bootstrap-server cdh01:9092 --describe --group
your_consumer_group
请将your_consumer_group
替换为您要检查的实际消费者组ID。
确保所有Kafka broker正常运行。