请选择 进入手机版 | 继续访问电脑版

用太极拳讲分布式理论,真舒服!

[复制链接]
小小海 发表于 2021-1-2 19:41:08 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

配景:倚天屠龙记中赵敏郡主携带一帮高手围攻武当,武当派掌门张三丰被暗算,传了一套武功给张无忌用来对付赵敏的手下。这套武功就是太极拳。
  张三丰:无忌,你可记得多少招式?
  张无忌:我全忘了!
  张三丰:很好,你只要记着把玄冥二老打趴下就可以了。

上篇用三国杀讲分布式中的拜占庭将军问题,还挺有意思的,这次我们用倚天屠龙记中的太极拳来聊下剩下的三大理论


  • CAP 理论
  • ACID 理论
  • BASE 理论
  太极拳的精华:以柔克刚,刚柔并进,四两拨千斤,无招胜有招。
我把 CAP 理论称作太极,ACID 理论称为阳或刚,BASE 理论称为阴或柔。ACID 理论追求一致性,BASE 理论原来就叫做柔性事务,追求的是可用性。那张无忌为什么会全忘了还打败了玄冥二老呢?因为太极拳的精华是拳意,无招胜有招。
一、太极的两面

CAP 理论是对分布式系统的特性做了一个高度的抽象,酿成了三大指标:


  • 一致性(Consistency)
  • 可用性(Availability)
  • 分区容错性(Partition Tolerance)
分布式中的一致性,我们可以明确为客户端的每次读利用,不管访问的是哪个几点,要么督导的都是同一份最新写入的数据,要么读取失败。这就很刚了,不能说这种刚欠好,在许多场景中,也确实需要包管高度的一致性。
为了资助各人明确一致性,我举个倚天屠龙记的故事:六大派围攻光明顶

峨眉派灭尽师太作为统领,领导江湖六大派围攻光明顶,最开始的打击计谋是从北边打击。灭尽师太发现从北边打击不妙,于是飞鸽传书给武当派和少林派从南边打击的下令,但是少林派的飞鸽被明教轻功绝顶的青翼蝠王韦一笑截获了,最后的效果是少林派从北边打击,武当派从南边打击,这不就乱套了吗?如下图所示:

1.1 明确分布式中的 CAP

CAP 放到分布式系统中该如何明确呢?下面举个例子资助各人明确。


  • 初始情况:客户端查询或更新节点 1 和 节点 2,两个节点存的值 A = 1。



  • 客户端更新节点 1 中 A 的值,设置 A = 5。



  • 节点 1 将 A 的值更新为 5 后,返回更新乐成给客户端。

  • 客户端访问到了节点 2 ,请求获取 A 的值,效果返回 A = 1。这和节点 1 中存储的 A 的值就不一致了。



  • 那么怎么包管两个节点中的值都是 A = 5 呢?客户端将节点 1 更新后,节点 2 也需要更新,才气告诉客户端更新乐成了。



  • 两个节点都更新乐成后,客户端访问此中任意一个节点获取到的都是 A = 5。这个就叫做一致性。

一致性强调的是数据正确,每次读取节点中的数据都是最新写入的数据。这个我称作刚。
但是我们生产的集群情况下如果发生分区故障时(节点失联,节点无法响应,节点无法写入数据),客户端查询节点时,我们不能返回错误信息给客户端。比如说业务集群中的一些关键系统,如注册中心,不能因为某个节点失联了,就不响应最新的数据。那么相关的业务也获取不到正确的注册信息而导致系统瘫痪。
可用性就派上用场了,牺牲数据准确性,每个节点使用本地数据来响应客户端的请求。别的当节点不可用时,可以使用快速失败计谋,至少不能让服务长时间不能响应可用性强调的是服务可用,不包管数据正确。这个我称作柔。
如下图所示:节点 1 和节点 2 返回给客户端的值分别是 A = 5 和 A = 1,也就是节点 1 和 节点 2 并没有包管数据一致性,而是思量了节点的可用性。

分区容错性的寄义就是节点间出现任意数量的消息丢失或高延迟的时候,系统仍然在继续工作。分布式系统告诉客户端,我的内部岂论出现什么样的数据同步问题,我会一直运行。强调的是集群堆分区故障的容错本事。
1.2 CAP 三角

