全局时间戳服务(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,降低对于全局时间戳的请求压力。

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

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