tikv报错region 9555] entry at apply index 7563240 doesn't exist, may lose data.

【 TiDB 使用环境】生产环境
【 TiDB 版本】v5.3.0
【遇到的问题】tikv节点无法启动
【复现路径】意外断电
【问题现象及影响】
集群是单节点混布,因意外停电,重启时tikv节点启动失败,报错信息如下:

[2022/11/02 09:30:41.786 +08:00] [ERROR] [server.rs:1052] [“failed to init io snooper”] [err_code=KV:Unknown] [err=“"IO snooper is not started due to not compiling with BCC"”]
[2022/11/02 09:30:42.475 +08:00] [FATAL] [server.rs:843] [“failed to start node: Engine(Other("[components/raftstore/src/store/fsm/store.rs:1004]: \"[components/raftstore/src/store/peer_storage.rs:480]: [region 9555] entry at apply index 7563240 doesn’t exist, may lose data.\""))”]

参照其他同学案例处理

在使用命令operator add remove-peer清理pd中副本信息时,报错提示

Failed! [500] “cannot build operator for region with no leader”

检查region情况发现,处于投票阶段
image

参照官方文档可以使用–force强制设置为 tombstone 状态,但是执行报错,感觉force没起作用

求助,现在应该如何处理?

1 个赞

就一个tikv?然后tikv还起不来了?
如果sync-log没改成false,按理说不应该丢数据的啊,都在wal中啊。

是改成false了。现在想通过删除报错region,启动集群。可以接受数据损失。

1 个赞

删region万一这个region 是表结构,你丢数据可不是丢一点点啊。

region信息写在rocksdb的raftcf中,不知道有没有工具可以删掉,如果没有,可以写个例子删一下。

给你解释下启动流程,你看看有没有必要搞吧。

  1. tikv 启动的时候,会读取 rocksdb-kv 中的 raft cf 中的 region 信息,然后根据 region 信息构建内存对象(包括 raft 通讯之类的东西都通过这个构造),构造过程中会根据 apply_state(在 rocksdb-kv 中) 、raft_state(在rocksdb-raft 中) 判断是不是有没应用的数据,你的实例就是在这个过程中出错了。

  2. 如果没出错,启动了,leader 上报心跳给 pd ,pd 才能把所有的删 region 之类的动作发给 leader 去操作。

所以2种解决办法:

  1. 删掉 rocksdb-kv 中的 region 信息
  2. 根据 rocksdb-kv 种的 region 信息,重写 rocksdb-raft 中的数据,让整个 region 就好像没收到最后一条proposal 一样,这种改法最好,但是不知道 tikv 有没有现成工具。如果你的集群没那么重要,估计也没必要这样折腾了,如果很重要,可以用 c++ 写个工具,读取 tikv 的 rocksdb,修改里面 key 的数据实现 2 或者 1 的效果。 实现 2 的效果比较难, 实现 1 的效果,懂 c++ 的话,也就个把小时搞定。

我已经在采用这种方式处理了~

但是有些情况下,当不能方便地从 PD 上移除这个副本时,可以指定 tikv-ctl 的 --force 选项来强制设置它为 tombstone:

上面两种方式短时间我还搞不定 :sweat_smile:

找了几个报错的region,角色都是Voter,和这个有关么?

删除估计不行了,试试
unsafe-recover remove-fail-stores

能接受数据丢失,也要恢复集群状态,这种会靠谱点…

https://docs.pingcap.com/zh/tidb/v5.3/tikv-control#强制-region-从多副本失败状态恢复服务慎用

角色voter代表能投票成为leader,但是leader实际上得等tikv启动以后才能选举,选举后上报给pd,然后才能继续。你现在都起不来。

:sweat_smile:我这是单节点用不了这个命令~

哦哦,原来是这个意思。已经操作5个region,还是报相同的错误。那我再操作5个region,如果还不行,就准备重建集群了。

 ./target/debug/tikv-ctl ldb scan --db=./db/ --column_family=raft --key_hex
