您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

分布式系统常见理论讲解

时间:2023-07-13 13:43:32  来源:微信公众号  作者: waynaqua

分布式系统是指由多个节点通过网络进行通信和协作的系统,它具有高可用性、高扩展性、高性能等优点,但也面临着一些挑战,如数据一致性、容错性、负载均衡等。为了解决这些问题,分布式系统设计出现了一些经典的理论和方法,如 CAP 理论、BASE 理论、一致性等。

CAP 理论

CAP 理论是指一个分布式系统不可能同时满足以下三个特性:

  • 一致性(Consistency):所有节点访问同一份最新的数据副本
  • 可用性(AvAIlability):每次请求都能获取到非错的响应,不保证获取的数据为最新数据
  • 分区容错性(Partition tolerance):系统在网络分区或故障时仍能继续提供服务

CAP 理论的含义是,在一个分布式系统中,当发生网络分区或故障时,只能在一致性和可用性之间做出权衡,不能同时保证两者。因此分布式系统的设计者需要根据不同的业务场景和需求,选择合适的架构和策略。对于需要强一致性的场景,如银行转账,可以选择 CP 架构,牺牲可用性;对于可以容忍一定程度的数据不一致的场景,如社交网络,面对庞大用户群体要保证可用性,可以选择 AP 架构,牺牲一致性。

BASE 理论

BASE 理论是对 CAP 理论的延伸和补充,它是对大规模分布式系统实践的总结,其核心思想是即使无法做到强一致性(CAP 的一致性是强一致性),但应用可以采用适当的方式来使系统达到最终一致性。BASE 是由 Basically Available(基本可用),Soft state(软状态)和 Eventually consistent(最终一致性)三个短语的缩写。

  • 基本可用(Basically Available):指分布式系统在出现故障时,仍然能够保证核心功能的可用性,但可能会降低服务质量,如响应时间、系统吞吐量等。
  • 软状态(Soft state):指分布式系统中的数据存在中间状态,并且该状态不影响系统整体可用性。软状态主要是由于数据同步存在延时而引起的。
  • 最终一致性(Eventually consistent):指分布式系统中所有节点经过一定时间后,最终能够达到一个一致的状态。最终一致性弱化了对系统实时一致性的要求,允许在特定时间内数据存在不一致。

BASE 理论是对传统事务 ACID 特性(原子性、一致性、隔离性、持久性)的反思和妥协,在牺牲强一致性的前提下,追求更高的可用性和扩展性。

一致性

一致性问题是指在分布式系统中,由于多个节点之间需要通过网络进行通信和协调,而网络本身是不可靠的,可能出现延迟、丢包、重传等现象,导致不同节点上的数据存在不一致或冲突的情况。例如,在一个分布式数据库中,如果一个客户端向一个节点写入了一个新值,而另一个客户端从另一个节点读取了旧值,就出现了一致性问题。一致性问题会影响分布式系统的正确性和可靠性,因此需要采用一些协议和算法来解决。

2PC

两阶段提交(2PC):是一种保证分布式事务强一致性的协议,它将事务的提交过程分为两个阶段:准备阶段和提交阶段。在准备阶段,事务协调者向所有参与者发送准备请求,要求它们执行事务并锁定资源,然后等待它们的响应;在提交阶段,如果协调者收到了所有参与者的同意响应,就向它们发送提交请求,要求它们释放资源并完成事务;如果协调者收到了任何一个参与者的拒绝响应或超时,就向它们发送回滚请求,要求它们释放资源并取消事务。

2PC 的优点是简单和高效,它只需要两个阶段就可以完成事务的提交或回滚,而且可以保证强一致性。2PC 的缺点是容易出现阻塞,如果协调者或参与者在第二阶段发生故障,那么其他节点就无法知道事务的最终状态,只能等待故障恢复或超时。另外 2PC 也会占用较多的资源,因为它需要在第一阶段锁定所有参与者的资源,直到第二阶段结束才释放。

3PC

