我注意到我的卡夫卡主题很少以我无法清楚地解释的方式行事。
例如:
./kafka-topics.sh --describe --zookeeper ${ip}:2181 --topic test
Topic:test PartitionCount:3 ReplicationFactor:1 Configs:retention.ms=1209600000
Topic: test Partition: 0 Leader: 1 Replicas: 1 Isr: 1
Topic: test Partition: 1 Leader: -1 Replicas: 2 Isr: 2
Topic: test Partition: 2 Leader: 3 Replicas: 3 Isr: 3
我特别关心分区:1,它显示领导者"-1"。
我还注意到,由于"超时",针对此主题生成的消息中大约有 1/3 失败。我认为这是一个分区没有领导者的结果。
我想知道是否有人深入了解为什么会出现此问题以及如何在生产场景中从中恢复而不会丢失数据?
编辑: 我正在使用基于 librdkafka 的 python 生产者;我看到的错误消息是Message failed delivery: KafkaError{code=_MSG_TIMED_OUT,val=-192,str="Local: Message timed out"}
很可能你的第二个 kafka 代理已经关闭了。 为了检查活跃的Kafka代理,您需要运行
./zookeeper-shell.sh localhost:2181 <<< "ls /brokers/ids"
输出应类似于以下内容:
Connecting to localhost:2181
Welcome to ZooKeeper!
JLine support is enabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] ls /brokers/ids
[0, 1, 2]
[zk: localhost:2181(CONNECTED) 1]
如果第二个代理未在活动代理中列出,那么您需要找出未启动并运行的原因(日志应告诉您是否出了问题(。我还建议增加复制因子,因为您具有多代理配置。
这通常表示领导该分区的代理处于脱机状态。我会检查脱机分区指标以确认这一点,但也检查代理 2 当前是否正常工作。
在最新版本的 kafka 中,而不是 -1,使用了 None。 要查看脱机分区,请运行以下命令
./kafka-topics.sh --zookeeper <zookeeper_ip>:2181 --describe | grep "Leader: None"