在kafka中的复制分区下修复

时间:2018-07-24 05:37:10

标签: apache-kafka

在生产环境中,我们经常看到分区在使用主题消息时复制不足。我们正在使用Kafka 0.11。从文档中了解的是

配置参数replica.lag.max.messages已被删除。在确定哪些副本同步时,分区负责人将不再考虑滞后消息的数量。

配置参数replica.lag.time.max.ms现在不仅指自上次从副本获取请求以来经过的时间,而且还指自副本上次被捕获以来的时间。仍在从领导者那里获取消息但未赶上replica.lag.time.max.ms中最新消息的副本将被视为不同步。

我们如何解决此问题?副本不同步的不同原因是什么?在我们的方案中,我们所有的Kafka代理都位于刀片服务器的单个RACK中,并且都使用具有10GBPS以太网(Simplex)的同一网络。我看不到由于网络原因导致副本不同步的任何原因。

5 个答案:

答案 0 :(得分:1)

我在Kafka 2.0上遇到了同样的问题, 重新启动时,Kafka控制器节点上的所有内容都会被复制。

但是仍在寻找为什么很少有分区复制不足而同一主题上相同节点上的其他分区运行良好的原因,而这个问题我在随机分区上看到。

答案 1 :(得分:0)

我们遇到了同样的问题:

解决方案是:

  1. 重新启动Zookeeper负责人。
  2. 重新启动未复制某些分区的代理\代理。

没有数据丢失。

问题是由于ZK中的状态错误,因此ZK上存在一个未解决的问题,不记得该号码了。

答案 2 :(得分:0)

请勿同时为所有主题运行重新分配,请考虑一小部分运行它。

  1. 找到分区复制不足且无法完成重新分配过程的主题。
  2. 为此主题将unclean.leader.election.enable设置为true
  3. 查找因该主题而无法复制的分区。检查其领导者ID。
  4. 停止代理(仅服务,而不是实例)。
  5. 执行Preferred Replica Election(在yahoo / kafka-manager中或手动执行)。
  6. 重新启动代理。

重复其余具有相同问题的主题。

我也尝试过此建议,但对我没有帮助:https://stackoverflow.com/a/51063607/1929406

答案 3 :(得分:0)

我尝试了@kivagant在0.11.0上给出的选项,只是做了3,4,删除了被击中的分区日志,完成了6重新分配

答案 4 :(得分:-1)

浏览Zookeeper日志后,我们发现几乎没有 INFO WARN 日志,它们似乎没有提供任何重要信息来识别根本原因。但是,这些日志为我们提供了有关Kafka偏移管理中的 __ consumer_offsets 主题的一些指导。

日志:

2018-08-08 03:51:30,133 [myid:1] - WARN [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@368] - caught end of stream exception
EndOfStreamException: Unable to read additional data from client sessionid 0x264fb4ae7ff000d, likely client has closed socket
at org.apache.zookeeper.server.NIOServerCnxn.doIO(NIOServerCnxn.java:239)
at org.apache.zookeeper.server.NIOServerCnxnFactory.run(NIOServerCnxnFactory.java:203)
at java.lang.Thread.run(Thread.java:748)
2018-08-08 04:33:09,135 [myid:2] - INFO [ProcessThread(sid:2 cport:-1)::PrepRequestProcessor@648] - Got user-level KeeperException when processing sessionid:0x364fb4b59dd0014 type:setData cxid:0x17e zxid:0x50000c51f txntype:-1 reqpath:n/a Error Path:/brokers/topics/__consumer_offsets/partitions/46/state Error:KeeperErrorCode = BadVersion for /brokers/topics/__consumer_offsets/partitions/46/state

来自kafka常见问题解答 [https://cwiki.apache.org/confluence/display/KAFKA/FAQ#FAQ-HowtoreducechurnsinISR?WhendoesabrokerleavetheISR?][1]

ISR主要由两个参数控制:replica.lag.time.max.msreplica.lag.max.messages。我们遵循下面的星际大战。

  • 从zookeeper删除由Kafka创建的所有节点,然后重新启动Zookeeper集群。
  • 融合文档建议大多数用例使用1GB。我们可以增加堆大小。 (https://docs.confluent.io/current/zookeeper/deployment.html#jvm
  • 重新启动kafka代理并删除所有创建的主题,包括__consumer_offsets。
  • 重新创建所有主题。
  • 重新启动所有使用者。

参考文献:

[https://www.slideshare.net/jjkoshy/offset-management-in-kafka?from_action=save][1] [http://wanwenli.com/kafka/2016/11/04/Kafka-Group-Coordinator.html][1] [http://javierholguera.com/2018/06/13/kafka-defaults-that-you-should-re-consider-i/][1] [https://cwiki.apache.org/confluence/display/KAFKA/FAQ#FAQ-HowtoreducechurnsinISR?WhendoesabrokerleavetheISR?][1] [https://grokbase.com/t/kafka/users/143e19twfg/zookeeper-exception][1]