什么是分布式?为什么要做分布式?分布式要实现什么?
大白话解释(个人理解, 有错指正):
- 在不同的地方有好多的节点运行相同的程序叫做分布式
- 两种情况:
- 单一节点或集群,无法满足并发需求,需要扩充更多的硬件资源来支撑并发。但是现实情况是土地资源是有限的,无法在同一地点扩张。所以采取了多地区的方案进行扩展。
- 需要更快的响应速度
- 分布式要实现 单节点的ACID,实现了吗(CAP)?
- CAP的A(高可用,主备是基础,主从在C中讨论):
1. 单节点:不存在可用性,挂了整体服务都不可用。
2. 分布式:如果某节点挂了,其他节点还可以用,但是整体情况下是不可用的, 所以要引入节点备机,当master宕机,slave顶替上来。增加可用性 - CAP的P (分区)–主备是前提:
1. 单节点:只有一个master,不存在主备的情况。
2. 分布式:网络延迟,网络不可用。会引起 slave 在 master 没宕机的情况下成为新的master,这时候同一节点上出现两个master【俗称脑裂】。脑裂不可避免,但是必须确定使用哪个master,放弃使用另外一个,不然就会导致两个master同时修改一份数据,造成数据不一致。常用解决方案就是投票 - CAP的C(高性能,主从,一致性):
1. 单节点:可用的数据就一份。(mysql内部有缓存区,先写缓冲, 再写真实表。可用数据指的是真实表)
2. 分布式:在数据同步过程中,网络问题导致数据更新延迟或者失败,导致数据不一致。解决方案 BASE理论:
- 强一致性:如果数据在同步过程中失败了, 那就回滚数据, 返回失败。这种会降低可用性,不满足高可用原则。
- 弱一致性:允许部分数据丢失, 不满足一致性
- 最终一致性:数据一定会同步,只是需要时间。但是这个时间不确定,间接的满足一致性。虽然这个方案不好, 但是只需要尽快的同步到就没问题,所以采用多从机制增加短时间同步的概率
- CAP的A(高可用,主备是基础,主从在C中讨论):
所以CAP目标是实现单节点的C,最终解决的就是通信问题。
专业解释
分布式系統
概念:
一个组件(硬件或者软件)分布在网络上的系统,组建之间通过传递消息进行通信和动作协调特点:
- 分布式:分布式系统中的计算机分布情况,会根据实际情况来分布
- 对等性:分布式系统中的就算计没有主/从之分, 所有节点都是对等的。
- 并发性
- 缺乏全局时钟:每一台计算机都有物理时钟, 但可能出现偏差
- 故障独立性:
- 进程可能出异常
- 所有计算机都有可能出现故障,
- 网络故障
更詳細的分布式请看 《分布式系统概念与设计》这本书
上述会引发数据一致性的问题,解决思路就是:
- 强一致性:完全保证数据一致性
- 弱一致性:尽量保证数据一致性, 但有可能出问题
- 最终一致性:保证数据一致性, 数据最终一定会被同步完成,但这个时间段会出现数据不一致
以下是针对上面3个思路的理论
事务设计理论
ACID(强一致性)
- 原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性:事务前后数据的完整性必须保持一致。
- 隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
CAP/BASE
- CAP
- 一致性:数据在多个副本之间能够保持一致
- 可用性: 系统提供的服务必须一直处于可用, 对于用户的每一个操纵请求总能够有限时间内返回结果,如果超过这个时间,即不可用
- 分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非整个网络环境发生了故障
应用
具体解释参考:CAP 定理的含义
- BASE
- 基本可用: 分布式系统出现不可预制的故障的时候, 允许损失部分可用性
- 相应时间上的损失: 假设:正常情况下接口响应时间是0.5秒,出现故障好,响应时间变成1-3秒
- 功能上的损失:最好理解的就是双十一, 关闭了退款等业务,淘宝为了迎接并发。
- 弱状态
指数据存在中间状态,但不影响整理的可用性, 即允许不同的节点在同步数据的时候存在延迟
- 最终一致性
- 因果一致性
节点 A在更新完某个数据项后通知 节点 B, B应该要能获取到A更新后的最新的数据,B更新这条数据也是基于A更新后的最新数据修改的。但是与进程A无关的进程C是没有这个限制的
- 读已(自己)之所写
节点 A 更新一个数据后,它自身总是能访问到自身更新过的最新值,而不会看到旧值。其实也算一种因果一致性
- 会话一致性
将对系统数据的访问过程框定在了一个会话当中:系统能保证在同一个有效的会话中实现 “读己之所写” 的一致性,也就是说,执行更新操作之后,客户端能够在同一个会话中始终读取到该数据项的最新值。
- 单调读一致性
如果一个节点从系统中读取出一个数据项的某个值后,那么系统对于该节点后续的任何数据访问都不应该返回更旧的值。
- 单调写一致性
指一个系统要能够保证来自同一个节点的写操作被顺序的执行。
- ACID是传统数据库常用的设计理念, 追求强一致性模型。
- 在设计上 无法做到CAP, 所以CAP紧紧是一个理论。
- BASE支持的是大型分布式系统,提出通过牺牲强一致性获得高可用性。
参考: