1 under-replicated partitions異常原因
Kafka報錯under replicated partitions意味著某些分區的副本數量未達到預期的復制因子。
主要有兩種原因,
-
Broker故障
如果某個Kafka Broker發生故障,導致其中一些分區的副本不再可用,那么這些分區就會被標記為"under-replicated" -
副本分配策略
在Kafka集群中,副本分配策略(replica assignment)可能導致某些分區的副本分布不均衡。例如,如果你添加或刪除了Broker,并且未正確調整副本分配策略,就可能導致副本分布不均勻,從而產生"under-replicated partitions"錯誤
$ ./bin/kafka-topics.sh --describe --topic recording --bootstrap-server my-bootstrap:9092
Topic: recording TopicId: lc5n53IzQJaxMRUpafyjlA PartitionCount: 199 ReplicationFactor: 3 Configs: compression.type=lz4,cleanup.policy=delete,retention.ms=172800000,message.format.version=2.8-IV1...Topic: recording Partition: 182 Leader: 2 Replicas: 2,1,0 Isr: 2,0,1Topic: recording Partition: 183 Leader: 2 Replicas: 1,2,0 Isr: 2Topic: recording Partition: 184 Leader: 0 Replicas: 0,1,2 Isr: 2,0,1
上面recording下面的Partition: 183就少了兩個處于同步狀態的副本集合(ISR:In-Sync Replicas),因此會有under-replicated告警。
2 修復方法
一般來說,我們通過下面的步驟就能恢復,
- 重啟leader zookeeper
- 重啟缺少對應副本集合的kafka
這又有另一個問題,如何確定哪個zk實例是leader呢?我們可以連接到zk,通過命令查詢。
因為我的kafka集群是通過k8s部署的,因此需要進入pod,查詢到端口,然后再執行命令,
localhost $ kubectl exec -it zookeeper-0 -- /bin/sh
sh-4.4$ netstat -ntlp | grep "127.0.0.1"
tcp6 0 0 127.0.0.1:12181 :::* LISTEN 78/java
sh-4.4$ echo srvr | nc localhost 12181 | grep Mode
Mode: follower
可見該zk節點并不是leader, 而是follower。
參考文檔:
- https://stackoverflow.com/questions/51491152/fixing-under-replicated-partitions-in-kafka
- https://stackoverflow.com/questions/48924122/how-to-check-which-zookeeper-instance-is-the-leader-within-an-ensemble