前言
本文编写的目的:为了深入理解后期关于zookeeper的文章,本文这里对分布式一致性算法的由来以及要解决的问题做一个简述,更加深入的原理性东西后续将会以专辑的形式撰写 。另该文比较长,建议收藏阅读背景
本文编写的顺序:从集中式演化到分布式--->分布式出现的一些问题--->如何解决这些问题(即最重要的一致性问题)---->事务(保证一致性的方法)---->从早期的ACID到CAP/BASE理论---->2pc/3pc----->Paxos算法
20世纪60年代大型主机被发明出来以后,集中式的计算机系统架构成为了主流,其单机处理能力方面的优势非常明显,但从20世纪80年代之后,传统的集中式处理模式越来越不能满足人们的需求,同时集中式系统有明显的单点故障问题,从2008年开始,阿里开启了“去IOE”计划,后来逐渐的往分布式系统的方向发展 。分布式异常问题
分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统 。因此分布式系统具有以下几个特点:
1.分布性
多台计算机在空间上随意分布,同时分布情况也会随时变动
2.对等性
集群中的每个节点角色都是一样的,注意副本的概念
3.并发性
多个机器可能会同时操作一个数据库或存储系统,可能会引起数据不一致问题
4.缺乏全局时钟
分布式系统中的多个主机事件先后顺序很难界定
5.故障总发生
服务器宕机,网络拥堵和延迟
同时和分布式系统进行对比发现集中式系统具有以下几个特点:
部署结构简单
成本高
单点故障
大型主机的性能扩展受限于摩尔定律
注意:这里要区分集群和分布式的概念,集群是指大量的机器做同一件事情;分布式是指每台机器都有不同的角色,做不同的事情
分布式系统体系结构从出现到现在仍有很多的问题,这里列出一些典型的问题衡量分布式系统的性能
1.通信异常
从集中式向分布式演变,必然会引入网络因素,由于网络的不可靠性,必然会在分布式节点之间出现网络 异常的情况
2.网络分区
网络分区也就是常说的脑裂,即出现多个局部小集群,每个局部网络可以互相通信
3.三态
三态指的是三种状态,即成功、失败、超时;在集中式系统中只有成功和失败,而超时是由于分布式系统中会出现网络异常才会有的状态
4.节点故障
分布式节点总会出现宕机或者僵死现象
5.数据丢失
对于有状态的节点,数据丢失意味着状态丢失,通常只能从其他节点读取,恢复存储的状态;通常针对这种问题,通过引入副本机制就可以解决
性能一致性模型
即系统吞吐能力、响应延迟、QPS等
可用性
可扩展性
一致性
分布式环境下,一致性指的是数据在多个副本之间是否能够保持一致的特性,对于一个将数据副本分布在不同节点的系统上来说,如果对一个节点的数据进行了更新操作,却没有使得第二个节点上的数据得到响应的更新,那么此时在读取第二个节点的数据时,将会出现脏读现象(即数据不一致).那么一致性又分为以下几种:
强一致性
即写操作完成后,读操作一定能够读到最新的数据,在分布式场景下,很难实现;Paxos、Quorum机制、ZAB协议能够实现,后面会对这几种协议算法进行讲解 。
【十分钟搞定分布式一致性算法】弱一致性
不承诺立即可以读到写入的值,也不承诺多久后能达到数据一致,但会尽可能保证某个时间级别后,数据达到一致状态
读写一致性
用户读取自己写入结果的一致性,保证用户能够第一时间看到自己更新的内容;这种实现的解决方案有:一种方案是对于特定的内容,我们去主库查询
设置一个更新时间窗口,在刚更新的一段时间内,默认去主库读取,过了这个窗口后,挑选最近更新的从库进行读取
直接记录用户更新的时间戳,在请求的时候把这个时间戳带上,凡是最后更新时间小于这个时间戳的从库都不响应
单调读一致性
本地读到的数据不比上次读到的旧,多次刷新返回旧数据会出现灵异事件,对于这种情况可以通过hash映射到同一台机器上
因果一致性
如果节点A在更新完某个数据后通知了节点B,那么节点B之后对该数据的访问和修改基于A更新的值 。此时,和节点A无因果关系的节点C的数据访问则没有这样的限制
推荐阅读
- 五分钟9步搞定nginx正向代理配置
- 分布式数据之缓存技术,今天就一起来揭开其神秘面纱
- 电脑蓝黑屏只会重启?3种方法教你轻松搞定,不花一分钱
- 据说让你抓狂的Nginx性能调优,我却这么轻松就搞定了
- MySQL还能实现分布式锁?
- 十分钟超有效瘦身瑜伽怎么做
- 「分布式计算」什么是严格一致性和最终一致性?
- 烂大街的Nginx+Redis分布式锁+MQ+MDB架构设计
- 「分布式架构」“一切都是分布式”说最终一致性
- 图解Raft:应该是最容易理解的分布式一致性算法