【分布式】HLC 混合逻辑时钟

文章目录

  • 1. 问题陈述
  • 2. 预备知识
  • 3. 简易算法的描述
  • 4. HLC 算法
  • 5. HLC 的优势
  • 6. 其他知识

1. 问题陈述

HLC(Hybrid Logical Clock,混合逻辑时钟) 的目标是提供类似 LC(逻辑时钟) 所提供的单向因果检测,维护时钟值永远接近物理/NTP时钟。HLC 的正式问题陈述如下:

给定一个分布式系统,为每个事件 e 分配一个时间戳 l.e,以使:

  1. e hb f ⇒\Rarr l.e < l.f
  2. l.e 的空间要求为 O(1) 整数,
  3. l.e 用有界空间表示,
  4. l.e 接近于 pt.e ,例如 |l.e - pt.e| 是有界的。

2. 预备知识

一个分布式系统由数量可能随时变化的一系列节点组成。每个节点可以执行三种行为:发送行为,接收行为,和本地行为。时间戳算法的目标是为每个事件分配一个时间戳。使用全部大写字母的名称表示时间戳算法,由该算法分配的时间戳以相应的小写字母表示。例如,使用 LC 代表 Lamport 发明的逻辑时钟算法,用 lc.e 代表由该算法分配给事件 e 的时间戳。

Happened-Before 概念 hb 捕获系统中事件间的因果关系。使用 e hb f 表示事件 e 发生在事件 f 之前,它是一个遵循如下规则的传递关系:ef 是发生在同一节点的事件,且 e 发生在 f 之前;或者 e 是发送事件,且 f 是相应的接收事件。使用 e||f , iff ¬(e hb f ) ^ ¬(f hb e) 表示 ef 是并发事件。基于以上陈述,以下是正确的:

e hb f ⇒\Rarr lc.e < lc.f
lc.e = lc.f ⇒\Rarr e||f
e hb f ⇔\Harr vc.e < vc.f

3. 简易算法的描述

给定 l.e 应接近于 pt.e 的目标,简易算法以此规则开始:对任何事件 e ,l.e ≥ pt.e 。简易算法如图2所示。该算法的工作原理类似于 LC 。初始设置所有 l 为 0 。当在节点 j 上创建一个发送事件 f 时,将 f 设置为 max(l.e+1, pt.j) ,其中 e 是之前发生在节点 j 上的事件。这确保 l.e < l.f 。它也确保 l.f ≥ pt.f 。同样,当在节点 j 上创建一个接收事件 f 时,将 l.f 设置为 max(l.e + 1, l.m + 1, pt.j) ,其中 l.e 是发生在节点 j 上的先前的事件 e 的时间戳,l.m 是消息的时间戳(发送事件)。这确保了 l.e < l.fl.m < l.f

在这里插入图片描述

很容易看出图2中的算法满足问题陈述中的前两个要求。然而,简易算法违反了第四个要求,这也导致它违反了第三个“有界空间”要求。为了展示如何违反第四个要求,在图3中指出一个反例,展示了|l.e - pt.e| 是如何以无界方式增长的。在节点1、2、3 之间的消息循环可以一直重复下去,每次循环逻辑时钟与物理时钟的偏移量会不断增长。

无界偏移问题的根源是因为简易算法使用 l 来同时维护至今已知的最大 pt 值和新事件导致的逻辑时钟增量。这导致时钟丢失信息:不确定新的 l 值来自于 pt(如从节点 0 到节点 1 的消息中所示 )还是因果关系(其他消息也是如此)。因此,没有合适的位置来重置 l 值来限制 l - pt 差值的边界,因为重置 l 可能导致丢失 hb 关系,进而违反要求1。

请注意,即使要求节点的物理时钟在该节点上的任意两个事件之间至少增加一个,该反例仍然有效。然而,如果我们假设发送事件和接收事件的时间足够长,使得每个节点的物理时钟至少增加一个,那么图3中的反例失败了,简易算法将能够保持 |l - pt| 有界。然而,我们接下来展示了如何正确地实现有界 HLC 的正确性,而不是依赖于这样的假设。

4. HLC 算法