那么这三个指标又有什么关系呢?这个就是我们常常听到的 CAP 理论。C 代表一致性(Consistency),A 代表可用性(Availability)、P 代表分区容错性(Partition Tolerance)。
对于分布式系统,CAP 三个指标只能选择此中两个。


  • CA:包管一致性和可用性。当分布式系统正常运行时(大部门时候所处的状态),这个时候不需要 P,那么 C 和 A 可以或许同时包管。只有在发生分区故障时,才需要 P,这个时候就只能在 C 和 A 之间做出选择。典范应用:单机版摆设的 MySQL。
  • CP:包管数据的一致性和分区容错性,比如设置信息,必须包管每个节点存的都是最新的,正确的数据。比如 Raft 的强一致性系统,会导致无法执行读利用和写利用。典范应用:Etcd、Consul、Hbase。
  • AP:包管分布式系统的可用性和分区容错性。用户访问系统,都能得到相应数据,不会出现响应错误,但是大概会读到旧的数据。典范应用:Cassandra 和 DynamoDB。
二、太极的刚

2.1 ACID 的刚

最开始知道 ACID 是研究 SQL 数据库的时候,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、长期性(Durability)。
这四个属性是针对事务而言的,而事务就是为单个工作单元而执行的一系列利用。如查询、修改数据、修改数据界说。
事务不但仅只用在数据库上,还可以用在业务系统中,比如发券后扣减库存,这种业务场景可以界说为一个事务。单机场景我们可以通过加锁、时间序列等机制来包管单个节点上的 ACID 特性,但无法包管节点间利用的 ACID 特性。
那么分布式系统下该如何管理事务问题呢?这也是口试中常常遇到的题。分布式事务协议各人一定听过,比如二阶段提交协议和 TCC 协议,下面我照旧用六大派围攻光明顶故事来解说二阶段协议。
2.2 围攻光明顶

峨眉派想搜集少林派、武当派、昆仑派来日诰日一起打击光明顶。如果有一方差别意打击,大概打击时机不一致,则需要取消整个行动筹划。少林派、武当派、昆仑派打击光明顶这一组行动可以看成是一个分布式事务,要么全部执行、要么全部不执行。如下图所示:

那如何资助灭尽师太管理这个协同问题?我们可以用二阶段提交协议来说明。
2.3 二阶段提交协议

在二阶段提交协议中,灭尽师太先给少林派发送打击的消息,少林派作为协调者的身份,由少林派接洽武当派和昆仑派是打击照旧退却。
二阶段就是说有两个阶段,1.提交请求阶段(投票阶段),2.提交执行阶段(完成阶段)。
阶段一:提交请求阶段:


  • 第一步:少林派作为协调者分别给武当派和昆仑派发送消息:“来日诰日打击光明顶,可行?”
  • 第二步:少林派、武当派、昆仑派分别评估来日诰日是否能打击光明顶,如果能,就预留时间并锁定,不再安排其他的打击事项。
  • 第三步:少林派得到全部的复兴效果,包罗少林派自己的评估效果。最后三方的效果都是可行。
如下图所示:

阶段二:提交执行阶段:


  • 第一步:少林派统计自己、昆仑派和武当派的消息,都是可以打击,所以可以执行分布式事务,打击光明顶。
  • 第二步:少林派通知昆仑派和武当派打击光明顶。
  • 第三步:少林派、昆仑派、武当派召集手下门生,打击光明顶(执行事务)。
  • 第四步:昆仑派、武当派将是否已发起打击告诉少林派。
  • 第五步:少林派汇总自己、昆仑派、武当派的打击效果给灭尽师太。这样灭尽师太看到的就是统一的作战筹划。

注意:


  • 可以将灭尽师太当做客户端。少林派、武当派、昆仑派当做分布式系统的三个节点。少林派作为协调者。
  • 将评估是否能打击光明顶以及预留时间可以明确为需要利用的对象和对象状态,是否已经准备好了,能否提交新的利用。
  • 发送消息、飞鸽传书可以明确为网络消息。
  • 第一个阶段中,每个到场者投票表决事务是放弃照旧提交,一旦投票要求提交事务,那么就不允许放弃事务。
  • 第二个阶段中,每个到场者执行最终统一的决定,提交事务大概放弃事务。这个就是 ACID 的原子性。
  • 第一个阶段中,需要预留资源,预留期间,其他人不能利用这个资源。
2.4 二阶段协议带来的问题

ACID 特性是 CAP 中一致性的界限,可以称作最强的一致性,如果分布式系统中实现了一致性,一定会影响到可用性。如果一个节点失败,这个分布式事务的执行都是失败的。
绝大数场景中,对一致性要求没那么高,并不需要包管强一致性,短暂的不一致也能吸收,最后能包管数据是正确的就OK。也就是说我们可以用最终一致性方案来包管数据的一致性。
别的要提到的就是 TCC 协议(三阶段提交协议),他是针对二阶段提交中的:协调者故障,到场者恒久锁定资源的痛点而出的协议。引入了询问阶段和超时机制,淘汰资源被长时间锁定。但是需要更多的消息举行协商,增加了系统负载和响应延迟,所以三阶段提交协议很少被使用。
三、太极的柔

