分布式时钟同步之:逻辑时钟、向量时钟、混合逻辑时钟(三)


混合逻辑时钟(HLC)的目标

混合逻辑时钟在论文《Logical Physical Clocks and Consistent Snapshots in Globally Distributed Databases》中被提出,其具有以下四个目标:

  • 满足逻辑时钟的因果一致性
  • 单个时钟的存储空间是O(1)的,而并非向量时钟那样是O(n)的(n是分布式系统中节点数量)
  • 单个时钟的大小有确定边界(不会变成无穷大)
  • 尽可能接近物理始终(与物理始终的误差保持在一定界限 ε \varepsilon ε 内)
    • 这可以保证,无论是否使用混合逻辑时钟(HLC),只要两个操作的间隔大于 ε \varepsilon ε,那么就可以保证因果一致性

HLC的主要思想

  • 将物理时钟和逻辑时钟进行组合e.g. 高48位记录秒级别(或更高精度)的物理时钟,低16位作为逻辑时钟
  • 每当更新HLC时,若本地物理时钟pt的值大于HLC中的物理时钟(粒度不用很小,秒级别即可)部分,则将HLC与物理时钟pt对齐,保证与本地物理时钟尽量靠近(即保证HLC时钟与本地物理时钟的差距在一定范围内
  • 物理时钟部分相同时,利用HLC的逻辑时钟部分来维护事件的因果关系

进程内HLC的更新方式

进程内发生事件时,检查当前获取的物理时间 p t n o w pt_{now} ptnow 和上一个HLC里的物理时钟部分 l p r e v l_{prev} lprev

  • 如果 p t n o w = l p r e v pt_{now}=l_{prev} ptnow=lprev,那么将逻辑时钟+1
  • 如果 p t n o w > l p r e v pt_{now}>l_{prev} ptnow>lprev,那么将逻辑时钟清零
  • 如果 p t n o w < l p r e v pt_{now}<l_{prev} ptnow<lprev,表示物理时钟出现了奇怪的问题,那么还是将逻辑时钟+1

在这里插入图片描述

图1:论文中进程内HLC的更新伪代码

这里 l . j l.j l.j 表示混合逻辑时钟的物理时钟部分, c . j c.j c.j 表示混合逻辑时钟的逻辑时钟部分, p t pt pt 表示本地物理时钟, j j j 表示一个事件


进程间HLC的更新方式

接收消息时,检查当前获取的物理时间 p t n o w pt_{now} ptnow 、上一次事件HLC里的物理时间 l p r e v l_{prev} lprev 、以及消息里HLC的物理时间 l m s g l_{msg} lmsg

首先将HLC的物理时钟部分设置为 p t n o w pt_{now} ptnow l p r e v l_{prev} lprev l m s g l_{msg} lmsg 中的最大值

  • 如果 p t n o w ≤ l p r e v = l m s g pt_{now}\leq l_{prev}=l_{msg} ptnowlprev=lmsg,那么更新逻辑时钟为 max ⁡ { c p r e v , c m s g } + 1 \max\{c_{prev}, c_{msg}\}+1 max{cprev,cmsg}+1
  • 如果 p t n o w > max ⁡ { l p r e v , l m s g } pt_{now}> \max\{l_{prev},l_{msg}\} ptnow>max{lprev,lmsg},那么将逻辑时钟部分清零
  • 如果 p t n o w ≤ l p r e v < l m s g pt_{now}\leq l_{prev}<l_{msg} ptnowlprev<lmsg,那么将逻辑时钟设置为 c m s g + 1 c_{msg}+1 cmsg+1
  • 如果 p t n o w ≤ l m s g < l p r e v pt_{now}\leq l_{msg}<l_{prev} ptnowlmsg<lprev,那么将逻辑时钟设置为 c p r e v + 1 c_{prev}+1 cprev+1

在这里插入图片描述

图2:论文中进程间HLC的更新伪代码

这里 l . j l.j l.j 表示混合逻辑时钟的物理时钟部分, c . j c.j c.j 表示混合逻辑时钟的逻辑时钟部分, p t pt pt 表示本地物理时钟, j j j 表示一个事件


HLC的性质

按照论文中的说法,HLC具有以下几条性质。我认为其中第一条和第三条其实是最重要的

  • 性质一:如果事件P发生在事件Q之前,那么 ( l P , c P ) < ( l Q , c Q ) (l_P, c_P)<(l_Q, c_Q) (lP,cP)<(lQ,cQ)
    • 其实这说明HLC和逻辑时钟一样,如果事件P和事件Q存在因果关系,那么P和Q的HLC时钟存在偏序关系。而且要证明也不难。
  • 性质二:对于任何事件P,都有 l P ≥ p t P l_P\geq pt_P lPptP
    • 很好理解,因为每次都是和本地时钟 p t pt pt 取最大值
  • 性质三:对于事件 f f f l f ≥ p t f l_f\geq pt_f lfptf表示存在一个在 f f f 之前发生的事件 g g g(其他节点上),且 p t g = l f pt_g=l_f ptg=lf
    • 也很好理解,因为如果不存在这样的 g g g,那么 l f l_f lf应该始终等于 p t f pt_f ptf才对
    • 那么这条性质有什么用呢?
      • 可以看出, l f l_f lf 总是保持为已接触到的所有物理时钟的最大值
      • 同时,作者在论文中给出了一个物理时钟 p t pt pt的同步精度要求(即要求物理时钟同步误差限制在 ε \varepsilon ε 以内)
        在这里插入图片描述
        图3:论文中给出的关于硬件时钟同步的精度要求
      • 那么结合以上两条,就可以发现,性质3可以保证HLC和物理时钟 p t pt pt的差距是有上界的。而这一点在应用中是十分有意义的。
  • 性质四:逻辑时钟的大小是有上界的
    • 其实这条性质是作者强行弄出来的,因为他要求同一进程内两个相邻事件间,物理时钟至少被增加了1(就很无语)。在这种假设下,逻辑时钟大小肯定有上界了啊,但这在实际中有啥用呢?
      在这里插入图片描述
      图4:论文中给出的关于物理时钟更新频率的要求

混合逻辑时钟这个概念在分布式系统里面还是挺有意思的,可以再深入研究一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值