我们利用反例中的观察结果来开发正确的 HLC 算法。在该算法中,简易算法中的 l.j 被扩展到两个部分:l.jc.j 。第一部分 l.j 被引入为间接级别,以保持迄今为止已知的 pt 信息的最大值,并且 c 仅用于在 l 值相等时捕获因果关系更新。

与在不违反 hb 的情况下没有合适的地方重置 l 的简易算法相比,在 HLC 算法中,当接收到最大 pt 的赶上或超过 l 的信息时,我们可以重置 c 。由于 l 表示节点之间接收到的最大 pt ,并且不会随着每个事件在有界时间内不断增加,以下任何一种情况都可以保证发生:1)一个节点接收到一个具有较大 l 的消息,其 l 被更新,c 被重置以反映这一点;或者 2)如果该节点没有收到其他节点的消息,则其 l 保持不变,其 pt 将赶上并更新其 l ,并重置 c

HLC 算法的描述如图4所示。初始设置 lc 的值为 0 。在节点 j 上创建一个新发送事件 f 时,设置 l.jmax(l.e, pt.j) ,其中 e 是发生在 j 上的先前事件。类似于简易算法,这确保 l.j ≥ pt.j 。然而,由于移除“+1”导致 l.e 可能等于 l.f 。因此引入了不断增长的 c.j ,以确保 (l.e, c.e) < (l.f, c.f) 在字典比较中为真。如果 l.e 不等于 l.f 则重置 c.j 。这确保 c.j 的值是有界的。创建一个新接收事件时,设置 l.jmax(l.e, l.m, pt.j)c.j 的值取决于 l.j 是否等于 l.el.m ,二者全部,或都不等于。

字典比较方式
(a, b) < (c, d) iff ((a < c) ∨ ((a = c) ∧ (b < d)))

在这里插入图片描述

算法解释:

初始 l.j 、c.j 都等于 0 。
将之前的逻辑时间戳 l.j 赋值给临时变量 l′.jl^{'}.jl.jl′.jl^{'}.jl.j 的值可能为 0 (第一次运行)或 pt.j 。新发送或本地事件的逻辑时间戳 l.j 等于保存之前逻辑时间戳的临时变量 l′.jl^{'}.jl.j 和 物理时钟 pt.j 中的最大值。
a) 第一次运行时,l′.jl^{'}.jl.j = 0 , l.j = max(l′.jl^{'}.jl.j, pt.j) = pt.j, c.j = 0 , (l.j, c.j) = (pt.j, 0) ;
b) 而后,如果节点 j 上暂未发生接收事件,则 l′.jl^{'}.jl.j = l.j = pt.j_prior, l.j = max(l′.jl^{'}.jl.j, pt.j) = pt.j, c.j = 0 , (l.j, c.j) = (pt.j, 0) ;
如果节点 j 上发生过接收事件,则 l′.jl^{'}.jl.j = l.j = pt.j_prior, l.j = max(l′.jl^{'}.jl.j, l.m, pt.j),
c) 如果此时 l′.jl^{'}.jl.j = l.m = pt.j ,则证明接收消息的逻辑时钟 l.m = l′.jl^{'}.jl.j > pt.j ,即已知的逻辑时钟等于接收到的消息的逻辑时钟,且大于此时的物理时钟。为了使接收事件的 HLC 元组 (l.j, c.j) > (l.m, c.m) ,则应设置 c.j = max(c.j, c.m) + 1 ;
d) 否则,如果 l.j = l′.jl^{'}.jl.j ,则证明 l′.jl^{'}.jl.j > l.m 且 l′.jl^{'}.jl.j ≥ pt.j 。为了使接收事件的 HLC 元组 (l.j, c.j) > (l′.jl^{'}.jl.j , c.j) ,则应设置 c.j = c.j + 1 ;
e) 否则,如果 l.j = l.m ,则证明 l.m > l′.jl^{'}.jl.j 且 l.m ≥ pt.j ,为了使接收事件的 HLC 元组 (l.j, c.j) > (l.m, c.m) ,则应设置 c.j = c.m + 1 ;
f) 否则,即 l.j = pt.j ,则证明 pt.j > l.m 且 pt.j > l′.jl^{'}.jl.j ,则此时应重置 c.j 为 0 ;
如果发生接收事件后,又发生了新的发送或本地事件,则
g) 此时 l′.jl^{'}.jl.j > pt.j,所以 l.j = max(l′.jl^{'}.jl.j, pt.j) = l′.jl^{'}.jl.j ,为了使新的发送或本地事件的 HLC 元组 (l.j, c.j) > (l′.jl^{'}.jl.j, c.j) ,则应设置 c.j = c.j + 1 。

