热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【译】分布式系统中的时间同步:TiDB的时间戳

今天,分布式数据库引领市场,但分布式系统中的时间同步仍然是

原文链接:https://dzone.com/articles/tidbs-timestamp-oracle

作者:haitao gao


今天,分布式数据库引领市场,但分布式系统中的时间同步仍然是一个难以破解的难题。由于时钟偏差,分布式数据库不同节点的时间无法完美同步。许多计算机科学家提出了解决方案,例如 Leslie Lamport(2013 年图灵奖获得者)的逻辑时钟、混合逻辑时钟和 TrueTime。

PingCAP 的 TiDB 是一个开源的分布式 NewSQL 数据库,采用时间戳预言机(TSO)提供时间服务,并使用集中控制服务——Placement Driver(PD)——分配单调递增的时间戳。

在这篇文章中,我将介绍 TiDB 的 TSO,它如何提供时间服务,以及它的优缺点。

TiDB 的架构

在深入了解 TiDB 的时间服务之前,我们先回顾一下 TiDB 的架构。

TiDB 是一个开源的分布式数据库,具有水平扩展性、强一致性和高可用性。它由多个组件组成,包括 PD 集群、TiDB 集群、存储集群和 TiSpark。这些组件相互通信,形成一个完整的 TiDB 系统。

1.png

PD 是整个 TiDB 数据库的“大脑”,也是我们今天的重点。它有三个主要任务。它:



  • 实时存储和管理整个 TiDB 系统的元数据

  • 实时调度和平衡 TiKV 和 TiFlash 节点上的工作负载

  • 提供时间服务

TiDB 的 PD 集群和 TSO

PD 集群通常由多个 PD 实例(大多数情况下为三个实例)组成,这些实例中的 PD Leader 对外提供服务。 PD 集群中嵌入了 etcd 存储,以保证 PD 的可用性并提高其存储元数据的能力。

如果 PD Leader 崩溃,会自动选出新的 Leader,以保证时间服务的可用性。 etcd Leader 与 PD Leader 共享同一个 PD 实例,因此在 Leader 选举期间,etcd Leader 将优先于 PD Leader。选举过程如下:

2.png

TiDB 的 TSO 使用集中式混合逻辑时钟来提供时间服务。它使用 64 位来表示时间间隔。低 18 位代表逻辑时钟,其余 46 位代表物理时钟。由于其逻辑时钟为 18 位结构,每秒总共可以生成和分配 2^18 * 1,000 或 262,144,000 个时间戳。

接下来,我将介绍 PD 服务器中的 TSO 是如何发挥作用的。本节将描述 PD 如何校准、传递和快进时间。

校准时间

当新的 PD 领导者被选举出来时,它并不知道当前的系统时间。所以它的首要任务是校准时间。

首先, 新的 PD 领导者会读取时间并存储在前一个PD Leader中,存储的时间称为TLAST,是前一个PD Leader申请的物理时间的最大值。读取TLAST后,新的PD Leader知道前一个Leader分配的时间戳小于TLAST。

然后,新的 PD Leader 比较本地物理时间 TLAST 和 TNOW:



  • 如果 TNOW – TLAST <1 ms,则当前物理时间 TNEXT = TLAST + 1;

  • 否则,TNEXT = TNOW。

新的PD Leader完成这些步骤后,时间校准就完成了。

传递时间

完成时间校准后,新的 PD Leader 开始提供 TSO 服务。 为了保证当前领导者崩溃之后,下一个被选举的 PD 领导者可以成功的传递时间, 当前PD领导者应该存储 TLAST 每次在提供时间服务后都在 etcd 中。但是,如果PD领导每次都这样做,PD的表现就会受到很大影响。因此,为避免此类问题,PD Leader 预先申请了一个可分配的时间窗口 Tx。它的默认值为 3。

它首先将等于TNEXT + Tx 的TLAST 存储在etcd 中,然后将时间段[TNEXT, TNEXT + Tx) 内的所有时间戳分配到内存中。

预分配修复了 etcd store 频繁操作导致的 PD 性能损​​失问题。然而,缺陷在于如果 PD Leader 崩溃,许多预先分配的时间戳将被浪费。

当客户端请求 TSO 服务时,返回一个 64 位混合逻辑时间戳。它的物理时间值是校准后的 TLAST,它的逻辑时钟值会随着请求而自动递增。如果其逻辑时钟值超过其最大值(1 <<18),则休眠 50 ms 以等待物理时间快进。物理时间快进后,如果还有时间戳需要分配,PD Leader继续分配。

TSO 服务请求是跨网络的,为了降低网络带宽消耗,TiDB 的 PD 服务器支持批量请求 TSO 服务。

快进时间

在时间服务过程中,PD 只能通过逻辑时间的增量来分配时间戳。当增量值达到上限时,无法再分配时间戳,需要快进物理时间。

PD 每 50 毫秒检查一次当前物理时间,然后快进时间。根据公式 JetLag = TNOW – TLAST 如果 JetLag > 1 ms,则混合逻辑时钟中的物理时间比当前物理时间慢,需要快进以使 TNEXT = TNOW。

此外,当逻辑时钟在时间服务期间达到其阈值时,它会停止并等待。因此,为了防止这种情况发生,当当前逻辑时钟超过其阈值的一半时,混合逻辑时钟内部的物理时钟也会提前。完成此操作后,逻辑时钟的值将重置为 0。

当 TLAST – TNEXT <= 1 ms 时,表示之前申请的时间窗口已经用完,需要申请下一个时间窗口。因此,PD Leader 将 TLAST(等于 TNEXT + Tx)存储到 etcd 中,并在新的时间窗口内继续分配时间戳。

TSO 的优缺点

TiDB 采用了 TSO,一种集中式时钟解决方案,本质上也是一个混合逻辑时钟。由于中心化时钟提供单点时间服务,所有事件都是有序的。实现起来也很简单。它也有以下缺点;幸运的是,他们中的大多数都有相应的解决方案:

跨区域提供时间服务时性能损失。为了解决这个问题,可以将PD集群部署在同一个区域。

单点故障。为了解决这个问题,将 etcd 嵌入到 PD 集群中,并使用 Raft 共识算法使时间服务高可用和一致。

可能的性能瓶颈。由于 TSO 服务仅由 PD 负责人提供,因此从技术上讲,将来可能会出现性能瓶颈。幸运的是,PD Leader 每秒可以生成 2.6 亿个时间戳,并且经过多次优化。到目前为止,我还没有看到性能瓶颈。



推荐阅读
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Oracle :修改数据库服务器字符集 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
  • 玩转直播系列之消息模块演进(3)
    一、背景即时消息(IM)系统是直播系统重要的组成部分,一个稳定的,有容错的,灵活的,支持高并发的消息模块是影响直播系统用户体验的重要因素。IM长连接服务在直播系统有发挥着举足轻重的 ... [详细]
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
author-avatar
兴霖先玲广_215
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有