某个TiKV的副本出现损坏,可以手动通过其他TiKV节点的副本来恢复么?

2024-02-27 11:18:57 (UTC+08:00)TiKV 172.18..:20160[region_snapshot.rs:234] [“failed to get value of key in cf”] [error=“Engine(Status { code: IoError, sub_code: None, sev: NoError, state: "Corruption: block checksum mismatch: stored = 3987136279, computed = 3440300721, type = 1 in /home/tidb/tidb-data/tikv-20160/db/17957911.sst offset 14845750 size 33058" })”] [cf=default] [region=1294803335] [key=748000000000001BFF0B5F728000000015FF8A4FDA0000000000FAF9EDF818402FFFF1]
-----
今天突然业务查询报错,报错内容如上,通过pd-ctl的scheduler add evict-leader-scheduler <store-id>,将其上的Leader都驱逐掉,同时设置set global tidb_replica_read = 'leader';让业务只读Leader,暂时恢复了业务。
目前是新扩容了一个TiKV节点,来替代这个出现数据损坏的节点。但是想了解一下:

  1. 有什么办法可以恢复这个损坏的副本么?
  2. 除了对所有表都执行admin check table外,还有其他手段发现损坏的副本么?

这个方法实测也不太可行,admin check table貌似是只检查Leader region,我把故障TiKV上的Leader驱逐后,admin check table也成功了

增加一个新节点,把旧的节点下线拉倒了,别折腾…

现在就是这么搞的,生产环境不敢乱搞 :joy:
不过在想,有什么办法可以提前发现和即时修复么?

切换Leader后,手动触发一下region split,感觉应该可以修复,新的两个region应该都是从新Leader上产生的,不过没有验证。。

多副本,多节点就是为了避免这种问题,会影响到生产,是一种隔离机制,已经很完美了,

至于提前发现? 硬件坏了咋发现… 有点难度… :see_no_evil:

这里其实还有一个问题,TiDB发现Region损坏后,没有自动从其他副本修复数据,也没有自动将Leader切换到其他副本。
还是业务发现,反馈给我,我来手动驱逐TiKV上所有Leader才修复。

提个需求试试看,这相当于有自愈能力了…

你是原来开启了follower读,然后有个tikv节点异常了,导致影响了业务?然后紧急修改了只读leader?

是开了Follower-Read,不过出问题的副本是个Leader,当时admin check table都报错了。
是驱逐Leader后,admin check table已经不报错了,但是业务反馈查询还报错,才想起来之前开了Follower-Read,关掉后业务才恢复正常。

这个想法很有意思,提个需求,这样也可提升tidb的可维护性,加油

你这个是rocksdb报的错。如果非得要修复的话,看看这个sst里面的key是属于哪个region,然后把这个region从这个tikv上迁走。或许能恢复。

# ./tikv-ctl ldb dump --path=../db/17957911.sst --hex
拿着打印出的key 去pd中查一查。拿首尾2个key就可以了,看看是不是属于同一个reigon
#region keys xxxxxx 
如果都不属于同一个region,用region sibling 查邻居region,直到接上。
这样查出来一组region,就可以用remove-peer删掉试试了。

但是不建议这样折腾,如果非生成环境,自己测试着玩可以,如果是生成环境,还是重建比较稳妥。
另外,你们这个磁盘都不搞个raid吗?这么容易坏文件?

1 个赞

当年我也这么折腾修复sst文件的,修复过后还是会有问题,最后格式化磁盘重装了

1 个赞

你这个修复不错,tikv竟然能直接检查损坏的sst,这个以前没了解过 :+1: :+1: :+1:

一言难尽 :sob:,是阿里云在后台默默对local ssd盘的数据做了迁移,竟然内存和磁盘还不是一起迁移的 :neutral_face:

阿里玩的花,在线迁移,牛!
这不是出问题了,索赔 :grin:

image
最近一个月都在给阿里云打工了,D区不知道怎么了,一变更都是该区所有实例都被推送运维事件,取消还没办法取消,只能被逼着升级到所谓的「最新架构」

你这就属于数据给你弄损坏了,也就是因为你的是tikv,如果是别人的单副本数据,那就是真丢了。

扩容缩容就行吧。

把这个节点下线,然后新部署一个节点,数据会同步的啊