共计 10717 个字符,预计需要花费 27 分钟才能阅读完成。
背景
BIGO 的服务器散布在寰球各地,各种服务如分布式追踪等都对寰球机器存在时钟对齐的需要。而主观上,受限于服务器自身的工夫源设施精度以及内核时钟零碎的软件设计实现等多种简单因素制约,常见的服务器秒级别的设施时钟误差大概在万分之二左右,而累积误差会呈现正反向弥补,依据教训观测值,一年存在至多分钟级别的时钟误差。
此类问题最常见的解决伎俩就是接入网络授时服务如 NTP,然而作为一个寰球散布几万 + 服务器的公司,简略接入 NTP 服务,并不能彻底解决寰球时钟对齐的问题。
BIGO 的服务器很晚期就接入了 time.nist.gov 的 NTP 网络工夫同步服务,然而观测到公司外部的机器普遍存在百毫秒级别的时钟误差,单机视图存在工夫跳变等问题,而且误差散布简直是随机的,同机房外部都可能呈现极大误差。
基于以上现状,联合 BIGO 的业务需要,咱们的寰球时钟 true time 服务开启调研和建设。在业界相干畛域,google 的 spanner 论文有提到 true time 服务的建设,facebook 也有公开过 chrony 时钟对齐服务解决方案。前者外围是依赖寰球多机房部署原子钟 +GPS 构建了一个双层的架构,配合 Marzullo 变种算法来提供 7ms 工夫区间服务。而后者实质上也是基于原子钟 +GPS 构建了一个最高能够达到 16 层的架构来提供 true time 服务。
业界的现有技术计划,一方面存在硬件设施依赖,另一方面间接作为开箱即用的工夫源在 BIGO 理论场景会制约咱们的服务部署状况。于是咱们基于内部 NTP 网络工夫源 + 外部 UTC 工夫源集群 + 多 PTP 集群的计划来构建了 BIGO 本人的寰球 true time 时钟对齐服务,指标是在不依赖外部原子钟的前提下,把 BIGO 寰球机器 99.99% 场景时钟误差管制在亚毫秒。
该根底能力的建设,能够利用于 BIGO 外部不少场景:
1) 解决分布式追踪场景的时间误差问题;
2) 能够赋能 BIGO 的音视频优化直播帧工夫戳跳变引起的卡顿问题,以及音视频和文件传输在重传准确率,拥塞管制等方向的晋升;
3) 解决工夫跳变问题,晋升 BIGO 根底框架等服务的稳定性,防止跳变引起的服务卡顿和挂死。
NTP
在理解时钟对齐相干原理时,NTP 协定(Network Time Protocal)和相应的 ntpd 和 ntpdate 服务是必须要理解的。这里咱们简略回顾一下相干原理。
NTP 协定的提出是为了解决这样一个问题:已知有一个基准服务器 A,A 的工夫是精确的,怎么通过网络让 B 本地时钟跟 A 对齐?
聪慧的读者可能曾经很快想到答案,B 发包询问 A,A 把本地工夫回给 B 就搞定了。然而问题没有这么简略,B->A 的网络包延时 d1,A->B 的网络包延时 d2,甚至 A 收到申请再回包过程的耗时 d3 都会导致 B 拿到的工夫存在误差。
针对此问题 David L. Mills 提出了 NTP 协定,最早呈现在 rfc958。
图 1 是单次 NTP 授时过程,首先 B 向 A 发送一个 NTP 包,包里蕴含了来到 B 的本地工夫戳 T1。A 收到 NTP 申请包之后,顺次记录包达到的本地工夫戳 T2,回包来到的工夫戳 T3,而后立刻把包返回给 B。B 收到回包后,记录本地工夫戳 T4。
其中咱们把 d1=T2-T1 定义为上行延时,d2=T4-T3 定义为上行延时。假如 A - B 的时钟绝对误差为 diff,则有如下公式:
d=d1+d2
T2=T1+diff+d1
T4=T3-diff+d2
如上推算,A- B 的时钟误差公式求解如下:
假如网络的上下行延时对等无稳定,即 d1=d2,则 A - B 的时钟误差近似值 diff_appro 跟 diff 相等,diff_appro 的表白公式如下:
在单次的 ntp 对齐过程中,工程上往往基于 diff_appro 公式去计算 A - B 的时钟差,此时并未剔除上下行网络稳定的影响,咱们把 diff 称为 A,B 机对齐前时钟误差(简称前误差),把 diff_appro-diff 称为 A,B 机对齐后的时钟误差(简称后误差)。
后误差的公式表白为 diff_appro-diff=(d1-d2)/2,当 d1 或者 d2 等于 d 时,后误差最大为±d/2。
NTP 算法简略来说,就是基于 diff_appro 公式计算 diff 值,并对 B 机的时钟做出加 diff_appro 的调整,从而让 B 机的时钟向 A 机尽量对齐。对齐过程还会存在后误差(diff_appro-diff),后误差最大能够到±d/2。
看到这里,可能聪慧的读者要收回灵魂拷问了,A 间接回工夫给 B,B 齐全不思考任何误差间接应用 A 返回的工夫设置为本机工夫,这个过程存在的误差也就是 d2 而已,最大误差能够换算为 d。这 NTP 绕了这么一圈,仅仅是把后误差放大到到 d / 2 而已,反正是不准,优化一半的精度仿佛没什么价值。
其实实质不是这样的,仅仅关注最大误差的确只优化了一半的精度。然而间接应用 A 返回的工夫,A 和 B 的时钟误差是恒等于 d2 的,而 NTP 的时钟误差实质上是跟上行延时和上行延时的差值成正比,网络延时是永恒存在的,而上下行延时差值(简述为网络稳定)却不肯定是永恒存在的,只有配合一些屡次采样平滑调整,是能够基于 NTP 把时钟对齐的精度管制在比拟现实的范畴的。
ntpd 和 ntpdate 就是 2 种基于 ntp 协定封装的时钟对齐服务形式,前者利用了多时钟源以及一些平滑算法来躲避对齐过程中的时钟跳变问题。而后者仅仅是对 ntp 协定过程的定期利用,容易存在误差和跳变。
架构衡量与设计
后面提到 BIGO 一开始寰球机器都基于 ntpdate 接入了 time.nist.gov,然而成果不言而喻是不好的,普遍存在百毫秒误差,时钟跳变,误差忽视机房,每个问题都很致命。
那么简略换成 ntpd 会不会变好,咱们的实际表明 ntpd 本机房同步误差能够管制在毫秒级别,然而跨大区同步存在 10 毫秒级别的误差,尽管比照 ntpdate 会有改善,然而这个成果还不够满足业务需要。或者咱们的服务器能够物理间隔跟 ntp 源放弃凑近部署,但这不是一个好扩大的服务架构,也不合乎咱们寰球多机房的运维现状。
咱们后续还尝试引入 facebook 的 chrony(facebook 提供的一种 NTP 工夫源)作为工夫源,其比照 ntpd 有更优良的同步算法,然而咱们验证跨大区同步的误差仍然在 6 毫秒级别,次要起因在于公网跨大区上下行 delay 差别导致。此外 chrony 对第三方使用者的调优老本较高,其提供了如 mindelay 等十几种同步模式,不足最佳实际指引。
简略总结一些衡量,如果要开箱即用一些 ntp 源服务,则 BIGO 的服务器部署会受到限制,如部署地点,同步频率等。因而咱们在这一期放弃了全网间接应用相干 ntp 服务,而是开始在 BIGO 外部分层构建 true time 服务。
架构上,咱们要在没有外部原子钟设施的前提下,解决 2 个问题。
1. BIGO 的机器工夫要和 UTC 工夫放弃较高精度的同步;
2. BIGO 各个外部机器之间的工夫要尽量放弃较高精度同步,且 ping 延时越小的机器之间精度要求越高。
问题 1 即工夫源的问题,google spanner 里的 true time 的解决形式是依赖硬件设施,引入原子钟 +GPS 组成散布寰球的 master 群,利用原子钟和 GPS 故障概率和故障起因存在差别这个个性做双保险保障 master 可用性。同时 master 和 daemon(即 slave) 都会通过一些算法辨认显著异样的时钟,从而在外部建设了一套寰球高可用的高精度工夫源。
而 BIGO 在面对这个问题时,尚没有大规模的原子钟设施,为了低成本的解决工夫源问题,最终咱们抉择了建设一个单机房的工夫源,咱们称为 super master。super master 为了保障可用性,应该是集群。Super master 的工夫并不是来自本身的时钟,而是基于 ntpd 跟一个物理间隔上最靠近的 NTP 源做时钟对齐。
至此,咱们在没有原子钟的状况下,失去了一个可用性比照 google spanner 里的 true time 稍差一点的工夫源。
问题 2,咱们心愿按机房分层建设架构。最终确定在每个机房建设一些 master 节点,本机房的其余节点(咱们称为 slave)只会跟这些 master 做时钟同步,基于 PTP 协定来进行。看到这里可能读者会纳闷,PTP 是个什么协定,这里不急,前面会有篇幅对该协定做一个回顾,你能够先简略了解 PTP 是在 NTP 上做的一种工程优化,其比拟适宜子网内的高精度时钟同步(在毫秒内精度进一步晋升),反对播送,单播等工作模式。
最终,咱们失去 BIGO true time 服务一期架构图如下:
架构里的相干名词解释如下:
NTP 源——基于 ntpd 或者 ntpdate 模式提供时钟对齐服务的规范机构(例如 time.nist.gov 是由美国国家标准技术研究所提供),NTP 源的工夫同步报文里蕴含的工夫是 UTC 工夫(等效于 GMT 格林威治工夫)。
Super Master——角色定位为 BIGO 外部的牢靠 UTC 工夫源,后面说了,super master 是没有原子钟的,基于 ntpd 跟物理最近的 NTP 源做 UTC 时钟同步。Super master 一期临时是单机房的,前面为了更高的可用性,会布局多机房的分布式 UTC 源架构。
Name Service——BIGO 外部的分布式名字服务,具体架构不细讲了,能够对标 Etcd 等架构,这里该模块次要用于给 master 发现 super master 做 ptp 单播时钟同步用。
Master——某个机房内的时钟源,仅仅服务本机房的节点。一个机房内能够有多个 master 存在。Master 会定期基于 PTP 单播配合咱们的平滑算法去 super master 做时钟同步,同时,也会秒级对子网内做 ptp 的 sync 播送达成 master 和 slave 的时钟同步。
对于 master 的选举决策,这里波及到 PTP 里的 BMC 算法,原则上一个机房不须要惟一的 master,该算法不同于其余分布式强统一算法如 paxos,不须要达成全局惟一共识。对于 BMC 选举 master 机制咱们前面会开展解说。
Slave——机房里的一般服务器,会周期秒级收到同机房 master 的 PTP sync 同步播送,达成时钟同步,以后因为只会在同机房做时钟同步,该过程暂未做平滑解决。
机房内 Master 选举
提起 Master 选举,可能很多读者会想到 Raft,Paxos 等相干技术计划。而在咱们这个具体的问题畛域,对于在一堆机器里选出适合的主机作为 master 来成为时钟源,比拟经典的是 IEEE1588 里的 BMC(Best Master Clock)算法。
该算法比拟适宜子网外部 Master 选举的特点,只负责选出确定的 Master 群,并动静保障 slave 肯定能够较快找到可用的 Master,然而不思考 slave 应用的 master 是否是最优解,BIGO 外部为该算法设计了保底策略,用于躲避极其状况长期应用较差的 master。
BMC 算法自身为每台机器设置了几个属性:
1)机器优先级:依据机器属性赋予机器的一个优先级,值越小优先级越高;
2)分组优先级:对机器进行分组,每个组有一个优先级值越小优先级越高;
3)惟一标识:过程的惟一标识,个别应用 MAC 地址。
BIGO 这边因为子网人造是同机房的,所以 1 和 2 默认都是不配置的,基于保底策略来动静解决机器网络情况稳定问题。
原始的 BMC 算法选主流程如下:
1)过程接管子网内的 master 的播送信息,并退出本身的 foreignMaster 列表;
2)过程依据 foreignMaster 列表信息(可能为空)和本过程信息通过 BMC 算法按机器属性抉择出最优的 master;
3)如果过程成为 master 的话,则开始播送信息。
图 3 是选主过程的状态迁徙图,子网内任何一台机器都会周期的 check 本身的 foreignMaster 列表,选出以后的本人的 master(能够是本人),而后相应把本身角色设置为 master(slave)。
该算法集群多机状态收敛过程还是比拟清晰简略的。
1) 初始的时候,不思考引入任何随机让步算法,子网内所有机器都没有收到任何 master 的 announce 申请,则会将本人晋升为 master,并开始播送本人的信息。此时,子网内全副机器都是 master;
2) 子网内的机器开始陆续收到子网内 master 的信息,在这过程中,一直执行 bmc 算法,进而将更优的过程设置为 master,最初个别在几个播送周期内,整个集群的 master,slvae 状态达到稳固。
上面的图 4 简要的展现了 BMC 算法从初始化到收敛过程:
总结来看,BMC 算法长处就是疾速,简洁,而因为选主条件是动态的(如 MAC 地址大小),无奈保障选出的 master 是网络状况最优的,这种算法在子网内比拟适合。
为了保障该算法在网络变动后能够剔除掉显著异样的 Master 点,BIGO 尝试引入网络稳定保底策略。即在放弃 BMC 算法主流程状况下,引入 master->slave 的网络稳定状况来优化 master 抉择策略。
为什么基于网络稳定来做选主决策,而不思考网络延时大小,依据咱们后面形容的 NTP 原理,读者应该分明,时钟同步的误差受上下行网络差值影响较大,而延时的相对大小是没有影响的。
BIGO 这边会基于 PTP 的 delay 过程(前面一节 PTP 协定会具体解说),在本机保护 slave 跟他 foreignMaster 列表的机器的历史 delay 值汇合——foreignMaster’s delay_list。而后基于规范方差公式计算每台 master 的 delay 方差 S(对于方差的概念,本文不再赘述)。咱们认为方差 S 能够较好的表白 foreignMaster 的网络稳定。
在原 BMC 选主过程,BIGO 会额定判断指标 master 的方差 S 是否超出了阈值,如果是则会把该 Master 机器从 slave 的 foreignMaster 列表里临时踢掉,当 S 复原小于阈值后,会再加回 foreignMaster 列表,全过程对 BMC 选主机制没有任何收敛性相干的毁坏。
最初说一下,为什么 BIGO 不尝试扭转 BMC 选主程序条件,比方依照 master 的 S 大小来优先选主。次要基于 2 点思考:
1. 子网内机器间的网络情况个别都是平等,咱们没有强烈的需要须要选出最优的 master, 咱们须要做的是躲避毛刺和异样节点;
2. 扭转 BMC 选主程序,引入动静变量 S 来调整 Master 优先级,意味着每台 slave 机的 Master 优先级视图能够不一样,BMC 简洁的 Master 收敛过程被毁坏,咱们须要很小心的去 review 整个算法的全过程,避免出现极其的 Bug,而如 1 所述,这项工作的收益并不大。
PTP
单机房外部,master 和 slave 之间通过 PTP 协定来实现时钟同步。这里简略回顾一下 PTP 协定,以及 BIGO 外部应用状况。
首先,NTP 的原理读者应该曾经分明了,那么咱们能够认为 PTP 是尝试对 NTP 做工程落地的一种优化实现形式。PTP 全称为 Precision Timing Protocol,也是在 IEEE1588 里提出的。PTP 次要解决了 2 个工程上的问题:
1. 解决 NTP 外面精准获取 d1,d2 的问题;
2. 怎么高效的在一个子网内对多个 slave 同步时钟的问题。
先讲下问题 1,精准获取 d1,d2 是什么意思呢?
首先,PTP 是基于 UDP 协定来通信的,咱们把 d1,d2 定义为网络延时,然而在工程实现上,如果 B 给 A 发包,A 给 B 回包,A 发回包前获取本机工夫 T3‘的话,那么 T3’=T3-UC。其中 T3 是网络包从内核收回去的工夫,UC 是 A 获取本机工夫到回包从内核收回去的时间差,为什么会有 UC 存在,因为 linux 并不是一个实时操作系统。UC 的耗时组成会很简单,cpu 调度的忙碌水平,缓冲到发送的耗时都会影响 UC,且会动态变化。而真正的延时 d2=T4-T3,如果仅仅把 T3’打到包里回给 B, 那么 B 在计算 d2 的时候就会存在误差。
对于问题 2,PTP 这边利用播送机制来被动对多个 slave 进行时钟同步,工程上具备容易配置,疾速收敛(参考后面的机房内 master 选举算法过程),以及网络带宽和资源占用少等长处
PTP 具体同步过程分为 delay 机制和 sync 机制:
图 5 为 PTP 时钟 delay 机制的同步过程,该过程重点解决一个问题:工程上精准算 A 到 B 的网络时延 delay 值。
为什么要算这个值呢?基于 PTP 子网同步的场景特点,PTP 假如短时间内,一个子网的网络稳定较小,即 D1=D2, 且 D1 值短时间内不会变动。基于这个假如,PTP 前面能够以较低开销实现 sync 机制的工夫同步。
简略来说,PTP 在一个子网内,slave 会长周期的进行 delay 播送机制,该过程开销偏大。而 master 侧会短周期的进行 sync 机制,来达成对子网内全副 slave 的时钟同步,该过程开销绝对小。
回到 delay 机制过程自身,是怎么做到精准测算 A 到 B 的 delay 值呢。图中 T1’,T2’,T3’,T4’都是 PTP 程序用户态能够拿到的工夫,这些工夫都含有误差。要精准测算 delay,B 就须要获取 T1,T2,T3,T4,即 req 和 resp 从网卡收回,以及达到收包方内核协定栈的工夫。
先说 T2 和 T4 值,这 2 个值在 udp 包达到内核协定栈之后会记录下来,用户态能够拿到该工夫。从 B 的视角,T4 自身就能够拿到,T2 能够让 A 的程序在回包的包体里带上。
再来说 T3,这个值的获取原理,是 ptp delay 机制须要播送发动的次要起因。PDelayResp 包回包是播送到子网,因为是播送包,A 本人也能够收到 PDelayResp,基于回环播送个性此时 A 收到的 PDelayResp 包的达到工夫就是该包的网卡收回工夫,即 T3。此时 A 只须要再发一个 PDelayRespFollowUp 包,包体里带上 T3 工夫,则 B 就能够正确获取 T3 工夫了。
最初说 T1,只有明确 T3 的获取原理,则相似 T3,B 自身获取 T1 也是基于 PDelayReq 包的回环达到工夫断定。
至此,基于公式 delay = (T2-T1+T4-T3)/ 2 即可在工程上实现精准测算 A 到 B 的网络时延 delay 值。
图 6 为 PTP 时钟同步的 sync 过程,该过程运行时,B 曾经胜利获取到 A 到 B 的网络时延 dealy。此时 A 作为 master 被动播送 sync 申请帮忙 B 精准测算出 A,B 本地时钟差值 offset。
本次过程仍然 A,B 只能拿到 T1’,T2’,然而基于后面 delay 过程的形容,读者应该能够比拟间接的晓得如何获取到 T1 和 T2。过程不再赘述,B 能够间接拿到 T2,而 followup 包会把 T1 带给 B。
于是咱们晓得 T1+offset+dealy=T2,故 A,B 机器时钟误差满足 offset=T2-T1-delay。B 失去 offset 之后,批改本地时钟即实现了一次 PTP 的子网时钟对齐的过程。
最初提一下,PTP 自身的工程源码也存在一些乱序和时钟同步谬误的 bug,BIGO 外部基于一个版本做了一些革新优化。
跨机房同步
Master 机器周期跨机房与 super master 做时钟同步,是本架构里次要误差起源。BIGO 外部跨机房,跨大洲以走公网为主,网络延时大,网络稳定比拟显著。即便外部建设很好的光纤内网,双向链路的延时对称性也不肯定能够保障,在理论运行中受很多因素影响。
在这一层实现上,BIGO 基于 ptp 单播协定(这个不细讲了,就是 ntp 协定的工程实现)来做同步,然而该协定不言而喻在网络稳定下存在误差和跳变。
针对这个问题,BIGO 参考了 Ntpd 的平滑实现并退出自研的异样稳定剔除算法,来优化 ptp 单播跨机房同步过程存在的误差和跳变,次要有 2 个策略:
1. 当计算出 offset(即 ntp 里的 diff)在 128ms 以内时,对 master 本地时钟往 super master 时钟方向调整最多 0.5ms。当计算出 offset(即 ntp 里的 diff)大于 128ms 时,默认疏忽该 offset,除非该 offset 继续了一个较大阈值周期(300s),才会基于此 offset 调整 master 时钟;
2. 基于稳定阈值 x 剔除有效同步。当本次 ptp 单播的 delay 比最近 30 次 delay 值误差大于阈值 x,则本次 ptp 单播的后果不被利用,同时 x 相应减少。只有以后 ptp 后果被驳回,且 offset 值小于 2ms,才会把 x 重置为初始值。
策略 1 能够保障时钟对齐过程的平滑,同时时钟对齐导致的时钟回退问题也解决了。这里的 0.5ms/ s 不是人为设置一个绝对值,而是调用 linux 内核封装的 Phase-locked loop 机制来对本机时钟进行调整。从而保障工夫调整不会在利用下层体现为工夫回退。该机制原理,本文不做开展。
策略 2 能够剔除网络稳定对同步后果的影响,有点相似 chrony 的 mindelay 机制。
BIGO 在上线该策略后,比照之前无平滑策略的 ntpdate 成果显著,在跨机房同步场景,比 nptd 和 facebook 的 chrony 成果也要更好,相干成果测验上面会残缺论述。
成果评测与仿真
对于精度和成果评测这个话题,业界如 facebook 的 chrony 外部宣称做到 0.1ms 以内的的误差精度,而 google 的 spanner 里的 true time 是 100% 确信在 7ms 的区间内。BIGO 在发展此项工作的一期指标是在没有外部原子钟的前提下,把 99.99% 场景误差精度管制在亚毫秒。
对于精度的测算,自身就是一个跟寰球时钟对齐等同难度的命题。
为什么这么说呢,因为如果咱们能够在上帝视角完满 0 误差辨认任意 2 台机器的时间误差,那么也就代表着咱们能够把任意 2 台机器的时间误差调整为 0。
已知比拟好的评测伎俩,有 facebook 提到的基于 1PPS(每秒脉冲数)来检测任意 2 台机器的时钟误差,该评测能够做到纳秒级的误差,然而对硬件有很多依赖,如须要在机器间铺设专用同轴电缆,须要定制的网卡硬件。
这个话题,咱们次要从 2 个方向来开展:评估指标和评估伎俩。
首先对于用什么指标来评估集群内机器之间的时钟误差状况,比拟直观的就是机器间误差的时间轴坐标图,基于坐标图咱们形象了 2 个次要指标:
1)可用性——基于咱们对误差精度的要求是是亚毫秒,则每秒进行一次机器间时钟误差判断,大于 1ms 则认为这 1 秒时钟服务不可用,最初可用工夫占比即为可用性;
2)最大误差值——机器间误差值稳定过大,咱们认为须要重点关注。
评估伎俩这块,咱们没有相干硬件来撑持咱们做 1PPS 的成果评测,所以咱们这里基于仿真的思路来做评测。
咱们仅仅察看同机房的 2 台机器 A 和 B 的时间误差,因为同机房机器 ping 延时能够稳固在 0.1ms 以下,此时咱们近似具备了较高精度观测误差的能力。而后咱们仅仅先评测以下 3 个场景:
1)A 和 B 各自基于某种同步算法,跟本机房(或者同城)的工夫源做工夫同步,观测 A 和 B 的误差时间轴坐标图;
2)A 和 B 各自基于某种同步算法,跟远端跨大区的工夫源做工夫同步,观测 A 和 B 的误差时间轴坐标图;
3)A 基于某种同步算法,跟远端跨大区的工夫源做工夫同步,B 基于雷同同步算法,跟本机房(或者同城)的工夫源做工夫同步,观测 A 和 B 的误差时间轴坐标图。
图 7 简略形容了后面所说的 3 种评测场景。须要留神一点,待评测的 UTC 工夫源可能是跟咱们的机器在一个机房,也可能仅仅是同城,取决于待评测服务自身理论部署状况。
咱们再来关注怎么评测一个时钟同步算法在跨大区机器间的误差,比方图中 A1 和 B2 之间的时钟误差?
软件层面这个问题看起来是无奈评测的,然而咱们先假如 UTC 工夫源(内部原子钟设施)之间是没有毫秒级误差,那么 A3 和 B3 的时钟误差咱们临时能够基于 0.1ms 的精度进行评测,咱们定义 A3 和 B3 的时钟误差为 diff(A3,B3),则 diff(A1,B2) 近似等于 diff(A3,B3)。
一句话总结,咱们可用观测 diff(A3,B3) 的后果认为其实仿真表白了 diff(A1,B2),等价于咱们胜利评测了一个时钟同步算法在跨大区机器间的误差(实质上还是有 2 套本机房内部原子钟 UTC 源加持,然而仅仅是做评测时依赖而已,咱们的零碎的机器部署本质不依赖内部 UTC 工夫源的具体部署状况)。
至此,咱们曾经具备不依赖外部硬件设施,在 BIGO 寰球机房仿真评测同机房,跨大区机器的毫秒级时钟误差的能力。
图 8 到图 13 别离为跨大洲和同机房状况下 BIGO,NTP 和 facebook 的 chrony 时钟同步误差测量表。
图 8~ 图 13 为咱们观测 BIGO 同机房机器,基于不同算法和不同区域源时钟同步之后,获得的误差表。全副场景都观测了 3 个小时,每秒观测一次,每张图都是 1 万个横轴坐标点。须要留神的是,ntpdate 自身显著过于毛糙,咱们认为不值得浪费时间进行比照,所以这里只比照了 ntpd 和 facebook 的 chrony。
此外,这里的比照后果不肯定就代表 facebook 的 chrony 外部精度状况,仅仅表白了 BIGO 作为一个第三方,去依赖这些服务,咱们能取得的精度能力。而且 chrony 自身提供了数十种参数来调优精度和稳定,因为精力有限,咱们比照时应用默认配置。
图 14 为咱们对 6 张评测成果做的总结。
后面 3 行是跨大洲场景的体现,以后面定义的可用性而言,ntpd 和 chrony 间接应用都无奈满足咱们的可用性需要,而最大误差这块,BIGO 自研架构下的机器时钟误差管制在 0.5ms 内,而间接接入 ntpd 有近 10ms 最大误差,接入 chrony 的误差靠近 6ms。
后 3 行是同机房或者同大区的体现,此时 BIGO 自研架构下的机器时钟误差的可用性和最大误差仍然是好过间接接入 ntpd 或者 chrony 的。其表白的含意为,即便 BIGO 抉择限度本身的机房部署状况,做架构设计去适配 ntpd 和 chrony 源来复用他们提供的时钟对齐服务,成果仍然不如以后版本的 BIGO 自研架构。
总结
总结一下 BIGO 在寰球时钟同步服务的工作,在没有外部原子钟的前提下,基于双层架构设计,建设了稳固的外部 UTC 工夫源。同时基于 ptp 单播配合平滑 + 异样剔除算法保障了第一层跨机房时钟同步精度管制在亚毫秒。而后在第二层机房子网内,基于 ptp 算法实现,优化了网卡发包到用户代码层的时间误差问题,进而把机房内的时钟精度在毫秒内进一步晋升。
最终咱们播种了一个 99.99% 场景下,集群时钟误差都在亚毫秒精度的时钟服务,且随着 ping 值缩小,同机房的精度有进一步的晋升。该服务架构具备良好的外部可扩展性,不依赖内部 NTP 时钟源的部署和服务能力。同时咱们提供了无效的评测伎俩来验证咱们的毫秒级误差状况。
该零碎在外部 UTC 工夫源的精度以及集群可用性,还有反抗上下行延时差值,高精度时钟评测等方向还有诸多工作待进一步开展优化,这些将布局到咱们的前期工作中。
该零碎以后作为基础设施,为 BIGO 的全链路 trace 零碎等多项服务提供时钟对齐保障,胜利解决了负调用耗时等业务问题。