[2022/11/02 11:09:02.218 +08:00] [INFO] [mod.rs:118] ["encryption: none of key dictionary and file dictionary are found."]
[2022/11/02 11:09:02.218 +08:00] [INFO] [mod.rs:479] ["encryption is disabled."]
0x0102000000000000000203 :I I( D
//  raft                     regionid  applysurffix
0x0103000000000000000201 :5*
//  meta                  regionid raftsurffix

这是rocksdb-kv中存的region2 的数据后一行是region的meta信息。入口是这里,删掉就是删掉了region
其中regionid是大端写入的从bit【2-10】
image

./target/debug/tikv-ctl ldb scan --db=./raft/ --column_family=default --key_hex --value_hex
[2022/11/02 11:20:25.103 +08:00] [INFO] [mod.rs:118] ["encryption: none of key dictionary and file dictionary are found."]
[2022/11/02 11:20:25.103 +08:00] [INFO] [mod.rs:479] ["encryption is disabled."]
0x01020000000000000002010000000000000045 : 0x08011009184522261002181822200A0E08021204080510042A04083110011A0E0801120A08021206081810011801320101
0x01020000000000000002010000000000000046 : 0x1009184622140A0808021204080510041A080803220408441009
0x01020000000000000002010000000000000047 : 0x08011009184722201818221C0A0E08021204080510042A04083210011A0A08011206120408181001320101
0x01020000000000000002010000000000000048 : 0x080110091848222410011818221E0A0E08021204080510042A04083310011A0C080112080801120408181001320101
0x01020000000000000002010000000000000049 : 0x08011009184922261002181922200A0E08021204080510042A04083410011A0E0801120A08021206081910011801320101
0x0102000000000000000202 : 0x0A060809100518481049

rocksdb-raft 中的 default cf中的数据,最后一行就是 region 2 在raft中记录的状态

删掉 rocksdb-kv 中 0x0103000000000000000201 这个key就相当于 region 2 删了,其他的如果报错就清理下。

[tidb-develop-zgc tikv]# ./target/debug/tikv-ctl ldb delete 0x0103000000000000000201  --db=./db/ --column_family=raft --key_hex
[2022/11/02 11:25:00.464 +08:00] [INFO] [mod.rs:118] ["encryption: none of key dictionary and file dictionary are found."]
[2022/11/02 11:25:00.465 +08:00] [INFO] [mod.rs:479] ["encryption is disabled."]
OK

[tidb-develop-zgc tikv]# ./target/debug/tikv-ctl ldb scan --db=./db/ --column_family=raft --key_hex
[2022/11/02 11:25:08.888 +08:00] [INFO] [mod.rs:118] ["encryption: none of key dictionary and file dictionary are found."]
[2022/11/02 11:25:08.888 +08:00] [INFO] [mod.rs:479] ["encryption is disabled."]
0x0102000000000000000203 :I I( D

tikv起来以后,region count是0了。


pd那里还能看到region信息,那是因为另一个节点没启动,启动的话上报一下心跳,这个reigon的peer就消失了。

纯试验,出错不负责 :sweat_smile:

我现在操作的和这个差不多,但是已经将报错的10个region删除了,还在报错,查了一下有3w多个region,如果一个一个的试,不知道要到什么时候。如果报错一次全报出来就好了。

重建吧小伙子,我就是借此机会做个代码阅读笔记 :crazy_face:

单副本果然不靠谱啊~ :rofl:

单副本如果开sync-log也是没问题的。你的写入太频繁,这个还关了,还断电了。wal里没及时记录进去。
如果说你开着sync-log,机器断电也没事儿,因为所有的写入都先wal落盘了。

因为我这边是机械盘,开着sync-log,系统直接运行不了。 :sweat_smile:这是一个艰难的决定

趁机要求升级配置,感觉很香~~

额。。。不敢想,不敢想~