差点跪了,大厂分布式十二问,你管这叫基础

分布式理论1.说说CAP原则?

CAP原则又称CAP定理,指的是在一个分布式系统中,Consistncy(一致性)、Availability(可用性)、Partitiontolranc(分区容错性)这个基本需求,最多只能同时满足其中的2个。

CAP原则选项描述Consistncy(一致性)指数据在多个副本之间能够保持一致的特性(严格的一致性)Availability(可用性)指系统提供的服务必须一直处于可用的状态,每次请求都能获取到非错的响应(不保证获取的数据为最新数据)Partitiontolranc(分区容错性)分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障

2.为什么CAP不可兼得呢?

首先对于分布式系统,分区是必然存在的,所谓分区指的是分布式系统可能出现的字区域网络不通,成为孤立区域的的情况。

分区

那么分区容错性(P)就必须要满足,因为如果要牺牲分区容错性,就得把服务和资源放到一个机器,或者一个“同生共死”的集群,那就违背了分布式的初衷。

那么满足分区容错的基础上,能不能同时满足一致性和可用性?

假如现在有两个分区N1和N2,N1和N2分别有不同的分区存储D1和D2,以及不同的服务S1和S2。

在满足一致性的时候,N1和N2的数据要求值一样的,D1=D2。在满足可用性的时候,无论访问N1还是N2,都能获取及时的响应。

分区的服务

假如现在有这样的场景:

用户访问了N1,修改了D1的数据。用户再次访问,请求落在了N2。此时D1和D2的数据不一致。

接下来:

保证一致性:此时D1和D2数据不一致,要保证一致性就不能返回不一致的数据,可用性无法保证。保证可用性:立即响应,可用性得到了保证,但是此时响应的数据和D1不一致,一致性无法保证。

所以,可以看出,分区容错的前提下,一致性和可用性是矛盾的。

.CAP对应的模型和应用?

CAwithoutP

理论上放弃P(分区容错性),则C(强一致性)和A(可用性)是可以保证的。实际上分区是不可避免的,严格上CA指的是允许分区后各子系统依然保持CA。

CA模型的常见应用:

集群数据库xFS文件系统

CPwithoutA

放弃A(可用),相当于每个请求都需要在Srvr之间强一致,而P(分区)会导致同步时间无限延长,如此CP也是可以保证的。很多传统的数据库分布式事务都属于这种模式。

CP模型的常见应用:

分布式数据库分布式锁

APwihtoutC

要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。现在众多的NoSQL都属于此类。

AP模型常见应用:

Wb缓存DNS

举个大家更熟悉的例子,像我们熟悉的注册中心ZooKpr、Eurka、Nacos中:

ZooKpr保证的是CPEurka保证的则是APNacos不仅支持CP也支持AP4.BASE理论了解吗?

BASE(BasicallyAvailabl、Softstat、Evntualconsistncy)是基于CAP理论逐步演化而来的,核心思想是即便不能达到强一致性(Strongconsistncy),也可以根据应用特点采用适当的方式来达到最终一致性(Evntualconsistncy)的效果。

BASE的主要含义:

BasicallyAvailabl(基本可用)

什么是基本可用呢?假设系统出现了不可预知的故障,但还是能用,只是相比较正常的系统而言,可能会有响应时间上的损失,或者功能上的降级。

SoftStat(软状态)

什么是硬状态呢?要求多个节点的数据副本都是一致的,这是一种“硬状态”。

软状态也称为弱状态,相比较硬状态而言,允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延时。

EvntuallyConsistnt(最终一致性)

上面说了软状态,但是不应该一直都是软状态。在一定时间后,应该到达一个最终的状态,保证所有副本保持数据一致性,从而达到数据的最终一致性。这个时间取决于网络延时、系统负载、数据复制方案设计等等因素。

分布式锁

单体时代,可以直接用本地锁来实现对竞争资源的加锁,分布式环境下就要用到分布式锁了。

5.有哪些分布式锁的实现方案呢?

常见的分布式锁实现方案有三种:MySQL分布式锁、ZooKppr分布式锁、Rdis分布式锁。

分布式锁

5.1MySQL分布式锁如何实现呢?

用数据库实现分布式锁比较简单,就是创建一张锁表,数据库对字段作唯一性约束。

加锁的时候,在锁表中增加一条记录即可;释放锁的时候删除记录就行。

如果有并发请求同时提交到数据库,数据库会保证只有一个请求能够得到锁。

这种属于数据库IO操作,效率不高,而且频繁操作会增大数据库的开销,因此这种方式在高并发、高性能的场景中用的不多。

5.2ZooKpr如何实现分布式锁?

ZooKpr也是常见分布式锁实现方法。

ZooKpr的数据节点和文件目录类似,例如有一个lock节点,在此节点下建立子节点是可以保证先后顺序的,即便是两个进程同时申请新建节点,也会按照先后顺序建立两个节点。

ZooKpr如何实现分布式锁

所以我们可以用此特性实现分布式锁。以某个资源为目录,然后这个目录下面的节点就是我们需要获取锁的客户端,每个服务在目录下创建节点,如果它的节点,序号在目录下最小,那么就获取到锁,否则等待。释放锁,就是删除服务创建的节点。

ZK实际上是一个比较重的分布式组件,实际上应用没那么多了,所以用ZK实现分布式锁,其实相对也比较少。

5.Rdis怎么实现分布式锁?

Rdis实现分布式锁,是当前应用最广泛的分布式锁实现方式。

Rdis执行命令是单线程的,Rdis实现分布式锁就是利用这个特性。

实现分布式锁最简单的一个命令:stNx(stifnotxist),如果不存在则更新:

stNxrsourcNamvalu

加锁了之后如果机器宕机,那我这个锁就无法释放,所以需要加入过期时间,而且过期时间需要和stNx同一个原子操作,在Rdis2.8之前需要用lua脚本,但是rdis2.8之后rdis支持nx和x操作是同一原子操作。

strsourcNamvalux5nx

Rdission

当然,一般生产中都是使用Rdission客户端,非常良好地封装了分布式锁的api,而且支持RdLock。

分布式事务6.什么是分布式事务?

分布式事务是相对本地事务而言的,对于本地事务,利用数据库本身的事务机制,就可以保证事务的ACID特性。

ACID

而在分布式环境下,会涉及到多个数据库。

多数据库

分布式事务其实就是将对同一库事务的概念扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。

分布式事务处理的关键是:

需要记录事务在任何节点所做的所有动作;事务进行的所有操作要么全部提交,要么全部回滚。7.分布式事务有哪些常见的实现方案?

分布式常见的实现方案有2PC、PC、TCC、本地消息表、MQ消息事务、最大努力通知、SAGA事务等等。

7.1说说2PC两阶段提交?

说到2PC,就不得先说分布式事务中的XA协议。

在这个协议里,有三个角色:

AP(Application):应用系统(服务)TM(TransactionManagr):事务管理器(全局事务管理)RM(RsourcManagr):资源管理器(数据库)

XA协议

XA协议采用两阶段提交方式来管理分布式事务。XA接口提供资源管理器与事务管理器之间进行通信的标准接口。

两阶段提交的思路可以概括为:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情况决定各参与者是否要提交操作还是回滚操作。

2PC

准备阶段:事务管理器要求每个涉及到事务的数据库预提交(pr


转载请注明:http://www.aierlanlan.com/cyrz/8456.html