三阶段提交(3PC):是对 2PC 的改进,它将事务的提交过程分为三个阶段:准备阶段、预提交阶段和提交阶段。在准备阶段,事务协调者向所有参与者发送准备请求,要求它们执行事务并锁定资源,然后等待它们的响应;在预提交阶段,如果协调者收到了所有参与者的同意响应,就向它们发送预提交请求,并进入预提交状态;如果协调者收到了任何一个参与者的拒绝响应或超时,就向它们发送回滚请求,并进入中止状态;在提交阶段,如果协调者收到了所有参与者的确认响应,就向它们发送提交请求,并进入完成状态;如果协调者收到了任何一个参与者的超时或中断消息,就向其余参与者发送回滚请求,并进入中止状态。

3PC 的优点是避免了阻塞,它通过引入一个预提交阶段来降低协调者或参与者在第二阶段发生故障的概率,并且可以在故障发生时快速地进行回滚或提交。3PC 的缺点是增加了网络开销,因为它需要多发送一轮消息,并且需要维护一个超时机制来处理异常情况。而且 3PC 也不能完全保证强一致性。

3PC 强一致性失效是因为它无法处理所有可能发生的异常情况,例如网络分区、协调者故障、参与者故障等。这些异常情况会导致不同的节点之间的信息不同步,从而造成数据或状态的不一致。如果在提交阶段,网络发生了分区,导致协调者和部分参与者与其他参与者失去联系,那么就可能出现不同的分区中有不同的提交决定。这样就会造成数据不一致。

3PC 是一种试图在保证强一致性的同时,避免阻塞和死锁的协议,但是它并不完美,它也有自己的局限性和缺陷。因此在实际的分布式系统中,很少使用 3PC 协议,而是采用其他更先进和通用的一致性算法或协议,如 Paxos 算法、Raft 算法等。这些算法或协议可以容忍任意数量的节点故障,并且可以保证线性一致性或最终一致性。

Paxos

Paxos 算法是由 Leslie Lamport 在 1989 年提出的一种分布式一致性算法,它的目标是在一个由若干个提议者(Proposer)、若干个接受者(Acceptor)和若干个学习者(Learner)组成的系统中,选择一个值作为共识结果。Paxos 算法分为两个子过程:基本 Paxos 和多数派 Paxos。

基本 Paxos 是指在一个由若干个提议者和若干个接受者组成的系统中,选择一个值作为共识结果。基本 Paxos 的过程如下:

  • 首先,每个提议者选择一个提案编号(Proposal Number)和一个提案值(Proposal Value),并向所有接受者发送 Prepare 消息;
  • 然后,每个接受者收到 Prepare 消息后,如果提案编号大于它之前看到的任何编号,就回复 Promise 消息,并承诺不再接受任何编号小于该值的提案;否则,就忽略该消息;
  • 接着,每个提议者收到多数接受者的 Promise 消息后,从中选择一个最大的已接受提案值(如果存在),作为自己的提案值,并向所有接受者发送 Accept 消息;
  • 最后,每个接受者收到 Accept 消息后,如果提案编号仍然大于等于它之前承诺的值,就回复 Accepted 消息,并接受该提案值;否则,就忽略该消息。当多数接受者都回复 Accepted 消息时,该提案值就被选为共识结果。

多数派 Paxos 是指在一个由若干个提议者、若干个接受者和若干个学习者组成的系统中,选择一个值作为共识结果。多数派 Paxos 的过程如下:

  • 首先,每个提议者选择一个提案编号和一个提案值,并向一个领导者(Leader)发送 Propose 消息;
  • 然后,领导者收集所有提议者的 Propose 消息,并从中选择一个最大的提案编号和一个任意的提案值,作为自己的提案,并向所有接受者发送 Prepare 消息;
  • 接着,每个接受者收到 Prepare 消息后,如果提案编号大于它之前看到的任何编号,就回复 Promise 消息,并承诺不再接受任何编号小于该值的提案;否则,就忽略该消息;
  • 最后,领导者收到多数接受者的 Promise 消息后,向所有学习者发送 Learn 消息,并通知它们共识结果。当多数学习者都收到 Learn 消息时,该提案值就被选为共识结果。

Paxos 算法的优点是简洁和高效,它只需要两轮消息就可以完成一个值的共识,并且可以保证线性一致性。Paxos 算法的缺点是难以理解和实现,它涉及到多个角色和多个子过程,并且需要处理各种可能发生的情况。Paxos 算法也不适用于动态变化的系统,因为它需要预先知道所有节点的数量和身份。

