全局时间戳服务 
============================



全局时间戳服务（Global Timestamp Service，简称 GTS），OceanBase 数据库内部每个租户启动一个全局时间戳服务，事务提交时通过本租户的时间戳服务获取事务版本号，保证全局的事务顺序。

服务高可用 
--------------

GTS 是集群的核心，需要保证高可用。

* 对于用户租户而言，OceanBase 数据库使用租户级别内部表 __all_tenant 的 leader 作为 GTS 服务提供者，时间来源于该 leader 的本地时钟。GTS 默认是三副本的，其高可用能力跟普通表的能力一样。

  

* 对于系统租户，使用 __all_core_table 的 leader 作为 GTS 服务的提供者，高可用能力与普通表一样。时间戳正确性保证。

  




GTS 维护了全局递增的时间戳服务，异常场景下依然能够保证正确性：

* **有主改选** 

  原 Leader 主动发起改选的场景，我们称为有主改选。新 leader 上任之前先获取旧 leader 的最大已经授权的时间戳作为新 leader 时间戳授权的基准值。因此该场景下，GTS 提供的时间戳不会回退。
  




<!-- -->

* **无主选举** 

  原 leader 与多数派成员发生网络隔离，等 lease 过期之后，原 follower 会重新选主，这一个过程，我们称为无主选举。选举服务保证了无主选举场景下，新旧 Leader 的 lease 是不重叠的，因此能够保证本地时钟一定大于旧主提供的最大时间戳。因此新 leader 能够保证 GTS 提供的时间戳不回退。
  




GTS 获取优化 
-----------------

* 语句快照获取优化

  事务提交的时候都会更新其所在机器的 Global Committed Version，当一条语句可以明确其查询所在机器时，如果是一台机器，则直接使用该机器的 Global Committed Version 作为 Read Version，降低对于全局时间戳的请求压力。
  




<!-- -->

* 事务提交版本号获取优化

  多个事务可以合并获取全局时间戳，并且获取时间戳的请求可以提早发送，缩短事务提交时间。
  



