请教一个backup实现的问题

请教一个TIDB backup实现的问题.

我看BR的代码,TIDB backup的步骤有一步我不太理解,就是当BR从PD取到对应的table的range key范围之后,为什么要发送给所有TIKV节点?我看TIKV的代码里面是接收到这个请求后先打snapshot,然后去扫snapshot再把对应range的数据单独写一个sst 文件发送给BR.

我的疑问在于假设TIKV是多副本,那么如果把range key发送给所有的TIKV,那么不就会把一些副本都返回回来了?还有一个问题就是一个table对应的range key 是会跨 region的吗?

谢谢.

  1. 不会把所有副本返回,默认是读取的 leader peer 的数据;
  2. 因为 table 数据存在跨 region 的情况,region 默认大小为 96MB,如果 table 数据很多,就会触发 split region ,多个 region 进行存储。

嗯嗯,感谢你的回复。

那就意味着一个table可能会生成多个sst备份文件吧?我看到sst文件的命名中是有携带region id.

是的,的确可能就有多个 sst 文件

谢谢.

不好意思,还有一个问题哈,我看到tidb backup的时候会先打snapshot,然后再对snapshot进行操作,那么是不是意味着本地磁盘起码要预留当前已经使用了的空间(比如现在某个节点已经使用了10g,那么由于要先打snapshot,那么本地磁盘起码需要10g空间).

不会这么多,要看副本数量,因为一个 store 下面 10g 可能是其他的 region peer 的副本也会占据空间。如果是 3 个 tikv ,每个 10 GB,是 3 副本的场景,那么单个要保留 4-5 GB 左右空间应该是足够的。具体你可以测试一下,跟对应的 leader 分布也有关系。

谢谢。

那按照你的意思是在TIDB里面每一个region都是一个rocksdb的DB实例?也就是一台物理节点会有多个rocksdb实例?因为我记得rocksdb的checkpoint是根据整个库来做的.

看了下上面的回复,之前的意思应该是按照默认3副本来回复的。 比如 3个 tikv 节点 3副本,region 数量和 leader 数量均衡的情况下,一个 tikv 占用了 10G,但是平均下来每个 tikv 中的 leader 只占用 3.3 G , 所以备份的时候都只备份 leader 的话,每个只需要预留 4G 多就可以了,但是 rocksdb 有压缩,所以可以多预留一些空间。

概念:

Region/Peer/Raft Group

每个 Region 负责维护集群的一段连续数据(默认配置下平均约 96 MiB),每份数据会在不同的 Store 存储多个副本(默认配置是 3 副本),每个副本称为 Peer。同一个 Region 的多个 Peer 通过 raft 协议进行数据同步,所以 Peer 也用来指代 raft 实例中的成员。TiKV 使用 multi-raft 模式来管理数据,即每个 Region 都对应一个独立运行的 raft 实例,我们也把这样的一个 raft 实例叫做一个 Raft Group。

其实我的问题就是如果TIKV每一个物理节点都只有一个rocksdb实例的话,由于backup的时候会在本地先打一个checkpoint(hard link),而这个checkpoint是会占用空间的,那么也就意味着每次backup之前每台TIKV节点的磁盘都必须至少要有和当前已经使用的空间相当的剩余空间。

如果我没有理解错,按照 @Superlzs0476 的说法就是那么checkpoint也是只有region对应的leader来做,因此如果一台物理的TIKV占用10g空间,如果只是leader打checkpoint,那么其实本地不需要10G的。

而我的第二个问题就是如果是只有leader来做checkpoint,那股就意味着一个region都会是一个rocksdb实例?因为rocksdb的checkpoint我记得是只能整个库一起做的。

一个 TiKV 包含两个 RocksDB 实例,一个用于存储 raft 日志,位于 data/raft,一个用于存储真正的数据,位于data/db。

这个是关于 TiKV 和 RocksDB 关系介绍。

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。