前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >分布式系统设计模式和一致性协议,你用过哪些?

分布式系统设计模式和一致性协议,你用过哪些?

作者头像
码哥字节
发布于 2023-01-04 06:24:21
发布于 2023-01-04 06:24:21
6590
举报
文章被收录于专栏:Java 技术栈Java 技术栈

1、布隆过滤器

Bloom过滤器是一种节省空间的概率数据结构,用于测试元素是否为某集合的成员。它用于我们只需要检查元素是否属于对象的场景。

在BigTable(和Cassandra)中,任何读取操作都必须从组成Tablet的SSTable中读取。如果这些SSTable不在内存中,则读取操作可能最终会执行许多磁盘访问以便读取所需的SSTable。为了减少磁盘访问次数,BigTable 使用Bloom过滤器。

2、一致性哈希

一致的哈希允许您轻松扩展,从而允许以有效的方式复制数据,从而实现更好的可用性和容错能力。

通过对数据项的键进行哈希处理以产生其在环上的位置,然后顺时针遍历环以查找位置大于该项位置的第一个节点,将每个由键标识的数据项分配给节点。与节点关联的节点是数据项的位置。

一致散列的主要优点是增量稳定性;节点离开或到达集群仅影响其直接邻居,其他节点不受影响。

3、Quorum

在分布式环境中,quorum是在确认操作成功之前需要成功执行此分布式操作的最小服务器数。

Cassandra,为了确保数据一致性,每个写入请求都可以配置为仅当数据已写入至少一个quorum(或大多数)副本节点时才成功。

对于领导者选举,Chubby使用Paxos,它使用quorum来确保强大的一致性。

Dynamo 将写入复制到系统中其他节点的草率quorum,而不是像Paxos那样的严格多数quorum。所有读/写操作都在首选项列表中的第一个NN正常节点上执行,该节点可能并不总是在遍历一致哈希环时遇到的第一个NN节点。

4、领导者(Leader)和追随者(Follower)

为了在管理数据的系统中实现容错,需要在多个服务器上复制数据。

在集群中选择一个服务器作为领导者。领导者负责代表整个集群做出决策,并将决策传播到所有其他服务器。

三到五个节点的集群,就像在实现共识的系统中一样,领导者选举可以在数据集群本身内实施,而不依赖于任何外部系统。领导者选举在服务器启动时进行。每个服务器在启动时都会启动领导者选举,并尝试选举领导者。除非选出领导者,否则系统不接受任何客户端请求。

5、心跳

心跳机制用于检测现有领导者是否失败,以便可以启动新的领导者选举。

6、Fencing

在领导者-追随者模式中,当领导者失败时,不可能确定领导者已停止工作。例如,慢速网络或网络分区可能会触发新的领导者选举,即使前一个领导者仍在运行并认为它仍然是活动的领导者。

屏蔽是指在以前处于活动状态的领导者周围设置围栏,使其无法访问集群资源,从而停止为任何读/写请求提供服务。

使用以下两种技术:

  • 资源屏蔽:系统会阻止以前处于活动状态的领导者访问执行基本任务所需的资源。
  • 节点屏蔽:系统会阻止以前处于活动状态的领导者访问所有资源。执行此操作的常见方法是关闭节点电源或重置节点。

7、WAL(预写日志Write-ahead Log)

预写日志记录是解决操作系统中文件系统不一致的问题的高级解决方案。受数据库管理系统的启发,此方法首先将要执行的操作的摘要记入“日志”中,然后再将其实际写入磁盘。在发生崩溃的情况下,操作系统只需检查此日志并从中断的位置继续。

8、分段日志

将日志拆分为多个较小的文件,而不是单个大文件,以便于操作。

单个日志文件在启动时读取时可能会增长并成为性能瓶颈。较旧的日志会定期清理,并且很难对单个大文件执行清理操作。

单个日志拆分为多个段。日志文件在指定的大小限制后滚动。使用日志分段,需要有一种将逻辑日志偏移量(或日志序列号)映射到日志段文件的简单方法。

9、高水位线(High-Water mark)

跟踪领导者上的最后一个日志条目,该条目已成功复制到追随者的quorum。日志中此条目的索引称为高水位线索引。领导者仅公开到高水位线索引的数据。

Kafka:为了处理非可重复读取并确保数据一致性,Kafka broker会跟踪高水位线,这是特定分区的最大偏移量。使用者只能看到高水位线之前的消息。

10、租约(Lease)

租约就像一个锁,但即使客户端离开,它也能工作。客户端请求有限期限的租约,之后租约到期。如果客户端想要延长租约,它可以在租约到期之前续订租约。

Chubby客户端与领导者保持有时限的会话租约。在此时间间隔内,领导者保证不会单方面终止会话。

11、Gossip协议

Gossip协议是点对点通信机制,其中节点定期交换有关自己和他们所知道的其他节点的状态信息。

每个节点每秒启动一轮Gossip回合,以与另一个随机节点交换有关自己和其他节点的状态信息。

12、Phi 累计故障检测(Phi Accrual Failure Detection)

此算法使用历史检测信号信息使阈值自适应。通用的应计故障检测器不会判断服务器是否处于活动状态,而是输出有关服务器的可疑级别。

Cassandra使用Phi应计故障检测器算法来确定群集中节点的状态。

13、脑裂

分布式系统具有两个或多个活动领导者的场景称为脑裂。

通过使用生成时钟(Generation Clock)可以解决脑裂问题,生成时钟只是一个单调递增的数字,用于指示服务器的生成。

每次选出新领导者时,时钟数字(generation number)都会增加。这意味着,如果旧领导者的时钟数为“1”,则新领导人的时钟数将为“2”。此时钟号包含在从领导发送到其他节点的每个请求中。通过这种方式,节点现在可以通过简单地信任具有最高数字的领导者来轻松区分真正的领导者。

Kafka:为了处理脑裂(我们可以有多个active controller broker),Kafka使用“纪元数”(Epoch number),这只是一个单调增加的数字来表示服务器的代次(generation)。

HDFS:ZooKeeper用于确保任何时候只有一个NameNode处于活动状态。epoch编号作为每个事务ID的一部分进行维护,以反映NameNode的代次。

14、校验和(checksum)

在分布式系统中,在组件之间移动数据时,从节点获取的数据可能会损坏。

计算校验和并将其与数据一起存储。

要计算校验和,请使用MD5、SHA-1、SHA-256或SHA-512等加密哈希函数。哈希函数获取输入数据并生成固定长度的字符串(包含字母和数字);此字符串称为校验和。

当系统存储某些数据时,它会计算数据的校验和,并将校验和与数据一起存储。当客户端检索数据时,它会验证从服务器接收的数据是否与存储的校验和匹配。如果没有,则客户端可以选择从另一个副本检索该数据。

HDFS和Chubby将每个文件的校验和与数据一起存储。

15、CAP定理

CAP定理指出,分布式系统不可能同时提供以下所有三个理想属性:

一致性(C)、可用性(A)和分区容差(P)。

根据CAP定理,任何分布式系统都需要从三个属性中选择两个。这三个选项是CA、CP和AP。

Dynamo:在CAP定理术语中,Dynamo属于AP系统的类别,旨在牺牲强一致性为代价实现高可用性。

BigTable:就CAP定理而言,BigTable是一个CP系统,即它具有严格一致的读取和写入。

16、PACELEC定理

PACELC定理指出,在复制数据的系统中:

  • 如果有一个分区('P'),分布式系统可以在可用性和一致性(即'A'和'C')之间进行权衡;
  • 否则('E'),当系统在没有分区的情况下正常运行时,系统可以在延迟('L')和一致性('C')之间进行权衡。

定理(PAC)的第一部分与CAP定理相同,ELC是扩展。整个论点假设我们通过复制来保持高可用性。因此,当失败时,CAP定理占上风。但如果没有,我们仍然必须考虑复制系统的一致性和延迟之间的权衡。

17、提示交接(Hinted Handoff)

如果节点关闭,系统会保留它们错过的所有请求的提示(或注释)。故障节点恢复后,将根据存储的提示将请求转发给它们。

当节点关闭时,领导者会在本地磁盘上的文本文件中写入提示。此提示包含数据及其所属的节点信息。当领导者意识到它为其保留提示的节点已恢复时,它会将每个提示的写入请求转发到该节点。

18、读取时修复

在分布式系统中,数据跨多个节点复制,某些节点最终可能会拥有过时的数据。

在读取操作期间修复过时的数据,因为此时,我们可以从多个节点读取数据以进行比较并找到具有过时数据的节点。此机制称为读取修复。一旦已知具有旧数据的节点,读取修复操作就会将较新版本的数据推送到具有较旧版本的节点。

Cassandra和Dynamo使用“读取修复”将最新版本的数据推送到具有旧版本的节点。

19、默克尔树(Merkle Trees)

“读取修复”可在处理读取请求时消除冲突。但是,如果某个副本明显落后于其他副本,则可能需要很长时间才能解决冲突。

副本可以包含大量数据。单纯地拆分整个范围来计算校验和进行比较并不是很可行;有太多的数据需要传输。相反,我们可以使用Merkle树来比较一个范围的副本。

Merkle树是哈希的二叉树,其中每个内部节点是其两个子节点的哈希,每个叶节点是原始数据一部分的哈希。

比较Merkle树在概念上很简单:

  • 比较两个树的根哈希。
  • 如果它们相等,请停止。
  • 在左边和右边的孩子上递归检查。

为了实现反熵和在后台解决冲突,Dynamo使用Merkle树。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码哥字节 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
六个高Star开源项目,让你更懂OAuth和单点登录
现在大部分的网络应用,登录、注册、密码加密保存、token 管理等功能都是必要的。为了让用户的隐私更能得到保障,使用起来更方便,OAuth 协议和单点登录系统也就应运而生。今天 Gitee 介绍的六款开源项目就是针对开发者的此类需求,通过学习开源项目,来让自己的技术更精进。
MaxKey单点登录开源官方
2023/02/16
2.9K0
推荐一个很牛叉的开源Flask项目
各位小伙伴们好,今天主要给大家推荐一个我近期遇到的一个Flask项目。为什么推荐?当然是很牛逼的才敢拿出来。
Python进击者
2020/07/27
8.8K0
毕设有着落了!一套开源的,基于SpringBoot的车牌识别系统
这个项目是良月柒在逛社区时发现的,刚看到它,思绪直接被拉回了几年前,当初有同学的毕设就是停车场管理系统,关键的功能——车牌识别,连硬件都整上了,一整套流程跑下来,pretty......
良月柒
2020/08/07
1.8K0
15 个优秀开源的 Spring Boot 学习项目,一网打尽!
Spring Boot 算是目前 Java 领域最火的技术栈了,松哥年初出版的 《Spring Boot + Vue 全栈开发实战》迄今为止已经加印了 8 次,Spring Boot 的受欢迎程度可见一斑。经常有人问松哥有没有推荐的 Spring Boot 学习资料?当然有!买松哥书就对了,哈哈。除了书呢?当然就是开源项目了,今天松哥整理了 15 个优质 Spring Boot 开源项目给大家参考,希望能够帮助到正在学习 Spring Boot 的小伙伴!小伙伴简历中不知道写什么项目的或者项目没有亮点的,我只能帮你们到这了!
江南一点雨
2019/12/03
2.6K0
15 个优秀开源的 Spring Boot 学习项目,一网打尽!
记录一次关于python-flask蓝图的坑
Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask使用BSD授权。 Flask被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。
一只特立独行的兔先生
2020/04/02
4.4K0
Pear Admin FLask非常好用的、开源Python后台管理系统
flask 2.0.1 + flask-sqlalchemy + 权限验证 + Flask-APScheduler 定时任务 + marshmallow 序列化与数据验证
用户8949263
2023/08/22
6.7K0
Pear Admin FLask非常好用的、开源Python后台管理系统
推荐5款开源报表工具下载_开源报表系统
小编最近发现几款不错的开源报表,还提供源码,现在给大家分享一下,希望能给你带来帮助!
全栈程序员站长
2022/11/01
3.5K0
推荐5款开源报表工具下载_开源报表系统
12款人气开源项目推荐;工作、私活轻松搞
mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。
一行Java
2022/04/07
2.3K0
12款人气开源项目推荐;工作、私活轻松搞
工具 | Python Web 开发的十个框架
Python 是一门动态、面向对象语言。其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性。除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还自带服务器。 其它方面,Python拥有足够多的免费数据函数库、免费的Web网页模板系统、还有与Web服务 器进行交互的库、这些都可以设计到你的Web应用程序里面。 这篇文章列举了十个Python Web应用开发框架,不过因为Django似乎人尽皆知的样子,没有列在文中。。 CubicWeb CubicWeb的
CDA数据分析师
2018/02/05
1.6K0
工具 | Python Web 开发的十个框架
有哪些好的C#开源项目推荐?
链接:https://www.zhihu.com/question/27993498/answer/1014561869
JusterZhu
2022/12/07
2.7K0
有哪些好的C#开源项目推荐?
给大家推荐8个SpringBoot精选项目
2017年,曾在自己的博客中写下这样一段话:有一种力量无人能抵挡,它永不言败生来倔强。有一种理想照亮了迷茫,在那写满荣耀的地方。
小柒2012
2018/08/28
4360
给大家推荐8个SpringBoot精选项目
在线教育风口已来,这几个开源项目不能错过 | Gitee 项目推荐
由于疫情严重,全国学生全部推迟了开学时间,但是停课不停学,许多学校都已经开始了线上课程。对于线上教育行业来说,这也是一次发展壮大的机会。线上教育想要积累稳定的客户来源,拥有一个稳定、可维护的线上教育平台是基础。Gitee 上也有很多关于在线教育的开源项目,比如下面这五个,一起来看看吧。
后端码匠
2020/02/25
5.8K0
热门开源Web开发框架推荐
有的人认为这是一种“拿来主义”的傲慢体现,因为你不造自己的轮子,就会缺乏核心技术,由此将一直受限,创新力也大幅度下降,发展空间将会一直被“卡脖子”,从而陷入落后于率先造轮者的步伐;而也有一部分人认为这是一种卓越的工作方式,他们认为并非每个人都能原创出核心的技术,也并非每个程序员都能成为项目的架构师或技术大牛,不重复造轮,而是拿到一个框架,在上面进行二次开发然后拿来去用,学习过程中也提高了效率,这不是什么不屑一顾的事。
用户10216580
2022/12/06
7650
热门开源Web开发框架推荐
国内 Top 开源项目深度解读
最受欢迎的国产开源项目都是什么模样?选用什么开源协议?使用哪种语言?实现了什么功能? 我们选取了码云 Gitee.com 平台 144 个优质开源项目,为你深入剖析国内 Top 开源项目。 (项目选取
码云Gitee
2018/07/05
1.1K0
【程序源代码】基于Python的Flask WEB框架实现后台权限管理系统
今天这篇文章主要是介绍:基于Python的Flask WEB框架实现后台权限管理系统
程序源代码
2020/06/04
3.3K0
七个开源的 Spring Boot 前后端分离项目,一定要收藏!
原文链接:https://blog.csdn.net/u012702547/article/details/100973824
ccf19881030
2019/10/22
1.4K0
七个开源的 Spring Boot 前后端分离项目,一定要收藏!
Git重磅推荐!5 款强大的开源报表工具
小编最近发现几款不错的开源报表,还提供源码,现在给大家分享一下,希望能给你带来帮助!
乔戈里
2021/01/08
1.4K0
Git重磅推荐!5 款强大的开源报表工具
Flask构建微电影(一) 第一章、项目介绍第二章、环境搭建
第一章、项目介绍  1.1.前言           本教程我将带领大家如何使用flask框架开发微电影网站。Flask是python中最受欢迎的轻量级web框架,flask扩展丰富,冗余度小,可自由选择组合各种插件,性能优越。 相比其他web框架十分轻量级,其优雅的设计哲学,易于学习掌握。小型项目快速开发,大型项目毫无压力。由于flask灵活开发的特点,python高手都会青睐flask,正基于 此,它被许多公司应用在项目开发中,成为很多创业公司以及个人创业者门追捧的web开发框架,本教程主要使用fl
zhang_derek
2018/05/30
1.8K0
Python库大全,建议收藏留用!
学Python,想必大家都是从爬虫开始的吧。毕竟网上类似的资源很丰富,开源项目也非常多。 Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 当我们在浏览器中输入一个url后回车,后台会发生什么? 简单来说这段过程发生了以下四个步骤: 查找域名对应的IP地址。 向IP对应的服务器发送请求。 服务器响应请求,发回网页内容。 浏览器解析网页内容。 那么学习爬虫需要掌握哪些库呢? 通用: urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库(基于pycurl)。
小小科
2018/06/20
1.9K0
GVP 特辑!PHP 老司机力荐的 6 款实战项目 | 码云周刊第 40 期
GVP 特辑 有数据显示,全球前100万的站点中,有超过70%的站点是使用 PHP 开发的。面对如此流行的编程语言,我们如何才能更有效率的学习?今天小编特意从我们 GVP(Gitee Most Va
码云Gitee
2018/03/29
1.4K0
GVP 特辑!PHP 老司机力荐的 6 款实战项目 | 码云周刊第 40 期
推荐阅读
相关推荐
六个高Star开源项目,让你更懂OAuth和单点登录
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档