Raft

Raft 算法是由 Diego Ongaro 和 John Ousterhout 在 2013 年提出的一种分布式一致性算法,它的目标是在一个由若干个节点组成的系统中,选择一个领导者,并通过领导者来维护系统的状态。Raft 算法将系统分为领导者、跟随者和候选者三种角色,并且通过心跳和日志复制来维持系统的状态。

Raft 算法的过程如下:

  • 首先,所有节点都以跟随者的身份启动,如果一个跟随者在一段时间内没有收到领导者的心跳消息,就认为领导者已经失效,并转变为候选者,开始发起选举;
  • 然后,每个候选者向其他节点发送投票请求,并为自己投票,如果一个候选者收到了多数节点的投票,就成为新的领导者,并向其他节点发送心跳消息;如果一个候选者收到了另一个候选者或领导者的消息,就放弃选举,并转变为跟随者;
  • 接着,每个领导者负责接收客户端的请求,并将其作为日志条目追加到自己的日志中,然后向其他节点发送日志复制请求,要求它们将日志条目写入自己的日志中;
  • 最后,每个跟随者收到日志复制请求后,如果日志条目与自己的日志匹配,就将其写入自己的日志中,并回复确认消息;否则,就回复拒绝消息。当一个领导者收到了多数节点的确认消息后,就将该日志条目标记为已提交,并应用到自己的状态机中;然后向其他节点发送提交通知,要求它们也将该日志条目应用到自己的状态机中。

Raft 算法的优点是易于理解和实现,它将系统分为三种角色,并且通过心跳和日志复制来维持系统的状态。Raft 算法的缺点是可能存在较高的网络开销,因为它需要频繁地发送心跳消息,并且需要同步所有节点的日志。Raft 算法也不适用于高并发的场景,因为它只允许一个领导者来处理所有的请求。

EasyRetry

在上面讲解了常见的一致性协议和算法后,博主这里介绍一个开源的分布式一致性解决方案 EasyRetry。

EasyRetry 是一款基于 BASE 思想实现的分布式服务重试组件,旨在通过重试机制确保数据的最终一致性。它提供了控制台任务观测、可配置的重试策略、重试后执行回调以及丰富地告警配置等功能。通过这些手段,可以对异常数据进行全面监测和回放,从而在确保系统高可用性的同时,大大提升数据的一致性。

核心优势

数据持久化

对于系统中核心场景的数据安全是非常重要的保障手段, 基于内存重试策略(目前业界比较比较出名的 SpringRetry 或者 GuavaRetry 都是基于内存重试实现的)数据的持久性得不到保障, EasyRetry 提供了本地重试、服务端重试、本地重试和服务端重试相结合三种重试模式。EasyRetry 的本地重试方案依然保留了内存重试的策略,应对短暂不可用场景下的快速补偿。服务端重试则实现了数据的持久化,支持多种数据库配置。用户可以通过控制台管理异常数据,自定义多种配置,便捷地完成数据补偿操作。

基于补偿机制保证分布式事务

图片

在分布式系统里,我们可以使用 EasyRetry 来捕获和处理异常数据,将不同系统产生的异常数据集中到 EasyRetry 的控制台进行配置和管理。通过 EasyRetry,我们可以自定义重试策略和触发时间。当重试任务执行成功或达到系统配置的最大执行次数时,服务端会向客户端发送回调请求。在接收到回调请求后,客户端可以指定后续动作。举例来说,当服务端发起重试达到最大请求次数但仍然失败时,客户端可以执行回滚操作,确保事务的完整性。通过灵活配置回调请求的处理方式,我们可以根据具体业务需求进行相应的处理操作。

避免重试风暴

重试操作可以更加轻量化低成本的保障数据一致性,但是带来的风险也不容忽视,那就是重试风暴。EasyRetry 支持多种方式防止重试风暴的产生比如单机流量管控、跨集群链接管控和可视化数据管控等。

图片

接入简单

EasyRetry 和 SpringRetry 一样的都是基于注解实现,只需要添加一个@Retryable 即完成接入,具体的接入方式可参考接入指北