3.1 BASE 的柔

讲了太极的刚,下面来讲太极的柔。谈到分布式事务的柔,一定会提到 BASE 理论,俗称柔性事务。BASE 理论是 CAP 理论中 AP 的扩展。大部门互联网分布式系统都强调可用性,都会思量引入 BASE 支持。这个理论非常非常重要,我要告诉你的是,掌握了这个理论,设计出符合自己业务的分布式架构也会变得容易许多,而不是摸不着头脑。
BASE 的焦点:根本可用 BA(Basically Available)、软状态 S(Soft state)、最终一致性 E(Eventually consistent)。
那为什么叫它柔性事务?实在它和 ACID 是相对的,不需要包管强一致性,比如一根橡皮筋被拉弯了,你放开橡皮筋后,它就会自行规复,这个就是橡皮筋柔性的一面。
3.2 BASE 和太极拳有什么关系

太极拳每一招都不是直直的打出去的,每一招都考究圆滑、画弧线,看起来软绵绵的,实在是柔中带刚。每一招的最后一下都是非常刚硬的抖动一下(这效果我用文字实在形貌不出来,各人去看电视吧)。这最后一下就可以看成是刚的一面,也就是最终一致性。

3.3 根本可用

怎么明确根本可用?重点是在这个根本,这个理论并没有告诉我们怎么界说根本,这是一个含糊的概念。实在就是要柔到什么水平。
在分布式系统中,我们可以把根本可用明确为包管焦点功能可用,允许损失部门功能的可用性。根本可用可以用四种方案来实现。


  • 流量削峰:比如多个秒杀场次,某东的 8 点秒杀场,12 点的秒杀场。
  • 延迟响应:比如双 11 期间某商城创建的订单,会提示客户订单正在创建中,大概需要等个十几秒。
  • 体验降级:比如某次比赛运动,有大量用户进运动页检察图片,这个时候,大量图片因为网络超时而无法显示,这个时候就可以思量替换原有图片,返回清晰度没有那么高或图片比力小的图片。
  • 过载掩护:比如我们常用的消息队列占满了,可以思量抛弃厥后的请求,或清除队列中的一些请求,掩护系统不外载,但这都需要联合自身的业务场景来设计。
3.4 最终一致性

最终一致性:系统中的所有的数据副本在颠末一段时间的同步后,最终可以或许到达一个一致的状态。最终可以明确为一个短暂的延迟。
最终一致性在非常多的互联网业务中接纳。但是跟钱打交道或金融系统会接纳强一致性或事务。
前面提到了 ACID 的强一致性,而最终一致性和它是什么关系?
强一致性实在也是最终一致性的一种。那最终一致性怎么明确?强一致性可以看作不存在延迟的一致性。如果无法容忍延迟就用强一致性,否则就用最终一致性。
3.5 最终一致性和太极拳有什么关系

太极拳最神奇的一个地方就是卸力,当对方使出全力攻击你的时候,用太极的招式将对方使出的气力卸下来,使对方的攻击无效。卸力可以和我们之前讲到的流量削峰对应。别的卸完力之后,就是我们发动攻击的时候。
视频2
四、无招胜有招

回到文章的开头,张三丰教给张无忌的太极拳,张无忌全忘了,还怎么能打败玄冥二老的呢?
  因为太极拳重视的是拳意,而不是招式。所以张无忌相识了拳意,无招胜有招。
我们设计分布式系统的时候,也不要死记硬背三大理论,要真正懂得原理,然后才气一点一点迭代出最适合当前业务系统的分布式架构。
五、总结



  • 太极拳分为阴和阳两方面,就如 CAP 中的 C 和 A。
  • CAP 理论是分布式中底子理论,有三个重要指标:一致性、可用性、分区容错性。
  • ACID 是传统数据库的设计理念,追求强一致性。四个指标:原子性、一致性、隔离性、长期性。是 CAP 中 CP 的延伸。
  • BASE 理论是 CAP 中一致性和可用性权衡的效果。是 CAP 中的 AP 的延伸。注重可用性和性能优先,根据业务的场景特点,实现弹性的根本可用,然后实现数据的最终一致性。
  • BASE 理论在很洪流平上,管理了事务性系统在性能、容错、可用性等方面的通电。
  • BASE 理论在 NoSQL 中应用广泛,是 NoSQL 系统设计的事实上的理论支撑。
文中也通过六大派围攻光明顶的案例给各人解说了 二阶段提交的焦点原理,相信各人一定能看懂。本篇文章构思 2 周,终于出炉了,不要脸地求个再看和转发~

来源:https://blog.csdn.net/jackson0714/article/details/112002319
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )