分布式架构
分布式的特点
定义:分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。
有如下几个特征:
- 分布性
- 对等性:副本,主/从控制
- 数据副本
- 并发性
- 缺乏全局时钟:多个进程之间通过交换消息来进行相互通信,由于缺乏一个全局的时钟序列控制,很难定义两个时间究竟谁先谁后。
- 故障总是会发生:任何在设计阶段考虑到的异常情况,一定会在系统实际运行中发生,并且,在系统实际运行过程中还会遇到很多在设计时未能考虑到的异常故障。
分布式环境中各种问题
- 通信异常:由于网络本身的不可靠性,消息丢失和消息延迟变得非常普遍
- 网络分区:网络由于异常情况,导致分布式系统中部分节点之间的网络延时不断增大,最终导致组成分布式系统的所有节点中,只有部分节点之间能够进行正常通行,而另一些节点则不能——这个现象称为网络分区,俗称“脑裂”。
- 三态概念:即成功、失败与超时。
- 发送过程出现消息丢失;
- 消息发送成功,但是ack消息发生了丢失。
- 节点故障
从ACID到CAP/BASE
ACID
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
指在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其他事务干扰。SQL规范定义了四个事务隔离级别
隔离级别 | 脏读 | 可重复读 | 幻读 |
---|---|---|---|
未提交读(read uncommitted) | 可能 | 可能 | 可能 |
已提交读(read committed) | 不可能 | 可能 | 可能 |
可重复读(repeatable read) | 不可能 | 不可能 | 可能 |
串行化(serializable) | 不可能 | 不可能 | 不可能 |
- 持久性(Durability)
CAP定理
CAP理论告诉我们,一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:availability)和分区容错性(P:partition tolerance)这三个基本需求,最多只能同时满足其中两个。
- 一致性:指数据在多个副本之间是否能够保持一致的特性。
- 可用性:指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。
- 分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。
分布式系统中,网络问题必然会出现,因此分区容错性是必然需要面对和解决的问题,因此分布式系统设计大部分精力都花在一致性和可用性之间寻找一种平衡。
BASE理论
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写。是基于CAP定理慢慢演化而来,其核心思想是即使无法做到一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性
。
- 基本可用:指系统在出现不可预知的故障的时候,允许损失部分可用性。下面两个是典型例子:
- 响应时间上的损失
- 功能上的损失:业务高峰期,可引导部分用户到降级页面
- 软状态:指允许系统中的数据存在中间状态,并认为该状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
- 最终一致性:指的是系统保证最终数据能够达到一致,而不需要实时保证数据的强一致性。最终一致性有以下五类变种:
- 因果一致性(causal consistency):A进程更新完某数据后通知了进程B,那么进程B之后对该数据就能获取到A更新后的最新值。
- 读己之所写(read your writes):进程A更新完某数据项之后,它自己总能获取到最新的值。
- 会话一致性(session consistency):在同一个有效的会话中,能够保证数据一致性
- 单调一致性(monotonic read consistency):对于某个进程应该能保证某个数据项的一致性
- 单调写一致性(monotonic write consistency):一个系统需要能够保证来自同一个进程的写操作被顺序地执行。