分布式架构的必问理论

news2024/12/26 11:48:59

基础理论:

CAP理论:

CAP理论是分布式系统设计中最基础、也是最为关键的理论,它指出,分布式数据存储不可能同时满足以下三个条件。

  1. 一致性(Consistency):每次读取要么获得最近写入的数据,要么获得一个错误。
  2. 可用性(Avaliability):每次请求都能获得一个非错误的响应,但是不能保证返回的是最新写入的数据。
  3. 分区容忍(Partition tolerance):尽管任意数量的消息被节点间的网络丢失或者被延迟了,系统仍然可用运行。

也就是说,CAP定理表明,在存在网络分区的情况下,一致性和可用性必须二选一。而在没有网络故障的情况下,即分布式系统正常运行时,一致性和可用性是可以被同时满足的。这里需要注意的是,CAP定理中的一致性与ACID数据库的事务中的一致性不一样。

掌握CAP定理,能够正确的理解C、A、P的含义,对于系统架构来说非常重要。因为对于分布式系统来说,网络的故障在所难免的,如何在出现网络错误的时候,能够维持系统按照正常的行为逻辑运行就显得尤为重要了。具体的情况可以根据系统的实际业务需求来做相关的权衡。

举例说明,对于大多数互联网应用来说,因为机器数量庞大,部署的节点分散,网络故障是正常的情况,可用性就必须是要保证的,所以只能舍弃一致性来保证服务的AP。而对于银行、证券来说,需要保证一致性的场景,通常会权衡CA和CP的模型,CA模型网络故障时完全不可用,CP模型具备部分的可用性。

CA(Consistency+avaliability)

这样的系统关注一致性和可用性,需要非常严格的全体一致性的协议,比如说“两阶段提交”(2PC)。CA系统不能够容忍网络错误或者说节点错误,一旦出现这样的问题,整个系统就会拒绝写请求,因为它并不清楚对面的那个节点是否已经不能工作了,还是说只是网络的问题。唯一安全的做法就是把自己变成只读的。

CP(consistency+partition tolerance)

这样的系统关注一致性和分区容忍性。它关注的是系统里面大多数人的一致性协议,比如说Paxos算法。这样的系统只需要保证大多数节点的数据一致,而少数的节点会在没有同步到最新版本的数据时变成不可用的状态。这样能够提供一部分的可用性。

AP(availability+partion tolerance)

这样的系统来说,关心可用性和分区容忍性,因此,这样的系统就不能达成一致性,需要给出数据冲突,给出数据冲突就需要维护数据版本,Dynamo就是这样的系统。

然而,还有一些人会错误的认为CAP定理,甚至误用这个定理。

在设计分布式框架的时候一定要仔细思考下面这八种说法是错误的:

  1. 网络是稳定的
  2. 网络传输的延迟是零
  3. 网络的带宽是无穷大的
  4. 网络是安全的
  5. 网络的拓扑不会改变
  6. 只有一个系统管理员
  7. 传输数据的成本为零
  8. 整个网络是同构的

这八个错误的说法可以让我们可以更加清晰的认识到,在分布式系统中的错误是不可能避免的,我们要做的不是避免错误,而是把错误的处理当成功能写在代码中。错误出现的时候,也要保住系统的运行。

失败和时间(Failure and Time)。

分布式系统工程师面临的很多困难都可以归咎于两个根本问题:

  1. 进程可能会失败
  2. 没有好的方法表明进程失败,这就涉及到如何设置系统的时钟,以及进程之间的通讯机制,在没有任何共享时钟的情况下,如何确定一个事件发生在另一个事件中。

容错的压力(The basic tension of fault tolerance)。

能在不降级的情况下容错的系统一定要像没有错误发生那样运行。这就意味着,系统的某些部分必须冗余的工作,从而在性能和资源消耗两个方面带来成本。

基于原语(Basic primitives)

在分布式系统中几乎没有一致认同的基本构建模块,但是目前在越来越多地出现,比如Leader选举,分布式状态机复制处理。

基本结论(Fundamental Results)

某些事实是需要吸收理解的,有几点,如果进程之间可能丢失某些信息,那么不可能在实现一致性存储的同时响应所有的请求,这就是CAP定理;一致性不可能同时满足以下的条件

  1. 总是正确
  2. 在异步系统中只要有一台机器发生故障,系统总是能终止运行;

一般而言,消息交互少于两轮都不可能达成共识(Consensus).

真实系统(Real System)

学习分布式系统架构最重要的是,结合一些真实系统的描述,反复思考和点评其背后的设计决策,如谷歌GFS、Spanner、Chubby等。

FLP Impossibility Result

FLP 不可能性的名称起源于它的三围作者。Fischer、Lynch和Paterson。理论的主要思想是能作出的功能最强的共识算法会受到怎样的限制的讨论。

所谓共识的问题,就是让网络上的分布式处理者最后都对同一个结果值达成共识。该解决方案对错误有恢复能力,处理者一旦崩溃以后,就不再参与计算了。在同步环境下,每个操作步骤的时间和网络通信的延迟都是有限的,要解决共识问题是可能的,方式是:等待一个完整的步长来检测某个处理者是否已经失败了。如果没有收到回复的话,那就假定它已经崩溃了。

共识问题有几个变种,他们在强度方面有所不同,通常一个更强问题的解决方案同时也能解决比该问题更弱的问题,共识问题的一个较强的形式如下,假定前提条件是“给出一个处理者的集合,其中每一个处理者都有一个初始值”:

  1. 所有无措的进程最终都将决定一个值
  2. 所有会做决定的无错误的进程决定的都是同一个值
  3. 最终被决定的值必须被至少一个进程提出过

这三个特性分别被称为“终止”、“一致同意”和“有效性”。任何一个具备这三点特性的算法都被认为是解决了共识的问题。

FLP不可能性则讨论了异步模型下的情况,主要结论有两条。

  1. 在异步模型下不存在一个完全正确的共识算法。不仅上述较强的形式共识算法不可能实现,FLP还证明了比他弱一些的、只需要有一些无错误的进程做决定就足够的共识算法也是不可能实现的。
  2. 在异步模型下存在一个部分正确的共识算法,前提是所有无错误的进程都总能作出一个决定,此外没有进程会在他的执行过程中死亡,并且初始情况下超过半数进程都是存活的状态。

FLP的结论是,在异步模型中,仅一个处理者可能崩溃的情况下,就已经没有分布算法能解决共识的问题。这是该问题理论上界限。其背后的原因在于,异步模型下对于一个处理者完成工作然后再回复消息所需的时间没有上限。因此,无法判断出一个处理者到底是崩溃了,还是在较长的时间来回复,或者是网络有很大的延迟。

FLP不可能性对我们还有其他的启发。一个是网络延迟很重要,网络不能长时间处理拥塞的状态,否则的话共识算法将可能因为网络延迟过长导致超时失败。二是计算时间也很重要。对于需要计算共识的处理过程(进程)。如分布式数据库的提交来说,需要在短时间里面就计算出能否提交的结果,那就要保证计算结点资源充分,特别是内存容量、磁盘空闲时间和CPU时间方面要足够,并且在软件层面确保计算不超时。

另一个问题,像Paxos这样的共识算法为什么可行?实际上它并不属于FLP不 可能性证明所说的“完全正确”的算法,它的正确性会受到超时值的影响。但是并不妨碍它在实践中有效,因为我们可以通过避免网络拥塞等手段来保证超时值是合适的。

An introduction to distributed system

分布式系统基础课的提纲,也是一份很好的分布式系统介绍,几乎涵盖了所有的知识点,并辅简洁并且切中要害的说明文字,非常适合初学者提纲挈领地了解知识全貌,快速与现有知识结合,形成知识体系。

 

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

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

相关文章

OAuth2 (二)

目录 创建项目结构 父工程 客户 认证服务器 资源拥有者 资源服务器 创建项目结构 演示代码下载: https://gitee.com/lisenaq/oauth2-example.git 演示客户发请求: http://localhost:8080/client/getCode 父工程 父工程有:子模块需要重新导入该…

CVE-2022-34916 Apache Flume 远程代码执行漏洞分析

项目介绍 Apache Flume 是一个分布式的,可靠的,并且可用于高效地收集,汇总和移动大量日志数据的软件。它具有基于流数据流的简单而灵活的体系结构。它具有可调的可靠性机制以及许多故障转移和恢复机制,并且具有健壮性和容错性。它…

Spring/SpringBoot/SpringCloud面试题

SpringBoot和SpringMVC的区别 形式上:SpringBoot是一个自动化配置的工具;SpringMVC是一个web框架在搭建项目时:SpringMVC需要手动配置xml文件,同时需要配置Tomcat服务器。而SpringBoot采用约定大于配置的方式,进行自动…

【Linux系统】第五篇:Linux中编译器gcc/g++的使用

文章目录一、编译工具gcc/g二、程序编译的过程🎄预处理🎄编译🎄汇编🎄链接三、动态链接和静态链接🌻动态链接🌻静态链接🌻 程序动、静态链接的区分一、编译工具gcc/g gcc/g 分别是 C/C 的编译器…

【wp】hgame2023 week3 RePwn

