一、分布式环境
1.1 分布式的特点
- 分布性:分布式系统中的多台计算机都会在空间上随意分布。
- 对等性:集群中没有主/从节点之分,所有节点都是对等的;在分布式系统中,为了对外提供高可用的服务,我们常常会对数据和服务进行副本处理。
- 并发性:多个节点并发操作共享资源,比如我们分布式存储如何准确并高效地协调分布式并发操作。
- 缺乏全局时钟:分布式系统中因为没有全局时钟序列控制,所以事务的先后顺序无法确定
- 故障总是会发生
1.2 分布式环境的各种问题
- 通信异常
分布式系统中个计算机之间是通过网络进行通信的。由于网络本身的不可靠性,每次网络通信都会伴随着网络不可用的风险。即使分布式系统各节点之间的网络通信能够正常进行,其延时也会远远大于单机操作。在分布式系统中,消息延时和消息丢失非常普遍。 - 网络分区
当网络发生异常情况,可能导致分布式系统中某些节点之间能够正常通信,而某些节点之间无法通信——该现象就是网络分区,就是俗称的『脑裂』。当网络分区出现时,分布式系统就会出现局部小集群,小集群内计算机可以相互通信,小集群之间计算机无法通信。这就对分布式一致性提出了非常大的挑战。 - 三态
因为在分布式系统中,网络可能会出现各式各样的问题,因此分布式系统的每一次请求和响应,存在特有的『三态』概念,即成功、失败与超时。在传统的单机系统中,应用程序在调用一个函数之后,能够得到一个非常明确的相应:成功或失败。而在分布式系统中,由于网络是不可靠的,当网络出现异常的情况下,就可能出现超时现象,发生消息丢失现象。 - 节点故障
节点故障是分布式环境下一个比较常见的问题,指的是组成分布式系统的服务器节点出现宕机或『僵死』现象。通常根据经验来说,每个节点都有可能出现故障,并且每天都在发生。
二、一致性定义
2.1 CAP理论
-
C 一致性: 分布式环境中,一致性是指多个副本之间,在同一时刻能否有同样的值
-
A 可用性: 系统提供的服务必须一直处于可用的状态。即使集群中一部分节点故障。
-
P 分区容错性: 系统在遇到节点故障,或者网络分区时,仍然能对外提供一致性和可用性的服务。以实际效果而言,分区相当于通信的时限要求。系统如果不能在一定实现内达成数据一致性,也就意味着发生了分区的情况。必须就当前操作在 C 和 A 之前作出选择
2.2 常见场景
-
CA without P:
在分布式环境中,P 是不可避免的,天灾(某软公司的Azure被雷劈劈中)人祸(某里公司 A 和 B 机房之间的光缆被挖断)都能导致P -
CP without A:
相当于每个写请求都须在Server之前强一致。P (分区)会导致同步时间无限延长。这个是可以保证的。例如数据库的分布式事务,两阶段提交,三阶段提交等 -
AP without C:
当网络分区发生,A 和 B 集群失去联系。为了保证高可用,系统在写入时,系统写入部分节点就会返回成功,这会导致在一定时间之内,客户端从不同的机器上面读取到的是数据是不一样的。例如 redis 主从异步复制架构,当 master down 掉,系统会切换到 slave,由于是异步复制,salve 不是最新的数据,会导致一致性的问题。