BR恢复时为什么同一个文件会被多个tikv节点读取?是因为多副本的原因吗?

如下图中的文件94_103_6ff34803059b51f62fa4bddae19647c8e0db22c9db17931ba4cc39e4f5f188d1_1718349131300_default.sst,在21.3、21.4两个节点上均有读取请求:

看你配置,备份数据是放在一个共享文件夹里的话,有多个副本肯定会被 多个节点读取

1 个赞

因为你一个文件里的数据会在多个region,多个region可能在每个节点都存在

不是共享存储的问题吧,这样备份会分散到各个服务器上,恢复的时候最好放到一起,

恢复的时候自动打散

数据肯定是放一起的额,不然br找不到想要的文件就会报错退出了,这里是成功恢复了的。

自动打散是什么意思呢?

一个文件里的同一块数据都有可能在多个region么?你看日志里边,两个节点都有从该文件的偏移为0的位置读取131072的数据。


按照官方文档的描述,不同的region里边应该是不同的数据呀。

可不可以把你的意思理解成节点2上有节点1中region1的副本,所以文件中的同一块数据在恢复时会同时往region1以及region1的副本中写数据,类似下图这种:

1 个赞

单个SST包含多个region,里面的多个region在自动打散到不同的store。

那这里的两个节点都有读取到同一块数据(从该文件的偏移为0的位置读取131072):


可不可以理解为单个sst内的同一个region打散到了不同的store上呢?

region是最小的单元了。sst里面包含多个region。可以将sst里面的region1/4/7放到store1,2/5/8放到store2,3/6/9放到store3.

照这么说的话,这个现象不合理呢,这里不同的节点读取同一个文件内的同一块数据应该怎么理解呢?

我理解读取是为了找适合本节点的数据

多个region

这里是因为现在恢复的实现中,一个 region 的三个副本都会直接读取这份文件,而不是像一般的 Raft 命令那样发给 leader,而后再由 leader 同步给副本。

具体来讲,BR 在恢复的时候流程大概是这样:

  1. 向同一个 Region 内的所有副本(Peer)发起请求,他们将 SST 下载到一个临时文件里面(这里就会读取同一个文件)。
  2. 然后,BR 会向 Leader 发起一个 Ingest 的 Raft Command,在这个 command 被 apply 的时候,第一步下载的 SST 会被并入底层的 LSM 树中,此时数据真正恢复到了 Region 中。
1 个赞

感谢大佬解惑!!!学习了!!!