如何深入了解gts 时钟同步服务器的运行
您的问题提到了“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
模块。
更多信息请查看:
建议多录制点高质量的视频课程
感谢反馈,可以说下哪个模块的视频么
这个就是全局时戳而已,具体还得看官方的原理性文档