5. HLC 的优势

  • HLC 可看做是 HT(HybridTime) 的逻辑时钟版本,HLC 对物理时钟(与 **PT(Physical Time)TT(TrueTime)**类似)和逻辑时钟(与 LC 类似)进行组合、改进。HLC 维护它的逻辑时钟使其永远接近于物理/NTP时钟。因此,它可以在某些应用中用作物理/NTP时钟的替代,比如分布式键值仓库或数据库中的快照读。
  • HLC 向后兼容 NTP,并适用于 64位 NTP 时间戳。
  • HLC 对 NTP 扭结(kinks)和不确定性具有屏蔽容忍。HLC 也是自稳定容错的,并且对时钟变量的任意损坏具有迅速可恢复性。
  • HLC 在识别分布式数据库中的一致性快照方面具有直接应用。它在许多分布式系统协议中也很有用,包括分布式系统中的因果消息记录、拜占庭容错协议、分布式调试、分布式文件系统和分布式事务。例如,Spanner 的开源实现 CockroachDB 使用了 HLC ,详见 https://github.com/cockroachdb/cockroach 和 https://www.cockroachlabs.com 。

6. 其他知识

有关 LC, VC(Vector Clock,向量时钟), PT, TT, HT 的信息,请参考 HLC 和其他相关文献。

查看全文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/2231752.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章:

在这里插入图片描述

【分布式】HLC 混合逻辑时钟

文章目录1. 问题陈述2. 预备知识3. 简易算法的描述4. HLC 算法5. HLC 的优势6. 其他知识1. 问题陈述
HLC(Hybrid Logical Clock,混合逻辑时钟) 的目标是提供类似 LC(逻辑时钟) 所提供的单向因果检测,维护时……

如何从功能测试转型到自动化测试:我三年的学习经历

前言
在软件测试的领域里,自动化测试已经成为了不可或缺的一部分。
与传统的手工测试相比,自动化测试具有更高的效率和精确度,能够有效地减少测试时间和成本,同时提高测试质量。作为一个从事软件测试的人员,如果你想……

【树】由二叉树到空间索引树

目录1 二叉树系列1.1 二叉树满二叉树完全二叉树二叉搜索树平衡二叉树红黑树1.2 平衡二叉树左旋和右旋插入失衡删除失衡1.3 红黑树算法公式2 B 树系列2.1 B 树插入算法删除算法2.2 B 树2.3 B* 树3 空间索引系列树3.1 KD 树3.2 四叉树与八叉树四叉树八叉树3.2 R 树与 RD 树4 其他……

数据结构和算法(二):递归、排序、通用排序算法

从广义上来讲:数据结构就是一组数据的存储结构 , 算法就是操作数据的方法 数据结构是为算法服务的,算法是要作用在特定的数据结构上的。 10个最常用的数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树 10个最……

3.6.3数据库系统-模式分解:是否保持函数依赖、保持函数依赖分解定义、无损分解、表格法、公式法

3.6.3数据库系统-模式分解:是否保持函数依赖、保持函数依赖分解定义、无损分解、表格法、公式法是否保持函数依赖保持函数依赖分解定义例题无损分解表格法例题公式法例题是否保持函数依赖
函数依赖是通过某一个维度可以函数决定另一个部分,这里在关系模……

Golang学习+深入(七)-函数

目录
一、概述
1、函数
1.1、函数-递归调用
1.2、init函数
1.3、匿名函数
1.4、闭包
1.5、函数中-defer
1.6、函数参数的传递方式
2、包
3、字符串中常用的函数 一、概述
1、函数
为完成某一功能指令(语句)的集合,称为函数。在Go中,函数分为……

Springboot统一日志处理(Logback)