配置多样化

EasyRetry 控制台提供了多样化的参数配置,包括路由策略、Id 生成模式、分区指定、退避策略、最大重试次数、告警通知等。满足用户在不同场景下的配置需求。

可扩展性

EasyRetry 预留了大量自定义场景,如重试结果处理器、自定义方法执行器、幂等 ID 生成器等模块,为用户预留了可扩展空间,可根据系统需求满足不同场景下的使用需要。

最后

最后感谢您的阅读,希望本文讲解内容能对你有所帮助。



Tags:分布式系统   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
负载均衡在大规模分布式系统中的应用:解决性能瓶颈
随着互联网的快速发展,大规模分布式系统在各行各业得到了广泛应用。这些系统需要处理大量的请求和数据,面临着性能瓶颈的挑战。负载均衡作为一种关键的技术手段,可以帮助大规模...【详细内容】
2023-11-14  Search: 分布式系统  点击:(298)  评论:(0)  加入收藏
分布式系统中的数据访问设计模式
在大多数具有简单查询的单体系统中,所有必要的数据可以在单个数据库调用中检索。然而,当数据分散到由不同服务拥有的单独的数据库或模式中时,读操作的数据访问开始变得困难。示...【详细内容】
2023-11-07  Search: 分布式系统  点击:(317)  评论:(0)  加入收藏
如何为分布式系统设计数据库
译者 | 李睿审校 | 重楼数据库设计是微服务和云原生解决方案中的一个关键因素,因为基于微服务的架构会导致出现分布式数据。多个进程可以操作数据,而不是在单个进程中进行数据...【详细内容】
2023-10-16  Search: 分布式系统  点击:(199)  评论:(0)  加入收藏
数据复制:构建大规模分布式系统的关键组成部分
数据复制对于构建可靠的大规模分布式系统至关重要。在本期中,我们将探讨常见的复制策略以及选择合适策略的关键因素。在本期中,我们将以数据库为例进行讨论。请注意,复制不仅适...【详细内容】
2023-09-13  Search: 分布式系统  点击:(297)  评论:(0)  加入收藏
EasyNetQ库:让你的分布式系统消息开发快人一步!
EasyNetQ库是一款优秀的消息传递库,它提供了易用性高、可扩展性强、性能高效的特点,被广泛应用于分布式系统中的事件驱动架构、微服务和高并发下的任务队列等场景。然而,对于不...【详细内容】
2023-08-28  Search: 分布式系统  点击:(279)  评论:(0)  加入收藏
Raft算法:保障分布式系统共识的稳健之道
Raft算法是一种简洁而高效的分布式一致性算法,通过引入Leader选举和日志复制的机制,确保了分布式系统的共识和一致性。它具有易于理解和实现的优点,被广泛应用于各种分布式系统...【详细内容】
2023-08-03  Search: 分布式系统  点击:(367)  评论:(0)  加入收藏
分布式系统中的CAP理论
对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统中...【详细内容】
2023-08-03  Search: 分布式系统  点击:(231)  评论:(0)  加入收藏
分布式系统常见理论讲解
分布式系统是指由多个节点通过网络进行通信和协作的系统,它具有高可用性、高扩展性、高性能等优点,但也面临着一些挑战,如数据一致性、容错性、负载均衡等。为了解决这些问题,分...【详细内容】
2023-07-13  Search: 分布式系统  点击:(173)  评论:(0)  加入收藏
分布式系统设计中的并发访问解决方案
在分布式环境中,操作互斥性问题和幂等性问题非常普遍。经过分析,我们找出了解决这两个问题的基本思路和实现原理,并给出了具体的解决方案。0、引言随着互联网信息技术的飞速发...【详细内容】
2023-05-18  Search: 分布式系统  点击:(383)  评论:(0)  加入收藏
在分布式系统中,SpringBoot 实现接口幂等性
在分布式系统中,接口幂等性是一个非常重要的概念,它保证了在同样的条件下,同一请求的多次执行所产生的效果都是相同的。在实际开发中,为了防止重复提交或者重复操作带来的问题,我...【详细内容】
2023-03-07  Search: 分布式系统  点击:(219)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(10)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条