当前位置: 首页 > news >正文

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

前言

etcd是线性一致性读,而zk却是顺序一致性读,再加上各种共识、强弱一致的名词,看到欸度时候总会混淆,这里会给出一些例子来帮助理解。

什么是一致性?

在谈到一致性这个词时,你会想到CAP理论的consistency,或者ACID钟的consistency,或者cache一致性协议的coherence,还是Raft/Paxos钟的consensus?
一致性这个词在不同的领域具有不同的含义,毕竟这个中文词在英文词对应了不同的术语,consistency,coherence,consensus三个单词统一翻译为"一致性"。因此在谈一致性之前,有必要对这几个概念做一个区分,否则很容易让人迷惑。

coherence

Coherence只出现在Cache Coherence一词中,称为"缓存一致性",研究多核场景,即怎么保证多个核上的CPU缓存数据是一致的。一般是单机维度的,不算分布式领域

consensus

consensus准确的翻译是共识,即多个提议者达成共识的过程,例如Paxos,Raft就是共识算法,Paxos是一种共识理论,分布式系统是他的场景,一致性是他的目标。
一些常见的误解:使用了Raft或者Paxos的系统都是线性一致的(Linearizability即强一致),其实不然,共识算法只能提供基础,要实现线性一致还需要在算法之上做出更多的努力。因为分布式系统引入了多个节点,节点规模越大、宕机、网络时延、网络分区就会成为常态,任何一个问题都可能导致节点之间的数据不一致,因此Paxos和Raft准确来讲是用来解决一致性问题的共识算法,用于分布式场景,而非"缓存一致性"这种单机场景。所以很多文章也就简称"Paxos是分布式系统中的一致性算法"。
一致性(Consistency)的含义比共识(Consensus)要宽泛,一致性指的是多个副本对外呈现的状态。包括顺序一致性、线性一致性、最终一致性等。而共识特指达成一致的过程,但注意,共识并不意味着实现了一致性,一些情况它是做不到的

Paxos与Raft

Paxos其实是一类协议,Paxos中包含Basic Paxso、Multi-Paxos、Cheap Paxos和其他的变种。Raft就是Multi-Paxos的一个变种,Raft通过简化
Multi-Paxos的模型,实现了一种更容易让人理解和工程实现的共识算法,Paxos是第一个被证明完备的共识算法,能够让分布式网络中的节点出现错误时仍然保持一致,当然前提是没有恶意节点,也就是拜占庭将军问题。在传统的分布式系统领域是不需要担心这种问题的。因为不论是分布式数据库、消息队列、分布式存储,你的机器都不会故意发送错误信息,最常见的问题反而是节点失去响应,所以它们在这种前提下,Paxos是足够用的

复制状态机

Consensus共识在实现机制上属于复制状态机(Replicated State Machine)的范畴,复制状态机是一种很有效的容错技术,基于复制日志来实现,每个Server存储着一份包含序列的日志文件,状态机会按顺序执行这些命令。因为日志中的命令和顺序都相同,因此所有节点会得到相同的数据。因此保证系统一致性就简化为保证操作日志的一致,这种复制日志的方式被大量运用,如果GSF、HDFS、ZooKeeper和etcd都是这种机制。

区块链

共识算法还有一个很重要的领域,就是比较火的区块链,比如工作量证明(POW)、权益证明(POS)和委托权益证明(DPOS)、置信度证明(POB)等等,都是共识算法。大家熟知的zk、etcd这种之所以叫"传统分布式",就是相对于区块链这种"新型分布式系统"而言的,都是多节点共同工作,只是区块链有几点特殊:

  • 1.区块链需要解决的是拜占庭将军问题,Paxos之类的一致性算法无法对抗欺诈节点
  • 2.区块链中不存在中央空置房,没有一个节点可以控制或协调账本数据的生成
  • 3.区块链中的共识算法如果达不到一致性,则任何人都可以硬分叉,另建一个社区、一条链
  • 4.分布式系统的性能理论上可以无限提升,但是区块链是以相对的低效率来换取公正,主流的公有链每秒只能处理几笔到几十笔交易

consistency

介绍完了Coherence和Consensus共识,我们来看consistency一致性,也就是我们平时说的最多的CAP、BASE、ACID之类。
最简单的,客户端C1将系统中的一个值K由V1更新为V2,客户端C2/C3/C4需要立即读取到K的最新值。

一致性要求的是一致,并不是正确,如果所有节点给出一个"错误"的答案,那也叫一致性

对于不同的场景,用户角度对于一致性的要求是不一样的,例如:

  • 1.银行系统:你在柜台存了一笔钱,同时你的朋友转账给你一笔钱,你的女朋友同时又在淘宝消费了一笔钱,你可能会感觉很乱,但你相信,最后你的余额一定是对的,银行可以慢一点,但不会把钱搞错。
  • 2.电商系统:你在淘宝看到一个库存为5的衣服,然后你快速下单,但是被提示"库存不足,无法购买",你会觉得自己动作太慢,被人抢走了,不太关心库存为啥显示5
  • 3.论坛小站:你注册一个论坛,需要手机验证码,点完发送之后,一直没有响应,过了一天你才收到了这条短信,不过小站而已,不注册也就罢了。

上面是夸张了的用户情况,在实际业务中,一致性也是分等级的,如强一致行和弱一致性,怎么使用要看具体和系统的容忍度。
强一致性和弱一致性只是一种统称,按照从强到弱,可以划分为:

  • 1.线性一致性Linearizability consitency,也叫原子性
  • 2.顺序一致性Sequential consistency
  • 3.因果一致性Causal consistency
  • 4.最终一致性Eventual consistency

强一致性包括线性一致性和顺序一致性,其他的如最终一致性都是弱一致性。
关于强和弱的定义,可以参考剑桥大学的slide

Strong consistency
- ensures that only consistent state can be seen.
* All replicas return the same value when queried for the attribute of an object. This may be achieved at a cost - high latency.Weak consistency
- for when "fast access" requriement domainates
* update some replica, e.g. the closest or some designated replica
* the update replica sends up date messages to all other replicas.
* different replicas can return different values for the queried attribute of the value should be returned ,or "not known", with a timestamp
* in the long term all updates must propagte to all replicas ....

强一致性集群中,对任何一个节点发起请求都会得到相同的回复,但将产生相对高的延迟。而弱一致性具有更低的响应延迟,但可能会回复过期的数据,最终一致性即是经过一段时间后会达到一致的弱一致性

相关文章:

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

前言 etcd是线性一致性读,而zk却是顺序一致性读,再加上各种共识、强弱一致的名词,看到欸度时候总会混淆,这里会给出一些例子来帮助理解。 什么是一致性? 在谈到一致性这个词时,你会想到CAP理论的consist…...

创建一个Spring Boot项目

文章目录 一、如何创建一个Spring Boot项目1.1 项目创建:专业版 or 社区版 or 网站创建1.2 数据配置1.3 项目启动1.4 代码编写 二、Spring Boot 项目文件介绍三、Web服务器四、根据HTTP状态码解决bug4.1 4044.2 500 五、Spring VS Spring Boot VS Spring Web MVC5.1…...

ansible -playbook运维工具、语法、数据结构、命令用法、触发器、角色

目录 配置文件 基本语法规则: YAML支持的数据结构 playbook核心元素 ansible-playbook用法: 触发器 特点: 角色: 习题: 配置文件 playbook配置文件使用yaml语法,YAML 是一门标记性语言,专门用来写配…...

web前端之sass中的颜色函数、active按钮激活、hover鼠标悬浮、disabled禁用、scss循环、css

MENU 效果图htmlsassscss编译后的css页面css 效果图 注意查看蓝色按钮。 html <div class"box"><button class"btn type_1">按钮</button><button class"btn type_2">按钮</button><button class"btn ty…...

交通地理信息系统实习教程(二)

这篇文章服务于GIS背景用户以及有志于GIS的朋友 操作源数据位置&#xff1a;【免费】交通地理信息系统实习二源数据资源-CSDN文库 软件安装包位置&#xff1a;【免费】TransCad-交通地理信息系统软件资源-CSDN文库 一、最短路径分析 1.1软件启动说明 这里需要给出一个必要的…...

Shell脚本——批量清理Kubernetes集群中Evicted状态的pod

测试环境有一台宿主机出现了异常&#xff0c;大量的异常日志导致宿主机的磁盘使用率超过了85%&#xff0c;触发了上面的pod驱离策略&#xff0c;该宿主机上的的pod处于Evicted状态。在清理了磁盘之后&#xff0c;得手动处理掉这些Evicted状态的pod。 #!/bin/bash# 获取当前状态…...

(深度估计学习)Win11复现DepthFM

目录 1. 系统配置2. 拉取代码&#xff0c;配置环境3.开始深度预测4.运行结果 论文链接&#xff1a;https://depthfm.github.io/ 讲解链接&#xff1a;https://www.php.cn/faq/734404.html 1. 系统配置 本人系统&#xff1a;Win11 CUDA12.2 python3.11.5 这里附上几个CUDA安装链…...

cocos creator 帧率60 不生效meta50 能刷新到90

环境&#xff1a; cocos creator 2.4.3 华为meta 50 背景&#xff1a; 小游戏 需要在update 里取帧率 发现跟时间对不上 游戏设置60帧 手机上显示 90帧 cc.game.setFrameRate(30) 显示 30帧 cc.game.setFrameRate(60) 显示 90帧 结论&#xff1a; 对于老版本的cocos creator …...

