Tidb集群在极限情况下,如果PD的数据出现完全丢失的情况,启动新的空白PD集群,Tidb是否可以自行恢复?

【 TiDB 使用环境】
Tidb 5.1.0
【概述】:咨询类问题
各位大佬好,我近期一直有下面这个疑问,假如在下面这个极限情况下:
1.PD集群遇到严重故障,etcd 数据完全丢失,且短时间内无法找回
2.启动空白PD集群,让Tikv和PD集群重新产生联系

我的疑问是:
1.Tidb集群是否可以自行恢复?
2.如果可以,恢复的时间大概会有多长?
3.如果不可以,是否有必要做定期的PD中etcd的数据备份?

2赞

为啥会有这种假设?

如果有这种场景

  1. 启用更多的PD,来保证故障转移 (增加可靠性)

  2. 启用 raid磁盘阵列,要保证数据不丢,后续可以恢复 PD

假设 PD 完全损坏,数据完全丢失,不可能自动恢复

1赞

谢谢答复!
这种假设的原因是之前我们遇到过etcd因为运维不当操作导致etcd部分数据文件丢失,从导致etcd集群无法启动的问题。
因为Tidb的PD也是内部依赖etcd,所以我有如下几个疑问:
1.是不是单凭借tikv的数据无法进行集群数据完整恢复?
2.根据Tidb的文档,PD角色主要是做region均衡,副本管理,节点管理以及协助Tidb寻找分区所属Tikv节点的位置,而且其数据来源是Tikv节点的上报,看起来似乎是即使其数据丢失,但凭借Tikv的数据也能作出集群恢复。
3.如果PD是空数据,那么Tikv在通过心跳上报自身情况时,会不会进行回补Meta数据的操作?还是说进入了不可知的状态?
对于这块,我主要是需要了解到这种异常case下Tidb的具体处理方式。不知道能否告知?

1赞

pd server 出现异常的情况,且集群中所有的 pd 均不可启动,或数据全部丢失。那么可以使用 pd-recover 来恢复 pd cluster,使集群能够继续对外提供服务:

  1. tiup pd recover sop 文档:
  1. pd-recover 官方文档

https://docs.pingcap.com/zh/tidb-in-kubernetes/v1.1/pd-recover#使用-pd-recover-恢复-pd-集群

  1. 社区用户实践案例:
2赞

非常感谢!
浏览了一下文档恢复的SOP步骤,也大致看了一下pd-recover的源码的逻辑,就做了以下几个事情。

  1. 获取cluster id和allocId
  2. 启动空白集群pd server
  3. 向新的pd空白集群写入 cluster id,allocId,clusterMeta(根据cluster id组装)数据。
    看起来没有涉及到从旧的pd-server中读取数据,来还原除cluster id 和 allocid数据到集群的操作。
    那估计我应该是猜测是正确的,pd server可以从后续tikv的心跳中读取到tikv中相关region 等meta信息,来重新生成pd 内部丢失的那些region元数据。

我现在还有个疑惑是,我看到有些原理文章在讲SQL查询请求发生的时候,Tidb server会从pd server中捞取要查询的数据在哪个region中,以及在哪个tikv中。
如果是这样,那在上面的场景下,岂不是pd要完成和Tikv集群所有的心跳沟通,并补齐数据后,Tidb集群才能对外提供服务?还是说,Tidb server在执行SQL计划时,会和所有tikv节点进行沟通,并不经过和pd server的沟通?

如果 TiDB Server 有缓存 Key range 的地址信息,就会先去对应的 TiKV 节点获取数据,如果 backoff 超时,才会从 PD 申请新的地址信息。