一、日志介绍
1、什么是日志
通过日志查看程序的运行过程,运行信息,异常信息等
2、日志的功能:
1.快速的定位和排查问题; 2.记录用户信息; 3.记录操作信息,可以帮助恢复数据或者定位责任人;……

PTA浙大版《C语言程序设计(第4版)》(函数题)

函数题练习5-1 求m到n之和练习5-2 找两个数中最大者练习5-3 字符金字塔习题5-1 符号函数习题5-2 使用函数求奇数和习题5-3 使用函数计算两点间的距离习题5-4 使用函数求素数和习题5-5 使用函数统计指定数字的个数习题5-6 使用函数输出水仙花数习题5-7 使用函数求余弦函数的近似……

单片机_CT107D训练平台电路原理图\蓝桥杯训练板\ AD\DA转换\ PCF8591芯片\

A/D、D/A 模块 配置 PCF8591A/D、D/A 芯片,内含 8 位 4 通道 A/D 转换、单通道 D/A 转换。 PCF8591是单片、单电源低功耗的8位CMOS数据采集器件,具有IIC总线接口的8位A/D以及D/A转换器,有4路A/D转换输入,1路D/A模拟输出
PCF8591的……

Redis 03-分布式缓存Redis

分布式缓存
– 基于Redis集群解决单机Redis存在的问题
单机的Redis存在四大问题:
0.学习目标
1.Redis持久化
Redis有两种持久化方案:
RDB持久化AOF持久化
1.1.RDB持久化
RDB全称Redis Database Backup file(Redis数据备份文件&#……

反序列化渗透与攻防(五)之shiro反序列化漏洞

Shiro反序列化漏洞
Shiro介绍
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性
Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默……

vue2+vue3

vue2vue3尚硅谷vue2vue2 课程简介【02:24】vue2 Vue简介【17:59】vue2 Vue官网使用指南【14:07】vue2 搭建Vue开发环境【13:54】vue2 Hello小案例【22:25】了解: 不常用常用:id 更常用 简单class差值总结vue 实例vue 模板 : 先 取 &#xff0……

【hello Linux】环境变量

目录 1. 环境变量的概念 2. 常见的环境变量 3. 查看环境变量 4. 和环境变量相关的命令 5. 环境变量的组织方式 6. 通过代码获取环境变量 7. 通过系统调用获取环境变量 Linux🌷 在开始今天的内容之前,先来看一幅图片吧! 不知道你们是否和我一……

【Linux基础】常用命令整理

ls命令
-a选项,可以展示隐藏的文件和文件夹-l选项,以列表形式展示内容-h,需要和-l搭配使用,可以展示文件的大小单位ls -lah等同于la -a -l -h
cd命令(change directory)
语法:cd [Linux路径]……

客快物流大数据项目(一百一十二):初识Spring Cloud

文章目录
初识Spring Cloud
一、Spring Cloud简介
二、SpringCloud 基础架构图…

C和C++中的struct有什么区别

区别一: C语言中: Struct是用户自定义数据类型(UDT)。 C语言中: Struct是抽象数据类型(ADT),支持成员函数的定义。
区别二:
C中的struct是没有权限设置的&#xff0c……

docker的数据卷详解

数据卷 数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方修改会立即同步
一个数据卷可以同时被多个容器同时挂载,一个容器也可以被挂载多个数据卷
数据卷作用:容器数据持久化 /外部机器和容器间接通信 /容器……

13、Qt生成dll-QLibrary方式使用

Qt创建dll,使用QLibrary类方式调用dll
一、创建项目
1、新建项目->其他项目->Empty qmake Project->Choose 2、输入项目名,选择项目位置,下一步 3、选择MinGW,下一步 4、完成 5、.pro中添加TEMPLATE subdirs&#xff……

基于mapreduce 的 minHash 矩阵压缩

Minhash作用: 对大矩阵进行降维处理,在进行计算俩个用户之间的相似度。
比如: 俩个用户手机下载的APP的相似度,在一个矩阵中会有很多很多的用户要比较没俩个用户之间的相似度是一个很大的计算任务 如果首先对这个矩阵降维处理&am……

关于hashmap使用迭代器的问题

keySet获得的只是key值的集合,valueSet获得的是value集合,entryset获得的是键值对的集合。 package com.test2.test;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;public class mapiterator……

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注