# TSO 任务：时间窗口

![`smart`](TSOTimeWindow_en_001_20220509.png)

------------------------------------------------------------------------------
首先需要解决的单点定时的问题是单点故障问题。

PD集群使用Raft共识算法，确保在主节点掉线后立即选出新的Leader，而时间服务也将在短时间内恢复。

然后，必须存储前一个 Leader 的当前 TSO，而且存储也必须高可靠，因此 TiDB 使用 etcd。TSO 生成的速率与磁盘的 I/O 能力有关，会出现瓶颈。TiDB 使用预分配时间窗口来解决性能问题。

图中所示，当前PD Leader的TSO为700（这是为了便于解释而虚构的值），PD已经向etcd请求了一个时间窗口。时间窗口的跨度可以由参数指定。系统的默认时间窗口配置为3秒。

示例使用默认配置，因此此窗口的起始点为TSO 700，时间窗口的结束点为TSO 703。在etcd写入成功后，PD将从700到703获得一个时间窗口。在此时间窗口内，PD可以使用系统的物理时间作为高位，连接其在内存中累积的逻辑时间，并为其客户端分配时间戳。

这种设计意味着，所有分配的PD时间戳（或物理时间）的最高点总是小于etcd存储的最大值。然后，如果PD Leader挂掉，新的Leader可以读取etcd存储的最大值，并根据该值申请新的时间窗口，以便新的Leader可以确保分配的TSO总是大于以前的Leader。此外，为了减少通信开销，每个客户端可以一次请求多个TSO，并且TSO的数量由客户端传递给PD作为参数。

然而，一旦TSO被缓存在客户端，多个客户端之间的时钟就不再严格递增。