分布式系统的一致性与共识算法(二)

Consitency

背景

如买最后一张车票,两个售票处分别通过某种方式确认过这张票的存在。这时,两家售票处几乎同时分别来了一个乘客要买这张票,从各自"观察"看来,自己一方的乘客都是先到的,这种情况下,怎么能达成对结果的共识呢?看起来很容易,卖给物理时间上率先提交请求的乘客即可。然而,对于两个来自不同位置的请求来说,要判断在时间上的"先后"关系并不是那么容易。两个车站的时钟时刻可能是不一致的。时钟计时可能不精确的。根据相对论的观点,不同空间位置的时间是不一致的。因此追求绝对时间戳的方案是不可行的,能做的是要对事件的发生进行排序。这也是解决分布式系统领域很多问题的核心秘诀,把不同时空发生的多个事件进行全局唯一排序,而这个顺序还得是大家都认可的。排了序,一个一个处理就行了,和单机没有任何区别(不考虑突然故障情况,只考虑共识机制)如果存在可靠的物理时钟,实现排序往往更为简单。高精度的石英钟的漂移率为10的-7次方,最准确的原子震荡时钟的漂移率为10的-13次方。Google曾在其分布式数据库Spanner中采用基于原子时钟和GPS的"TrueTIme"方案,能够将不同数据中心的事件偏差控制在10ms知心区间。在不考虑成本的前提下,这种方案简单、有效。然而,计算机系统的时钟误差要大得多,这就造成分布式系统达成一致顺序十分具有挑战性,或者说基本不可能。要实现绝对理想的严格一致性(Strict Consistency)代价很大。除非系统不发生任何故障,而且所有节点之间的通信无需任何时间,此时整个系统其实就等价于一台机器了,因此根据实际需求的可用,人们可能选择不同强度的一致性。

顺序一致性(Sequential Consistency)

虽然强度上 线性一致性 > 顺序一致性,但因为顺序一致性出现的时间比较早(1979年),线性是在顺序的基础上的加强(1990年)。因此先介绍下 顺序一致性。
顺序一致性也算强一致性的一种,它的原理比较晦涩。

举例说明1:下面的图满足了顺序一致,但不满足线性一致

在这里插入图片描述

  • 1.x和y的初始值为0
  • 2.Write(x,4)代表写入x=4,Read(y,2)为读取y=2

从图上看,进程P1,P2的一致性并没有冲突。因为从这两个进程的角度来看,顺序应该是这样的。

Write(y,2), Read(x,0), Write(x,4), Read(y,2)

这个顺序对于两个进程内部的读写顺序都是合理的,只是这个顺序与全局时钟下看到的顺序并不一样。在全局时钟的观点来看,P2进程对变量X的读操作在P1进程对变量X的写操作之后,然而P2读出来的却是就数据0

举例说明2:

假设我们有个分布式KV系统,以下是四个进程对其的操作顺序和结果:
-表示持续的时间,因为一次写入或者读取,客户端从发起到响应是由时间的,发起早的客户端,不一定拿到数据就早,有可能因为网络延迟反而更晚。
情况1:

A:--W(x,1)------------------------
B:  --W(x,2)------------------------
C:                                   -R(x,1)-         --R(x,2)-
D:                     -R(x,1)-              --R(x,2)--

情况2

A:--W(x,1)------------------------
B:  --W(x,2)------------------------
C:                                 -R(x,2)-        --R(x,1)--
D:                          -R(x,2)-          --R(x,1)--

上面情况1和2都是满足顺序一致性的,C和D拿到的顺序都是1-2或2-1,只要CD的顺序一致,就是满足顺序一致性。只是从全局看来,情况1更真实,情况2就显得"错误"了,因为情况2是这样的顺序

B W(x,2) -> A W(x,1) -> C R(x,2) -> D R(x,2) -> C R(x,1) -> D R(x,1)

不过一致性不保证正确性,所以这仍然是一个顺序一致,再加一种情况3

A:--W(x,1)------------------------
B:  --W(x,2)------------------------
C:                            -R(x,2)             --R(x,1)-
D:                      -R(x,1)-            --R(x,2)-- 

