【问题标题】:Missing messages on Kafka's compacted topicKafka 压缩主题上缺少消息
【发布时间】:2019-09-20 15:41:02
【问题描述】:

我有一个压缩的主题:

/opt/kafka/bin/kafka-topics.sh --zookeeper localhost --describe --topic myTopic
Topic:myTopic   PartitionCount:1    ReplicationFactor:1 Configs:cleanup.policy=compact

上面没有消息:

/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic myTopic --from-beginning --property print-key=true
^CProcessed a total of 0 messages

不过,唯一存在的分区上最早和最新的偏移量都是 12。

/opt/kafka/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic myTopic --time -2
myTopic:0:12

/opt/kafka/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic myTopic --time -1
myTopic:0:12

我想知道这 12 条消息会发生什么?数字是正确的,我原以为他们会在那里,但由于某种原因他们不见了。

据我了解,即使这 12 条消息具有相同的密钥,我也应该至少看到一个 - 这就是压缩的工作原理。

有问题的主题被创建为压缩。在那段时间可能发生的唯一奇怪的事情是 Kafka 实例完全丢失了它的 Zookeeper 数据。会不会也造成了数据丢失?

改写最后一个问题:如果我删除 Zookeeper 上所有与 Kafka 相关的 ZNode,Kafka 上的物理数据会发生什么不好的事情吗?

另外,这里有一些来自 Kafka 启动的日志。

[2019-04-30 12:02:16,510] WARN [Log partition=myTopic-0, dir=/var/lib/kafka] 发现与日志文件 /var/lib/kafka/myTopic 对应的索引文件损坏-0/000000000000000000000.log 由于发现索引损坏,索引文件 (/var/lib/kafka/myTopic-0/00000000000000000000.index) 的大小非零,但最后一个偏移量为 0,不大于基本偏移量 0 .},恢复段和重建索引文件...(kafka.log.Log)

[2019-04-30 12:02:16,524] INFO [Log partition=myTopic-0, dir=/var/lib/kafka] 已完成 1 个段的日志加载,日志起始偏移量 0 和日志结束偏移量 12在 16 毫秒内 (kafka.log.Log)

[2019-04-30 12:35:34,530] INFO Got user-level KeeperException when processing sessionid:0x16a6e1ea2000001 type:setData cxid:0x1406 zxid:0xd11 txntype:-1 reqpath:n/a Error Path:/config/主题/myTopic 错误:KeeperErrorCode = NoNode for /config/topics/myTopic (org.apache.zookeeper.server.PrepRequestProcessor)

[2019-04-30 12:35:34,535] INFO 主题创建 Map(myTopic-0 -> ArrayBuffer(0)) (kafka.zk.AdminZkClient)

[2019-04-30 12:35:34,547] INFO [ReplicaFetcherManager on broker 0] 删除了 myTopic-0 分区的 fetcher (kafka.server.ReplicaFetcherManager)

[2019-04-30 12:35:34,580] INFO [Partition myTopic-0 broker=0] 未找到分区 myTopic-0 (kafka.cluster.Partition) 的检查点高水位标记

[2019-04-30 12:35:34,580] 为分区 myTopic-0 加载了 INFO 副本,初始高水印为 0 (kafka.cluster.Replica)

[2019-04-30 12:35:34,580] INFO [Partition myTopic-0 broker=0] myTopic-0 从偏移量 12 的 Leader Epoch 0 开始。之前的 Leader Epoch 为:-1 (kafka.cluster.Partition )

消息确实被删除了:

[2019-04-30 12:39:24,199] INFO [Log partition=myTopic-0, dir=/var/lib/kafka] 由于保留时间 10800000 毫秒违规(kafka .log.Log)

[2019-04-30 12:39:24,201] INFO [Log partition=myTopic-0, dir=/var/lib/kafka] 在 2 毫秒内在偏移 12 处滚动新日志段。 (kafka.log.Log)

【问题讨论】:

  • 我觉得这 10800000 毫秒的保留时间来自哪里(3 小时)有点奇怪
  • @sense server.properties 最有可能

标签: apache-kafka


【解决方案1】:

/config/topics/myTopic 的无节点

Kafka 不再知道该主题存在并且应该对其进行压缩,这在日志清理器日志中似乎很明显

由于保留时间 10800000ms 违规

所以是的,Zookeeper 非常重要。但是优雅地关闭带有kafka-server-stop 的代理也是如此,否则强行终止进程或主机将导致分区段损坏


我不完全确定什么条件会导致这种情况

最后一个偏移量为 0,不大于基本偏移量 0

但是假设您有一个完整的集群并且该主题的复制因子高于 1,那么您可以希望至少有一个副本是健康的。

恢复索引/分区损坏的代理的方法是停止 kafka 进程,从磁盘中删除损坏的分区文件夹,在该机器上重新启动 kafka,然后让它从健康的实例复制回来

【讨论】:

  • 感谢您的回答。我想我明白问题到底出在哪里。当另一个应用程序重新创建有问题的主题时,会引发 KeeperException。此时 Kafka 将最早的偏移量设置为 12,之前写入的所有内容都可以在保留期开始时删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 2018-09-14
  • 2020-01-08
相关资源
最近更新 更多