1. 分布式原理
分布式系统是硬件和软件分布在不同网络计算机上,彼此间通过消息传递进行通信和协调的系统。
1.1 分布式环境存在的问题
- 通信异常:分布式环境存在消息丢失和消息延迟的情况。
- 网络分区:在组成分布式系统的所有节点中只有部分节点能进行正常通信,另一些则不能,形成网络分区孤岛,也称为脑裂。
- 三态:分布式环境请求有3种状态,成功、失败、超时。
- 节点故障:分布式环境中每个节点都有可能出现故障。
1.2 分布式系统特性
- 分布性:服务分布在网络的不同的机器上,可能会变动。
- 副本:
- 数据副本:多节点持久化同一份数据,当某个节点宕机或存储的数据丢失,可从副本读取到数据,解决分布式系统数据丢失的问题。
- 服务副本:多节点提供同样的服务,每个节点都能接收外部的请求并进行相应的处理。
- 并发性:并发情况较单点系统更为复杂,对于共享资源的访问需要准确和高效地协调。
- 故障:分布式系统中每个节点都有可能发生故障,设计时应该充分考虑可能发生的故障和备案。
1.3 CAP和BASE理论
1.3.1 分布式系统的几个基本要求
- 一致性:在分布式环境中,多个数据副本之间是否能够保持一致的特性。如果对一个数据项更新后,所有用户在集群其他节点都能读到更新后的值,那么认为系统具备强一致性(严格一致性)。
- 可用性:对于用户的每一个请求,系统可以在有限的时间内返回结果。有限的时间随系统类型不同而不同,是满足用户预期的时间。返回结果是指系统应该返回正确的响应,而不是用户无法理解的结果,比如OutOfMemory。
- 分区容错性:分布式系统在遇到任何网络分区故障时,仍需要保证对外提供一致性和可用性的服务,除非是整个网络发生故障。
1.3.2 CAP理论
CAP理论:一个系统不可能同时满足一致性(C:Consistency)、可用性(A:Avaliability)和分区容错性(P:Partition Tolerance)这三个基本需求,最多只能满足其中的两项。
那么为什么会这样呢?以下2个地方讲的都挺好的:
- https://www.zhihu.com/question/54105974
- https://blog.youkuaiyun.com/yeyazhishang/article/details/80758354
通过以上2个地方的讲解,概括下自己的理解:
分区容错性是分布式系统的基础,放弃则表示失去了系统的扩展性,违背了分布式系统设计的初衷。所以通常提到CAP的取舍,是在CA之间的取舍。
- 保证分区容错性:需要用到上文中提到的数据副本,即同一份数据分布到不同的节点上,在网络发生故障时,仍需要保证对外提供一致性和可用性的服务,除非是整个网络发生故障。
- 保证一致性:此时为满足分区容错性的需求,设置了多个数据副本(副本越多,分区容错性越强),分布式系统需要承担数据同步的工作。如果要保证强一致性,那么部分节点需要牺牲可用性,等待数据同步完成后再提供服务。极端情况下,当网络出现故障形成网络孤岛的时候,孤岛内的节点为保证强一致性,需要彻底停止服务,等待网络恢复,同步最新的数据保证强一致性。
- 保证可用性:同样是多个数据副本的场景,保证强可用性的一个方法即是牺牲一致性,在数据同步的同时提供服务,此时可能各个节点对同一个数据返回的值不同(还未完成数据同步),出现数据不一致的情况。
这样看来,不管单纯地牺牲一致性,还是可用性,都是不太可取的,所以会有BASE理论。
1.3.3 BASE理论
BASE理论:基本可用、软状态、最终一致性
- 基本可用:分布式系统在遇到问题时,允许损失部分可用性。响应时间上的延长、功能降级。
- 软状态:和强一致性相比,软状态允许系统中的数据存在中间状态,允许系统在不同节点的数据副本之间进行数据同步的延迟。
- 最终一致性:系统中的所有数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。
这样看来,还是可以在一致性和可用性之间做一定的权衡,来达到一个相对满意的状态。