探讨 cs2019 c++ 的STL 库中的模板 conjunction 与 disjunction

&#xff08;1&#xff09;在 STL 库源码中这俩模板经常出现&#xff0c;用来给源码编译中的条件选择&#xff0c;模板的版本选择等提供依据。先给出其定义&#xff1a; 以及&#xff1a; 可以得出结论&#xff1a; conj 是为了查找逻辑布尔型模板参数中的第一个 false &#x…...

【核弹】我的第一款IDEA插件

SuperHotSwap 插件名称叫做&#xff1a;SuperHotSwap&#xff08;超级热更新&#xff09; 开发初心&#xff1a;旨在做出一款最便捷的IDEA热更新插件&#xff0c;减少用户操作步骤&#xff0c;提供零配置的可视化操作更新。 为什么要写这个插件&#xff1a; 每次改一下Mappe…...

【工作篇】软件工程师的知识基础(持续更新)

目录 1. linux 知识篇 1. linux 知识篇 1. Linux API 是什么 Linux API 是指 Linux 操作系统 提供的应用程序接口&#xff0c;用于与操作系统进行交互。它包含了一系列的函数、系统调用、库函数和数据结构&#xff0c;用于实现各种系统级的操作&#xff0c;如文件操作、进程…...

知识付费系统开源方案,教育机构如何利用朋友圈做转介绍?

招生成本高&#xff0c;效果差让许多教育机构头疼不已。对于教育机构来说通过转介绍招生是一个非常有效的途径&#xff0c;那么教育机构如何利用朋友圈做转介绍呢?今天小编就来和大家分享一下。 利用朋友圈做转介绍&#xff0c;主要是通过做活动&#xff0c;来完成增加粉丝、扩…...

c++20 std::reinterpret_cast、std::bit_cast、std::static_cast

std::reinterpret_cast 类型不相关的转换&#xff0c;不安全例如转为&&#xff0c;不支持&#xff0c;要求sizeof相同&#xff1a; uint32_t n32 12345678;//0x00bc614e uint32_t* ptr reinterpret_cast<uint32_t*>(n32);//0x00bc614e uint32_t& ref reinter…...

PHP单独项目启动演示

文章目录 phpstudy得到文件打开phpStudy.exe运行项目 Apache运行后又自动停止 phpstudy 得到文件 一般我们会得到这么一个项目文件&#xff0c;如果外层有“中文路径”&#xff0c;请剪切此内容作为项目根目录即可 打开phpStudy.exe 因为我又正常的编程环境和mysql&#x…...

vscode 通过ssh 远程执行ipynb +可以切换conda env

主要是保证几个点 远程服务器python 环境没问题 conda这些也都有的ssh的账户 是有conda权限的没有免密就输入密码 免密教程就是最基本的那种 公钥copy过去就行了vscode 那几个插件都要装好 开始操作 首先 vscode 点击左侧工具栏中的扩展&#xff0c;搜索“ssh”&#xff0c;…...

ASP.NET银行大厅自助信息系统的开发与实现

摘 要 本毕业设计在基于银行业务大厅现有业务的基础上&#xff0c;针对自助银行的概念和其独有特点&#xff0c;通过.NETSQL技术&#xff0c;开发一个简单的银行大厅自助信息系统&#xff0c;完成一些自助银行的业务需求如帐户信息查询、帐户挂失、自助交费、留言、新闻查询…...

学习Vue3中reactive

学习Vue3中reactive 一、前言1、响应式对象2、对象属性的访问3、嵌套响应式对象4、避免直接修改响应式对象5、ref vs reactive 一、前言 在 Vue 3 中&#xff0c;reactive 是一个用于创建响应式对象的函数。响应式对象是 Vue 3 中数据驱动视图的核心&#xff0c;它们的属性的变…...

【Transformer-BEV编码(10)】CVPR2021 PYVA 第一个明确提到 cross-attention decoder可用于视图转BEV

论文信息 论文名&#xff1a;Projecting Your View Attentively: Monocular Road Scene Layout Estimation via Cross-view Transformation 中文&#xff1a;通过交叉视图变换&#xff08;crossview transform module&#xff09;估计单目道路场景布局 数据集&#xff1a;KITT…...

nestJs中跨库查询

app.module.ts中配置 模块的module中 注意实体类在写的时候和数据库中的表名一样 service中使用一下...

Java编程思想

面向对象编程(OOP)-CSDN博客 面向对象(OOP)的主要特点-CSDN博客 接口(Interface)和抽象类(Abstract Class)编程思想-CSDN博客 接口(Interface)和抽象类(Abstract Class)区别-CSDN博客 抽象类(Abstract Class)-CSDN博客 普通类和抽象类-CSDN博客 内部类编程思想-CSDN博客 …...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...