分布式学习-总结

分布式理论

分布式系统定义以及面临的问题

分布式系统定义

分布式系统是一个硬件或软件组件分布在不同的网路计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。

分布式面临的问题

通信异常

由于网络本身的不可靠性,出现消息丢失消息延迟

网络分区

由于网络发生异常情况,导致分布式系统中部分节点之间的网络延迟不断增大,最终导致组成分布式系统中有部分节点能够正常通信,网络之间出现了网络不连通,但各个子网络的内部网络是正常的,从而导致整个系统的网络环境被切分成了若干个孤立的区域,分布式系统就会出现局部小集群,在极端情况下,这些小集群会独立完成原本需要整个分布式系统才能完成的功能,包括数据的事务处理,这就是对分布式一致性提出非常大的挑战。

三态

分布式系统每一次请求与响应存在特有的“三态”概念,即成功、失败和超时。在分布式系统中,由于网络是不可靠的,虽然绝大部分情况下,网络通信能够接收到成功或失败的响应,但当网络出现异常的情况下,就会出现超时现象,通常有以下两种情况:
1.由于网络原因,该请求并没有被成功的发送到接收方,而是在发送过程就发生了丢失现象。
2.改请求成功的被接收方接收后,并进行了处理,但在响应反馈给发送方过程中,发生了消息丢失现象。

节点故障

节点故障是分布式系统下另一个比较常见的问题,指的是组成分布式系统的服务器节点出现的**宕机或“僵死”**现象,根据经验来说,每个节点都有可能出现故障,并且经常发生

分布式理论:一致性概念

分布式一致性的提出

在分布式系统中要解决的一个重要问题就是数据的复制。在我们的日常开发中,相信有很多人遇到过这样的问题:假设客户端C1将系统中的一个值K由V1更新为V2,但客户端C2无法立即读取到最新值,需要在一段时间之后才能读取到,这个例子就是常见的数据库之间复制延迟问题。
分布式学习-总结
分布式系统对于数据的复制需求一般都来自于一下两个原因:

  1. 为了增加系统的可用性,以防止单点故障引起的系统不可用
  2. 提高系统的整体性能,通过负载均衡技术,能够让分布在不同地方的数据副本都能够为用户提供服务

数据复制在可用性和性能方面带来的好处不言而喻,然后数据复制带来的一致性挑战也是不得不面对。
数据一致性是指对一个副本数据进行更新的时候,必须确保也能够更新其他的副本,否则不同副本之间的数据将不一致。

那么如果解决这个问题?一种思路就是“既然是由于延时动作引起的问题,那我们可以将写入的动作阻塞,知道数据复制完成后,才完成写入动作”,一些系统架构也是这样设计的,但是这种思路之后会引入新的问题:写入的性能。如果你的应用场景有非常多的写请求,那么使用这个思路以后,后续的写请求都将会阻塞在前一个请求的写操作上,导致系统整体性能急剧下降。
总得来说,我们无法找到一种能够满足分布式系统所有系统属性的分布式一致性解决方案。那么如何保证数据的一致性,又能够不影响系统运行的性能,是每一个分布式系统都需要重点考虑和权衡的,于是一致性级别由此诞生:

强一致性

这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大。
优点:用户体验好
缺点:性能开销大

弱一致性

这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能保证到某个时间级别后,数据能够达到一致性状态

最终一致性

最终一致性是弱一致性的一个特例系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以最终一致性单独提出来,是因为它是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型。

分布式事务

在单机数据库中,我们很容易实现一套满足ACID特性的事务处理系统,但在分布式数据库中,数据分散在各台不同的机器上,如何对这些数据进行分布式事务处理具有非常大的挑战。

分布式事务:是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点上,通常一个分布式事务中会涉及对多个数据源或业务系统的操作。

可以设想一个最典型的分布式事务场景:一个跨银行的转账操作涉及调用两个异地的银行服务,其中一个是本地银行提供的取款服务,另一个则是目标银行提供的存款服务,这两个服务本身是无状态并且相互独立的,共同构成了一个完整的分布式事务。如果从本地银行取款成功,但是因为某种原因存款服务失败了,那么就必须回滚到取款之前的状态,否则用户可能会发现自己的钱不翼而飞了。

从这个例子可以看到,一个分布式事务可以看做是多个分布式的操作序列组成的,例如上面例子的取款服务和存款服务,通常可以把这一系列分布式的操作序列称为子事务。

因此,分布式事务也可以被定义为一种嵌套型的事务,同时也就具有了ACID事务特性。但由于在分布式事务中,各个子事务的执行是分布式的,因此要实现一种能够保证ACID特性的分布式事务处理系统就显得格外复杂,尤其是对于一个高访问量,高并发的互联网分布式系统来说

如果我们期望实现一套严格满足ACID特性的分布式事务,很可能出现的情况就是在系统的可用性和严格一致性之间出现冲突…因为当我们要求分布式系统具有严格一致性时,很可能就需要牺牲掉系统的可用性。但毋庸置疑的一点是,可用性又是一个消费者不允许我们讨价还价的系统属性,比如像淘宝这样的在线购物网站,就要求7x24小时不间断地对外提供服务,而对于一致性,则更加是所有消费者对于一个软件的刚需。

因此,在可用性和一致性之间永远无法存在一个两全其美的方案,于是如何构建一个兼顾可用性和一致性的分布式系统成为了无数开发人员探讨的难题,于是就出现了CAP和BASE这样的分布式系统经典理论

CAP定理

什么是CAP理论?

CAP理论告诉我们,一个分布式系统不可能同时满足一致性(Consistency)、可用性(Avaliability)、分区容错性(Partition)这三分基本需求,最多只能同时满足其中2两个

选项 描述
一致性 分布式环境中,数据在多个副本之间能够保持一致的特性(严格一致性),在一致性的需求下,当一个系统在数据一致性的状态下执行更新操作后,应该保证系统的数据依然处在一直的转态
可用性 系统提供的服务必须一直处于可用的状态,每次请求都能获取到非错的响应–但不保证获取的数据为最新数据
分区容错性 分布式系统在遇到任何网络分区故障的时候,依然能够对外提供满足一致性可用性的服务,除非整个网络环境都发生了故障

为什么只能3选2

能不能解决3选2的问题

BASE理论

一致性协议2PC

一致性协议3PC

一致性算法Paxos

一致性算法Raft

分布式系统设计策略

心跳检测

高可用设计

容错性

负载均衡

分布式架构网络通信

基本概念

什么是RPC

RMI

BIO、NIO、AIO

Netty

IO编程

NIO编程

Netty编程

基于Netty自定义RPC

在基于教案的理解基础上纯手打有点浪费时间,明天继续补充!!