第六周总结
CAP原则
CAP原则用于描述 分布式 存储 系统
Consisteny(一致性)
一致性是指对于客户端,每次获取到的数据都是最新的。
Availability(可用性)
可用性是指每个请求都可以在合理的时间内给出响应,不保证获取的数据是最新的。
Partition tolerance(分区容错性)
分区容错性是指当出现了网络问题,系统依然可以对外正常提供服务。
CAP组合
在分布式系统中,CAP只能满足其中两个,只能满足AP或者CP。
为什么不能满足CA,在分布式系统中,存在多台机器同时提供服务。既然是多台机器,它们的通讯方式就是依靠网络,每台机器都有网线插在交换机或者路由器上,有很大的概率出现网络问题,所以P是必须的。
AP组合(可用性,分区容错性)
一般满足AP的分布式存储系统,主从复制,如图。
客户端A将X为1的值写入到存储服务器Node01,写入Node01成功后返回成功。这时Node01还没有来得及将数据同步到Node02,客户端B访问了Node02,读取不到X的值,不满足一致性。
当出现网络问题
客户端A,客户端B依然可以访问存储服务器,只是访问到的数据并不是最新的。满足可用性,满足分区容错性。
当出现服务器宕机
当Node01宕机时,Node02依然可以提供服务。满足可用性。
所以在满足可用性和分区容错性时,无法满足一致性。
CP组合(一致性,分区容错性)
如何满足一致性?一般的解决方案是双写、多写。
客户端A写入X值为1,分别向两台服务器写入,两台服务器都写入成功时,写入才算成功。写入成功后,Node01,Node02的节点数据都是最新的。
当出现网络分区或服务器宕机
客户端A写X值为1,写入到Node01成功,写入到Node02失败,Node02因网络分区或宕机时,写入无法成功,系统返回了错误,即失去了可用性。
CAP总结
常见的CP存储系统,Zookeeper(ZAB协议),Consul(Raft协议)。
基于Multi-Paxos思想实现的一致性算法,通常都是只有系统一半以上节点不可用时,系统才完全不可用,所以并不是选择了CP就一定没有可用性,只是更偏向于一致性。
主从复制的架构也只是偏向可用性,并不是完全失去了一致性,通常一个机房内的数据同步速度是非常快的,主从复制间数据的复制速度也是非常快的。
ACID原则
原子性(Atomicity)
事务要么全部完成,要么全部取消。如果事务崩溃,状态回到事务之前(事务回滚)。
例如:
批量添加了人员信息(100人),这100人要么全部添加成功,要么全部添加不上。在添加48个人时发生了异常(事务回滚),那么前面添加的那些人员全部无效。
隔离性(Isolation)
如果有两个事务同时执行(T1,T2),事务T1、T2最终执行的结果是相同的,不管T1、T2谁先结束,隔离性主要靠锁实现。
持久性(Durability)
一旦事务提交,不管发生什么,数据要保存在数据库中。数据会直接保存在硬盘上,就算是数据库重启实例,都不会丢失这个数据。
一致性(Consistency)
只有合法的数据才能写入数据库(按照关系约束,外键,函数约束)。
BASE原则
基本可用(Basically Available)
系统在出现不可预知故障时,允许损失部分可用性,如响应时间上的损失或功能上的损失。
软状态、弱状态(Soft state)
允许系统中的二数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行同步的过程存在延时。
最终一致性(Eventually consistent)
指系统中所有的数据副本,在经过一段时间同步后,最终能够达到一个一致状态,因此最终一致性的本质是需要系统保证数据能够达到一致,而不需要实时保证系统数据的强一致性。
BASE原则是CAP原则的一个补充。
分布式一致Zookeeper
分布式系统脑裂
在一个分布式系统中,不同服务获得了互相冲突的数据信息或者执行指令,导致整个集群陷入混乱,数据损坏,本称作分布式系统脑裂。
例如:
有两个服务器节点,Node01,Node02,他们的可用状态存放在一个分布式存储服务中,
这个分布式存储服务(CNode01,CNode02)是符合AP原则的,
由于出现网络分区,
CNode01服务中存放着Node01可用(实际上Node01已不可用),状态无法同步到CNode02,
CNode02存放着Node02可用(实际Node02是可用的),
客户端获取可用节点时,从CNode01获取Node01可用,从CNode02节点获取Node02可用。
同样的请求不一样的结果会导致问题。
Zookeeper是分布式协调服务,符合CP原则,可以提供强一致性的存储服务。可以解决分布式系统中的脑裂问题。
Zookeeper有哪些局限
所有的写请求都要经过Leader节点来处理,并且写请求需要集群中过半节点数写成功才可以判定为写成功。因此Zookeeper的写入速度相当于单机的写入性能。
Zookeeper在Leader选举的过程中,如果要求数据的强一致性(先访问一个节点,然后调用sync方法让该节点从Leader中同步最新数据后返回),那么就无法提供服务。
评论