情况3就不属于顺序一致了,因为C和D两个进程的读取顺序不同了,回到情况2,C和D拿数据发起的时间是不同的,且有重叠,有可能C拿到1的时候,D已经拿到了2,这就导致了不同的客户端在相同的时间获取了不一样的数据,但其实这种模式在现实中的用的听广泛的:
如,你在Twitter上写了两条推文,你的操作会耗费一定的时间渗透进一层层的缓存系统,不同的朋友将在不同的时间看到你的信息,但每个朋友都会以相同顺序看到了你的两条推文,不会是乱序。只是一个朋友已经看到了第二条,一个朋友才刚看到第一条,不过没关系,它总会看到两条,顺序没错就行,无伤大雅。但有些时候,顺序一致性是不满足要求的

举例说明3:

在这里插入图片描述

从时间轴上可以看到,B0发生在A0之前,读取到的x值为0.B2发生A0之后,读取到的x值为1.而读操作B1,C0,C1与写操作A0在时间轴上有重叠,因此它们可能读取到旧的值0,也可能读取到新的值1,注意,C1发生在B1之后(二者在时间轴上没有重叠),但是B1看到x的新值,C1反而看到的是旧值。对于用户来说,x的值发生了回调。即要求任何一次读都能读取到最新数据,和全局时钟一致,对比例1,既满足顺序一致又满足线性一致应该是这样的。如图所示。在这里插入图片描述

每个读操作都读到了该变量的最新写的结果,同时两个进程看到的操作顺序与全局时钟的顺序一样,都是Write(y,2),Read(x,4),Write(x,4),Read(y,2)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

思科模拟器学习1--Vlan Trunk

实验说明:将三台电脑的vlan 加到一台交换机里面,为了验证什么是虚拟局域网,把一个设备隔成三个空间,三个电脑互相不能通讯;目的是:vlan 1的通讯不可以向vlan 2传送,就是消息传送互不干扰的&…

解决Android Studio Gradle下载慢的问题

安卓 gradle-7.5-bin.zip 下载慢 https://mirrors.cloud.tencent.com/gradle/7.x.x 找到对应匹配版本 把下载的文件直接复制到 C:\Users\Administrator.gradle\wrapper\dists\gradle-x.x\ 中对应版本目录下,例如需要下载 gradle-2.14.1-all.zip,则下载好…

【Pytorch】torch.nn.conv2d

这个函数和我们之前提到的【Pytorch】6.torch.nn.functional.conv2d的使用的作用相似,都是完成CV领域的卷积操作,这里就不在过多赘述 torch.nn.conv2d的使用 打开pytorch的官方文档,我们可以看到 torch.nn.conv2d包含了若干参数 in_channe…

考研数据结构:栈与队列

栈与队列 栈Stack 栈的结构体定义及基本操作。 #define MaxSize 50 typedef struct {int data[MaxSize];//栈中存放数据类型为整型int top;//栈顶指针 }Stack; void InitStack(Stack& S) {//初始化栈S.top -1; } int IsEmpty(Stack S) {//判断栈是否为空if (S.top -1)…

一文读懂 Pencil 积分,打开 Pencils Protocol 生态权益大门

近日,Scroll 生态项目 Penpad 近期将品牌全新升级为 Pencils Protocol ,在升级后,其从一个 Scroll 生态的原生 LaunchPad 平台进一步拓展为集 Staking、Vault 以及 Shop 等功能于一体的全新生态。全新的品牌升级不仅让 Pencils Protocol 生态…

ubuntu18.04系统安装pangolin

1. 安装pangolin依赖项 ctrlaltt 打开终端,依次输入下面的命令 sudo apt update sudo apt upgrade sudo apt install libglew-dev cmake libboost-dev libboost-thread-dev libboost-filesystem-dev libeigen3-dev -y 2.在终端中输入下面的命令,克隆…

2024 年第一季度全球互联网中断事件

2024 年第一季度伊始,互联网发生了多起中断事件。陆地和海底电缆的损坏在多个地方造成了问题,而与持续中地缘政治冲突相关的军事行动影响了其他地区的连接。 几个非洲国家以及巴基斯坦的政府下令关闭互联网,主要针对移动网络连接。 被称为Ano…

Pyqt中QThread传递自己定义的参数、类、函数

