内容提要
本文讨论了 TiDB 的时间戳分配机制,采用 PD 的 Timestamp Oracle 方案,通过全局单点授时确保时间戳线性递增,支持高效事务处理。文章详细介绍了 PD 的基本结构、校时、授时和递进更新过程,并探讨了跨 DC 性能损耗和 goroutine 调度等优化点,旨在提高事务效率和保证线性一致性。
延伸解读
TSO 的线性一致性保障机制
PD 的 TSO 通过物理时间和逻辑时间组合确保单调递增。物理时间严格递增,逻辑时间在每毫秒内提供最多 262144 个时间戳。校时阶段,新 leader 会比较 etcd 中存储的 last 与本地时间,若差值小于 1 毫秒,则强制使用 last 加 1 毫秒作为起点,避免时间回退破坏线性一致性。递进更新时,物理时间仅在系统时间大于当前 TSO 物理时间时更新,逻辑时间超过阈值一半时清零并增加物理时间 1 毫秒,从而保证 TSO 始终递增。
时间窗口与性能优化
为减少与 etcd 的频繁交互,PD 采用时间窗口机制:校时后,将 next 加上默认 3 秒的 saveInterval 保存到 etcd,之后在内存中直接分配 TSO,性能可达每秒百万级别。当存储的时间戳与当前时间接近 1 毫秒时,滑动窗口并写入新的时间戳。此外,客户端批量请求 TSO,PD 一次生成多个时间戳返回,减少网络往返。这些设计在保证线性一致性的同时,显著提升了 TSO 分配效率。
跨 DC 与 goroutine 调度的挑战
PD 采用中心式授时,跨 DC 场景下,客户端需跨区域从 PD leader 获取 TSO,导致延迟增加。若事务仅涉及本地 DC 数据,可优化为本地 TSO 以保证本地线性一致性,同时避免与全局 TSO 同步,但需确保后续跨 DC 事务不冲突。另外,PD 使用 Go 开发,goroutine 调度无优先级,高并发时 TSO 更新分配的 goroutine 可能延迟执行,影响获取速度。尽管尝试绕过 runtime 直接 syscall 效果不佳,这仍是持续优化的方向。
Q&A
TiDB 的时间戳分配机制是如何工作的?
TiDB 采用 PD 的 Timestamp Oracle 方案,通过全局单点授时确保时间戳线性递增,以支持高效的事务处理。
PD 的 TSO 更新过程有哪些关键步骤?
PD 的 TSO 更新过程包括校时、授时和递进更新,确保物理时间和逻辑时间的严格约束,以维护线性一致性。
在跨 DC 场景中,TiDB 如何优化事务性能?
TiDB 通过本地 TSO 优化事务性能,减少跨 DC 的延迟,确保在本地数据中心内的线性一致性。
PD 的设计目标是什么?
PD 的设计目标包括低延迟、高性能和良好的容错能力,以确保事务处理的高效性。
PD 如何减少与 etcd 的交互频率?
PD 通过时间窗口机制来减少与 etcd 的交互频率,从而提高 TSO 的分配效率。
未来可能的优化点有哪些?
未来可能的优化点包括改善跨 DC 性能损耗和 goroutine 调度问题,以提高整体事务效率。