您的问题提到了“GTS 时钟同步服务器”,但实际上 GTS(Global Timestamp Service)并不是一个用于时钟同步的服务,而是 OceanBase 数据库中用于生成全局递增时间戳的服务,主要用于事务的版本控制和一致性保障。而时钟同步在 OceanBase 中是通过外部工具如 NTP 或 chrony 来实现的。
一、深入了解 GTS 的运行机制
GTS 的作用
GTS 是 OceanBase 中为事务分配全局递增时间戳的服务。每个事务提交时会从 GTS 获取一个时间戳作为事务的提交版本号,并持久化到日志流的 write-ahead log 中。同时,读取操作也会根据这个时间戳来判断数据可见性,从而实现多版本并发控制(MVCC)。
文档依据:《OceanBase 数据库整体架构 → 事务层 → 隔离性》
GTS 的高可用机制
每个租户的 GTS 服务由该租户的日志流 1 号 Leader 提供。
GTS 默认是三副本的,其高可用能力与普通表一致。
新 Leader 上任前会回放原 Leader 写下的预分配区间日志,确保时间戳不会回退。
文档依据:《全局时间戳 → 服务高可用》《全局时间戳 → 时间戳正确性保证》
GTS 的获取优化
语句快照获取优化:事务提交时更新 Global Committed Version,某些查询可直接使用该值作为 Read Version,降低对 GTS 的请求压力。
事务提交版本号获取优化:多个事务可以合并获取全局时间戳,缩短事务提交时间。
文档依据:《全局时间戳 → GTS 获取优化》
查看 GTS 状态
从 V4.2.0 版本开始,可以通过系统视图 V$OB_TIMESTAMP_SERVICE 查看租户的 GTS/STS 值、所在节点信息和时钟源类型:
SELECT * FROM V$OB_TIMESTAMP_SERVICE;
主库显示当前已分配的 GTS 值;
备库显示当前可读位点(STS)值;
系统租户下可查看所有租户的时钟;
用户租户下只能查看本租户的时钟。
文档依据:《V$OB_TIMESTAMP_SERVICE → 功能》
GTS 参数配置
在早期版本中,可通过参数 ob_timestamp_service 指定使用哪种时间戳服务(LTS/GTS),但在 V4.0.0 及之后版本中该参数已被删除,系统统一使用 GTS。
文档依据:《ob_timestamp_service》
二、关于时钟同步(NTP)
虽然 GTS 不依赖于物理时钟,但 OceanBase 集群仍然要求各节点之间的时间保持同步(偏差不超过 2 秒),否则可能影响选举模块,导致没有主副本或脑裂等问题。因此需要配置 NTP 或 chrony 服务进行时间同步。
推荐做法:
所有 OBServer 节点和 OCP 节点都应配置 NTP 同步;
使用 ntpq -p 或 chronyc sources 检查 NTP 偏移量;
如果发现时间差过大,需手动调整系统时间并重启相关服务。
文档依据:《检查 NTP 偏移量》
总结
要深入了解 GTS 的运行,可以从以下几个方面入手:
学习 GTS 在事务提交和读取过程中的作用;
理解 GTS 的高可用机制及其副本同步方式;
利用 V$OB_TIMESTAMP_SERVICE 视图监控 GTS 状态;
了解 GTS 的性能优化策略;
确保集群节点之间的物理时间同步(NTP)以避免异常。
如果您希望进一步研究源码或调试 GTS 相关逻辑,建议参考 OceanBase 社区开源代码中的 gts 模块。
更多信息请查看:
OceanBase 数据库整体架构
全局时间戳
V$OB_TIMESTAMP_SERVICE
检查 NTP 偏移量
ob_timestamp_service
恢复流程