为什么tidb需要tso

tidb是否能根据raft apply的有序性,在每个副本内维护一个自增seq来保证mvcc?

存算分离原则,这样tidb计算压力会太大了,并且tidb也没有raft协议保证各节点间一致性

你好,我没太明白,tidb应该使用的是raft吧,为啥不能保证各节点一致?

https://docs.pingcap.com/zh/tidb/stable/tso/#tidb-中的-timestamp-oracle-tso
我的理解哈,
TSO由两部分组成,一个是时间戳,毫秒级别。一个是逻辑时间,是表示一毫秒内的时间。比如你一次执行两条SQL,物理时间一样,但是两个事件发生肯定有先后之分,逻辑时间就是用来区分其先后顺序

1 个赞

数据库要满足并发事务,必须有个按时间先后递增序列来确定事务开始和结束,这个和是不是分布式数据库无关,单机数据库也要有的,你可以看看oracle mysql等也有一个增长的序列

1 个赞

不太行,事务是有可能跨raft组的。如果只在每个raft组维护一个自增seq,那么跨raft组就没法协调。

你应该谈谈自己打算怎么保证个节点一致。
tso的做法比较简单直观,需要tso的时候每个leader自己去pd上取tso就好了。只要pd的tso是确定单向增长的,每个节点的取到的就是单向增长的。

为了区分事务先后顺序,必须分配一个各节点都认可的线性增长、不会重复的数。TiDB 就用了TSO这个概念。
TSO具体机制可参考如下两文章。

1 个赞

事务在现实生活中,可能真的并行执行。但是映射到数据库中,每一个操作、事务,都必须串行执行,分布式数据库,为了保持一致性,必须有一个全局一致性,tidb数据库中这就是通过TSO来保证

事物。

事务顺序吧

存储和计算分离吧

没有全局时间戳分布式事务不好搞

你好,你的描述中 “事务是有可能跨raft组的,如果只在每个raft组维护一个自增seq,那么跨raft组就没法协调”,这个可以举个例子吗?

例如2分片,3副本的情况下,
begin txn
先往分片1、2发送请求,分片1、2在各自内存里记录当前start seq。
再insert 2条数据,分别发往分片1、2 leader,leader各自seq++,follower也会按照raft apply顺序,各自seq++,2条数据都记录在buffer中。
冲突检测时,在主存储里查找buffer中key,获取其seq和start_seq比较,判断是否已经有同key新数据在冲突前已经写入了。

这些操作如果都从raft apply,可以视为串行执行吗?

我看cockroachdb好像用了混合逻辑时钟,但是没太深入具体是如何操作的

我觉得这个主要事务和mvcc方面实现的需求。跟raft关系不大,raft是为了实现分布式架构,数据多副本及一致性。

TSO是分布式事务实现的核心机制之一,用于生成全局唯一且单调递增的时间戳,确保事务的顺序性和一致性。没有TSO,PD什么都玩不转了

1 个赞

不同组件中间是有网络的啊,你怎么知道你的 txn-1 一定比 txn-2 先到 tikv 呢?

事务的顺序

有个问题,当节点down掉之后,如何知道down节点副本的时间戳。