[TOC] # 全局时间戳服务 全局时间戳服务(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,降低对于全局时间戳的请求压力。 * 事务提交版本号获取优化 多个事务可以合并获取全局时间戳,并且获取时间戳的请求可以提早发送,缩短事务提交时间。