Pyqt中QThread传递自己定义的参数、类、函数 1 pyqt中Qthread传递自己定义的参数2 pyqt中Qthread传递自己定义的类3 pyqt中Qthread传递自己定义的函数4 pyqt中Qthread内部定义自己的函数5 pyqt中Qthread传递参数到内部定义自己的函数 1 pyqt中Qthread传递自己定义的参数 在PyQ…

Android开发adb命令使用大全

Android开发中,adb(Android Debug Bridge)是一个多功能命令行工具,它允许你与连接的Android设备进行通信。以下是一些常用的adb命令及其用途的详细列表: 基本设备管理 adb devices:列出所有连接的设备和模拟…

(四)Spring教程——控制反转或依赖注入与Java的反射技术

IoC的底层实现技术是反射技术,目前Java、C#、PHP 等语言均支持反射技术。 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法;对任意一个对象,都能够调用它的任意方法和属性(包括私有的方法…

python的标准数据类型

四、标准数据类型 1、为什么编程语言中要有类型 类型有以下几个重要角色: 对机器而言,类型描述了内存中的电荷是怎么解释的。 对编译器或者解释器而言,类型可以协助确保上面那些电荷、字节在程序的运行中始终如一地被理解。 对程序员而言…

vLLM推理服务库

一、定义 定义与目的为什么Cache只存储K、V,而不存储Q?为什么vllm和HF推理结果不一致?vLLM 实现原理pagedAttention 实现原理模型部署demo 二、实现 定义与目的 目的:减少显存、提高吞吐量。如何优化KV cache,节省显…

基于大模型训练的数字识别

创作原因 现在写电赛题,题目有识别数字的要求。但使用设备openmv使用模板匹配的算法帧率很低,且识别效果不是很好,于是我们就想到了利用神经网络训练模型来识别数字 正文部分 内容介绍 本文内容是基于openmv使用Edge Impulse训练大模型。…

爬虫工作量由小到大的思维转变---<第七十五章 > Scrapy爬虫回调函数在请求重试中的应用研究

前言: 在Scrapy框架中,利用回调函数进行请求重试的实践方法与其优劣势,与传统的中间件重试机制进行对比。通过深入分析回调函数的工作原理及其在网络爬虫项目中的应用,旨在提高网络爬虫的效率和稳健性。同时,本文将探讨…

服务攻防——应用协议ssh,rsync,proftpd,openssh,libssh

1.口令猜解 ftp-拿来文件传输的 rdp-windows远程连接 3389 ssh-linux远程连接 工具hydra 口令 1.windows 这就爆破成功了,现在,我们就可以ftp爆破,爆破出ftp的密码 爆破出来后 访问 2.ssh Rsync(配置不当,未授权…

【Docker】docker-compose简单实战

1、首先要准备好Jar包 docker-compose.yml version: "2.2.4" services:redis:image: rediscontainer_name: redisvolumes:- /redis/data:/data- /redis/redis.conf://usr/local/etc/redis/redis.confnetworks:- kewu-networkkewu:build:context: .dockerfile: dock…

[NOI Online #2 入门组] 未了

[NOI Online #2 入门组] 未了 题目描述 由于触犯天神,Sisyphus 将要接受惩罚。 宙斯命 Sisyphus 推一块巨石上长度为 L L L 的山坡。Sisyphus 匀速向上推的速度为每年 v v v 的长度(由于是匀速,故经过 1 2 \frac{1}{2} 21​ 年将能向上…

Gooxi发布最新AI服务器:加速生成式AI落地 更懂AI

近日,Gooxi发布最新训推一体AI服务器,以大容量内存和灵活的高速互连选项满足各种AI应用场景,最大可能支持扩展插槽,从而大幅提升智能算力性能,以最优的性能和成本为企业的模型训练推理落地应用提供更好的通用算力。 AI…

主从Reactor服务器

目录: 目录: 目标: 本文讲解思路: 各模块的功能以及代码: 1.服务器相关模块:服务器模块的功能是对所有的连接以及线程进⾏管理 2.协议相关模块:协议模块是对当前的Reactor模型服务器提供应…

【HarmonyOS】Stage 模型 - 应用配置文件

如图所示: Stage 模型应用配置文件主要有两类: 全局配置文件。放在 AppScope 目录下,app.json5。用来配置应用全局的信息。模块配置文件,放在每个模块里,module.json5。用来配置模块的信息。 一、全局配置文件 示…