【wp】hgame2023 week3 Re&&Pwn Re cpp那个chacha20加密不会。 kunmusic 用dnspy逆dll,在Program的Main方法中找到了初始化的数据 下断点执行,拷贝出data 写一份脚本进行data与104的异或 def step_one():with open("./data", enc…

发明专利申请流程资料

​发明专利申请流程 依据专利法,发明专利申请的审批程序分为: 1、受理阶段 2、初步审查阶段 3、公布阶段 4、实质审查阶段 5、授权阶段 发明专利申请所需资料 1、发明专利请求书。 2、说明书。 3、权利要求书。 4、说明书摘要。 5、有附图的可同时提交说…

Actionchains在selenium中的使用方法

今天分享一下selenium最常用的ActionChains的使用,以及碰到的一些问题的解决。 1.selenium解决鼠标悬停的问题 今天抓取某个平台的数据时发现有的数据需要鼠标悬停在上面才能加载出来,于是就想到了使用ActionChains解决悬停的问题,下面是思…

计算机组成原理 | 第九章:控制单元的功能 | 微操作命令 | 时钟周期

文章目录📚微操作命令的分析🐇取指周期🐇间址周期🐇执行周期🥕非访存指令🥕访存指令⭐️🥕转移指令🐇中断周期📚控制单元的功能🐇控制单元的外特性&#x1f9…

分享微信报名小程序怎么做_瑜伽健身房培训报名小程序开发介绍

活动报名收费签到小程序,支持个人免费组织报名收款和现场签到。随时随地管理活动、发布活动、查看收入明细提现资金更效率。 活动报名收费签到小程序主要功能有: 在线报名:通过二维码或链接分享活动入口,亦可轻松放进入公众号。 …

客户端通过SSH连接Linux服务器超时问题解决方法汇总

🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏:善假于物&#…

Windows无法进入睡眠模式怎么办?

睡眠模式是电脑的一种低功耗模式,能减少耗电。当你要离开电脑一阵,但又不想关闭文档和程序,就可以选择让电脑暂时休眠。 如果你的电脑无法进入睡眠模式,可以尝试下面几种方法: 更换电源选项检查电源命令使用电源疑难…

开源机器学习软件对AI的发展意味着什么?

作者| Max Langenkamp OneFlow编译 翻译|徐佳渝、杨婷 为什么要关注机器学习开源软件(MLOSS)?在我们看来,MLOSS对AI发展来说举足轻重,但未获重视。 机器学习开源软件是开源许可下发布的专为机器…

“易”起涨知识|人人都在追捧的低代码开发,到底有什么优势?

低代码的根本价值在于:劳动力转移。运营、产品能 cover 部分开发工作,实现研发流左移,敏捷迭代。 劳动力转移只是表面,低代码价值还是归属于自动化了信息传递。 产品用文字和交互图(PRD)表达了一遍完整的产…

List、Set、Map的区别

List、Set、Map的区别 ​ (图一) 1.面试题:你说说collection里面有什么子类。 (其实面试的时候听到这个问题的时候,你要知道,面试官是想考察List,Set) 正如图一,lis…

一文深入分析arm64 cache机制

说明: Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:Source Insight 3.5, Visio 1. 概述 先来看一下经典的存储器层次结构图: 不同存储器技术的访问时间差异很大,CPU和主存…

2023年深圳前端培训机构排名,评价较高的机构分享

深圳前端培训机构排行榜的前三名是哪家呢?不少学生在选择学习前端开发的时候,都会通过网络来找一些相关的排行,评判哪家机构的教学比较好,今天小编就来针对这类相关的培训为大家分享一些内容,帮助大家选择更适合自己的…

RabbitMQ面试知识点总结

1.消息模式 P2P Worker Pub/Sub(exchange 4种) 四种交换机:direct/topic/headers/fanout,默认交换机是direct,其中Publish/Subscribe,Routing,Topics三种模式可以统一归为Exchange模式,只是创建时交换机的…

【LeetCode每日一题】【2023/2/1】2325. 解密消息

文章目录2325. 解密消息方法1:哈希表2325. 解密消息 LeetCode: 2325. 解密消息 简单\color{#00AF9B}{简单}简单 给你字符串 key 和 message ,分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下: 使用 key 中 26 个英文小写字母第…

SpringBoot 监控统计(SQL监控、慢SQL记录、Spring监控、去广告)

1 基本概念Druid 是Java语言中最好的数据库连接池。虽然 HikariCP 的速度稍快,但是,Druid能够提供强大的监控和扩展功能 ,也是阿里巴巴的开源项目。Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面&…

算法---冗余连接

题目 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edge…