PD 分配的TSO 和 tikv gc 时 依据的时间戳 时一回事么?

【 TiDB 使用环境】 测试
【 TiDB 版本】6.5.0
【遇到的问题:问题现象及影响】
大佬们请教一个问题哈,tiserver 写入数据到 tikv时从 pd 拿的时间戳,但是pd 返回的时未来3s 时间戳合计,当有多个tiserver 向pd请求时间戳时,这个时间戳只能保证递增,不能保证 和真正的时间 相对应, 比如 t1 t2 短时间分别 向pd 请求 tso时 t1得到的是 now()+3 这段时间的tso t2 得到的是 [now()+3 now+6] 之间的tso, t2 得到的tso 作为start-ts 写入tikv时 ,不能当 读取旧 快照数据的 依据吧?

PD 返回的 TSO 时间戳是递增的,但是并不是真正的时间戳,而是一个全局唯一的递增序列。这个序列是由 PD 生成和分配的,用于保证 TiDB 集群中所有事务的全局一致性。

在 TiDB 集群中,每个 TiKV 节点都会向 PD 请求 TSO 时间戳。当多个 TiKV 节点同时向 PD 请求 TSO 时间戳时,PD 会根据当前时间生成一个未来的时间戳范围,然后将这个时间戳范围分配给这些 TiKV 节点。这样做的目的是为了避免多个 TiKV 节点同时请求同一个 TSO 时间戳,从而导致性能瓶颈。

在写入数据到 TiKV 时,TiDB 会使用 PD 返回的 TSO 时间戳作为事务的开始时间戳(start-ts)。这个时间戳是全局唯一的,可以保证 TiDB 集群中所有事务的执行顺序和一致性。因此,即使多个 TiKV 节点同时向 PD 请求 TSO 时间戳,它们得到的时间戳范围也是不同的,不会出现相同的时间戳。

在读取旧快照数据时,TiDB 会使用快照的时间戳作为事务的开始时间戳。这个时间戳是在读取快照时生成的,与 PD 返回的 TSO 时间戳无关。因此,即使 PD 返回的 TSO 时间戳不是真正的时间戳,也不会影响 TiDB 对旧快照数据的读取。

时钟同步配置了吗

这点 我明白 就是 下面我说的这种场景 不太明白
比如 m1 时刻 比如 00:00 有 t1 t2 t3 三个tiserver
其中 t1 向 pd 请求tso, pd返回给它 一个 now+3=00:03的时间范围,
并记录了下次分配的起点00:03,
接着不到1s的时间比如 00:01,t2 也向pd发起了tso请求,
这时 pd 返回给t2的 tso就是 [ now+3(00:03),now+6(00:06) ] 这个范围的tso了吧 ,这时tiserver得到的 tso 就能当作 准确的时间来用了吧?如果,要求查询 t2时刻的旧快照数据的 是也用 这个tso时间做判断的么?

tso时间窗口: 每个tidb server 请求时分配3秒钟的tso,这3秒钟内其他tidb server请求的话tso也是延续分配吗? - :ringer_planet: TiDB 技术问题 - TiDB 的问答社区 (asktug.com) 这个帖子 说的比较明白

1 个赞

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