多副本场景下,如何实现sum()

image

以上图为例,配置的副本数为2;该表/分区表有5个region

在sum(),是怎么做到 sum() = r1+r2+r3+r4+r5 的呢?

没看明白,想问啥?你说的sum是只啥?

sum(column_name) 对某列求和

应该是先对每个tikv先求和 然后再放到tidb_server 计算吧

算子下推各个节点计算 再到tidb汇总

那不是会数据重复吗?以region1来说,同时在node-A和node-B都计算过了

应该是同一时间只有leader 才会读写吧,

感觉不是。

  1. 如果走的是tiflash引擎,那region身份是learner,岂不是有问题了;

  2. 再者,回到tikv,写通过leader没问题,而读如果通过leader,那么数据的汇聚都在leader进行 or leader拥有该表的全量数据?

首先需要明确,这个leader是leader副本,不是leader节点。leader副本是拥有完整数据的。
leader副本是均衡分布到各个节点的。

1 个赞

所以,tidb会下推算子各个tikv节点,各个节点的region-X leader进行数据聚合后,再由tidb-server汇总,是这个意思吗?

另外,tiflash的region的身份只为learner,那是怎么做到的呢?

我理解的是和tikv一样,分主副本和从副本,主副本负责读写,从副本异步复制。

一致性

TiFlash 提供与 TiKV 一样的快照隔离支持,且保证读取数据最新(确保之前写入的数据能被读取)。这个一致性是通过对数据进行复制进度校验做到的。

每次收到读取请求,TiFlash 中的 Region 副本会向 Leader 副本发起进度校对(一个非常轻的 RPC 请求),只有当进度确保至少所包含读取请求时间戳所覆盖的数据之后才响应读取。

持怀疑态度。

这套复制机制也继承了 TiKV 体系的自动负载均衡和高可用:并不用依赖附加的复制管道,而是直接以多对多方式接收 TiKV 的数据传输;且只要 TiKV 中数据不丢失,就可以随时恢复 TiFlash 的副本

上面这段话,应该说明 tiflash 的region 都是从 tikv 同步过来的,这样的话,各个tiflash 的region其实没有身份差异

我这边一般TiFlash都设置的单副本,所以不太关注TiFlash多副本下的操作。