kafka运维问题--删除topic导致的生产事件[Unknow

2018-07-30  本文已影响1085人  sheen口开河

现象

kafka版本:0.8.2

首先进入zk
zkCli.sh -server xxxx:22181
然后查看kafka的controller_epoch值
get /controller_epoch 

假设我们要修复的topic是testDelete3,有三个分区,每个分组两个副本,共有三个节点,则依次执行:
create /brokers/topics/testDelete3/partitions null
create /brokers/topics/testDelete3/partitions/0 null
create /brokers/topics/testDelete3/partitions/1 null
create /brokers/topics/testDelete3/partitions/2 null

create /brokers/topics/testDelete3/partitions/0/state {“controller_epoch”:1,”leader”:1,”version”:1,”leader_epoch”:2,”isr”:[1,2]}
create /brokers/topics/testDelete3/partitions/1/state {“controller_epoch”:1,”leader”:2,”version”:1,”leader_epoch”:2,”isr”:[2,3]}
create /brokers/topics/testDelete3/partitions/2/state {“controller_epoch”:1,”leader”:3,”version”:1,”leader_epoch”:2,”isr”:[3,1]}

注意,
1、这里的controller_epoch的值,是上一步get到的
2、leader值要与topic信息的replica信息相关,isr和replica信息一致,leader选第一个节点就好。
3、version默认为1就好。
4、leader_epoch值不能一样

后果

插一句,埋下的坑,一定会给自己狠狠的踩到

原因

惊险而又刺激的修复过程

百度到了类似的异常信息,供参考:https://blog.csdn.net/watermelonbig/article/details/78917730

[2017-12-27 18:26:09,267] ERROR [KafkaApi-2] Error when handling request Name: FetchRequest; Version: 2; CorrelationId: 44771537; ClientId: ReplicaFetcherThread-2-2; ReplicaId: 4; MaxWait: 500 ms; MinBytes: 1 bytes; RequestInfo: [test-topic02-rrt,12] -> PartitionFetchInfo(8085219,1048576),[test-topic01-ursr,22] -> PartitionFetchInfo(0,1048576),[test-topic02-rd,13] -> PartitionFetchInfo(787543,1048576),[test-topic02-st,12] -> PartitionFetchInfo(14804029,1048576),[test-topic04-ursr,7] -> PartitionFetchInfo(8,1048576),[test-topic04-rd,15] -> PartitionFetchInfo(2380092,1048576),[test-topic04-rrt,18] -> PartitionFetchInfo(27246143,1048576),[test-topic03-rrt,12] -> PartitionFetchInfo(12853720,1048576),[test-topic04-st,18] -> PartitionFetchInfo(25335299,1048576),[test-topic03-srt,11] -> PartitionFetchInfo(3750134,1048576),[test-topic05-ursd,17] -> PartitionFetchInfo(0,1048576),[test-topic05-srt,22] -> PartitionFetchInfo(33136074,1048576),[test-topic01-sd,1] -> PartitionFetchInfo(14361,1048576),[test-topic03-rd,21] -> PartitionFetchInfo(96366,1048576),[test-topic04-ursd,10] -> PartitionFetchInfo(0,1048576),[my-working-topic,15] -> PartitionFetchInfo(0,1048576),[test-topic02-ts_st,12] -> PartitionFetchInfo(0,1048576),[test-topic03-ursr,9] -> PartitionFetchInfo(1,1048576) (kafka.server.KafkaApis)
kafka.common.NotAssignedReplicaException: Leader 2 failed to record follower 4's position -1 since the replica is not recognized to be one of the assigned replicas  for partition [my-working-topic,15].

[2017-01-06 21:05:56,730] ERROR [ReplicaFetcherThread-0-1], Error for partition [topic3,0] to broker 1:org.apache.kafka.common.errors.UnknownTopicOrPartitionException: This server
 does not host this topic-partition. (kafka.server.ReplicaFetcherThread)
[2017-01-06 21:05:58,232] ERROR [ReplicaFetcherThread-0-1], Error for partition [topic3,0] to broker 1:org.apache.kafka.common.errors.UnknownTopicOrPartitionException: This server
 does not host this topic-partition. (kafka.server.ReplicaFetcherThread)
[2017-01-06 21:05:59,733] ERROR [ReplicaFetcherThread-0-1], Error for partition [topic3,0] to broker 1:org.apache.kafka.common.errors.UnknownTopicOrPartitionException: This server
 
 does not host this topic-partition. (kafka.server.ReplicaFetcherThread)

注:以上异常信息都是百度的,生产上遇到的和这个类似,只是具体集群和topic信息不一样。

WTF!!!

TMD彻底慌了,我觉得kafka集群快要挂了,于是准备请示下一步操作:重建kafka集群,即删除所有的数据和文件,重建topic。由于我们的业务是支持的,这些数据可以删,对其他应用的影响仅仅是短时的服务不可用,外部应用有开关,可以关闭对我们的服务依赖,所以可行(其实不可行也没办法,如果真挂了)。

同时也知道其实还是那个topic导致的原因,于是准备再试一试,删除那个topic,不恢复了。同时通知依赖这个topic的应用,关闭对它的依赖,并重启。具体的执行就是先执行kafka delete命令,然后删zk中的信息。

zkCli.sh -server XXXX:22181

rmr /brokers/topic/xxx
rmr /admin/delete_topic/xxx
rmr /config/topics/xxx

然后一个一个重启kafka节点——滚动重启,依次执行:

bin/kafka-sever-stop.sh 
jps
由于数据读写且数据较大,这个过程可能会持续很久,不停的jps,直到进程消失
然后
nohup bin/kafka-server-start.sh config/server.properties >/dev/null 2>&1 &
启动kafka 

观察日志,发现启动后,刚才提到的了两个异常就不报了。
依次执行其他的,节点。注意这里每次要等到当前重启的这个节点可以工作的时候,才重启下一个。

重启之后,还是在报之前找不到topic的那个异常,且速度很快。之后,我又电话联系了依赖这个topic的应用负责人,尝试重启那个应用。重启不是很成功,那个应用不断的core然后重启,于是赶快打电话让负责同事来支持。

没时间管了,我去沟通其他应用关闭开关的事情。大约二十几分钟之后,我回来,同事也到了,然后离奇的发现,集群好了。。。

检查磁盘空间,发现kafka清理机制已经恢复,磁盘大量释放~~~

其实已经不知道总结什么了,而且这种现象,很难复现。现在想想,根本原因还是那个topic导致的,之所以恢复,应该还是依赖以下几点:

  1. 有问题的topic被彻底清除了,且滚动重启了每个节点,因此这些节点也不再持有那个问题的topic信息,因此上面提到的那两种异常就没有了。
  2. 外部仍在使用这个topic的应用被及时关闭,这样就不会有相关的请求。虽然之前也没有读写请求,但也许还有一些心跳请求等。因此,报找不到topic的异常也没有了。
  3. 有问题的topic没有了,清理机制自然可以执行下去,于是自动清理了数据,释放了磁盘。

最后还想说几点教训:

  1. 不要执行非必要的操作。比如删除topic这种操作,一开始不执行,也没关系,没有数据写入之后,过几天存量数据会被kafka自动清理掉。
  2. 不要擅自更改topic在zk中的信息,以及手工删除topic,除非你准备重建整个topic
  3. 彻底掌握kafka的内部原理,和状态转换流程。如果可以,直接升级到高版本,以规避一些bug(比如遇到有问题的topic,自动清理机制就失效了,我认为这也是个bug)

好在有惊无险,记录下,警戒自己,也希望对有些人有帮助~

上一篇下一篇

猜你喜欢

热点阅读