如何深入了解gts 时钟同步服务器的运行

如何深入了解gts 时钟同步服务器的运行

2 个赞

@论坛小助手

1 个赞

您的问题提到了“GTS 时钟同步服务器”,但实际上 GTS(Global Timestamp Service)并不是一个用于时钟同步的服务,而是 OceanBase 数据库中用于生成全局递增时间戳的服务,主要用于事务的版本控制和一致性保障。而时钟同步在 OceanBase 中是通过外部工具如 NTP 或 chrony 来实现的。

一、深入了解 GTS 的运行机制

  1. GTS 的作用
    GTS 是 OceanBase 中为事务分配全局递增时间戳的服务。每个事务提交时会从 GTS 获取一个时间戳作为事务的提交版本号,并持久化到日志流的 write-ahead log 中。同时,读取操作也会根据这个时间戳来判断数据可见性,从而实现多版本并发控制(MVCC)。

    • 文档依据:《OceanBase 数据库整体架构 → 事务层 → 隔离性》
  2. GTS 的高可用机制

    • 每个租户的 GTS 服务由该租户的日志流 1 号 Leader 提供。
    • GTS 默认是三副本的,其高可用能力与普通表一致。
    • 新 Leader 上任前会回放原 Leader 写下的预分配区间日志,确保时间戳不会回退。
    • 文档依据:《全局时间戳 → 服务高可用》《全局时间戳 → 时间戳正确性保证》
  3. GTS 的获取优化

    • 语句快照获取优化:事务提交时更新 Global Committed Version,某些查询可直接使用该值作为 Read Version,降低对 GTS 的请求压力。
    • 事务提交版本号获取优化:多个事务可以合并获取全局时间戳,缩短事务提交时间。
    • 文档依据:《全局时间戳 → GTS 获取优化》
  4. 查看 GTS 状态
    从 V4.2.0 版本开始,可以通过系统视图 V$OB_TIMESTAMP_SERVICE 查看租户的 GTS/STS 值、所在节点信息和时钟源类型:

    SELECT * FROM V$OB_TIMESTAMP_SERVICE;
    
    • 主库显示当前已分配的 GTS 值;
    • 备库显示当前可读位点(STS)值;
    • 系统租户下可查看所有租户的时钟;
    • 用户租户下只能查看本租户的时钟。
    • 文档依据:《V$OB_TIMESTAMP_SERVICE → 功能》
  5. GTS 参数配置
    在早期版本中,可通过参数 ob_timestamp_service 指定使用哪种时间戳服务(LTS/GTS),但在 V4.0.0 及之后版本中该参数已被删除,系统统一使用 GTS。

    • 文档依据:《ob_timestamp_service》

二、关于时钟同步(NTP)

虽然 GTS 不依赖于物理时钟,但 OceanBase 集群仍然要求各节点之间的时间保持同步(偏差不超过 2 秒),否则可能影响选举模块,导致没有主副本或脑裂等问题。因此需要配置 NTP 或 chrony 服务进行时间同步。

  • 推荐做法:
    • 所有 OBServer 节点和 OCP 节点都应配置 NTP 同步;
    • 使用 ntpq -pchronyc sources 检查 NTP 偏移量;
    • 如果发现时间差过大,需手动调整系统时间并重启相关服务。
    • 文档依据:《检查 NTP 偏移量》

总结

要深入了解 GTS 的运行,可以从以下几个方面入手:

  1. 学习 GTS 在事务提交和读取过程中的作用;
  2. 理解 GTS 的高可用机制及其副本同步方式;
  3. 利用 V$OB_TIMESTAMP_SERVICE 视图监控 GTS 状态;
  4. 了解 GTS 的性能优化策略;
  5. 确保集群节点之间的物理时间同步(NTP)以避免异常。

如果您希望进一步研究源码或调试 GTS 相关逻辑,建议参考 OceanBase 社区开源代码中的 gts 模块。

更多信息请查看:

  1. OceanBase 数据库整体架构
  2. 全局时间戳
  3. V$OB_TIMESTAMP_SERVICE
  4. 检查 NTP 偏移量
  5. ob_timestamp_service
  6. 恢复流程
2 个赞

建议多录制点高质量的视频课程

2 个赞

感谢反馈,可以说下哪个模块的视频么

2 个赞

这个就是全局时戳而已,具体还得看官方的原理性文档

1 个赞