分布式基础
1.背景
需要系统性学习一方面知识了,因此整理下自己的知识点,总结下。
2.知识点
分布式基础中主要涉及的是理论知识,也是平时接触到的一些理论知识,这些理论说有用吧,平时也咋用不上,说没用吧也挺利于理解各种系统底层架构,所以总结下来还是有用的。
2.1.分布式系统简介
分布式系统说的是在高并发大数据量的情况下,集中式的单台服务已经无法支撑系统的运行,需要将单个服务拆分成多个服务,多个服务之间通过RPC或者MQ等方式进行通信实现数据的交互。
分布式系统核心是扩展性,即可以通过扩展服务,扩展存储等方式提高系统的处理能力,通过多台服务器实现高并发,大数据量的处理。
在分布式系统中还存在数据一致性,系统可用性等问题,因此在这种情况下需要考虑该系统要如何保证服务的运行,因此就有大佬提出了各种基础理论CAP、BASE。
2.2.CAP理论
CAP理论基本上做程序员的都听过的一个词语,它是三个单词的拼接,CAP分别代表:Consistency、Availability、Partition Tolerance,翻译过来就是一致性、可用性、分区容忍性。三个词语的解释如下:
-
一致性:在分布式系统中,该系统中的每个节点看到的数据都是一致的。如果对一个节点更新了数据,那么在同一时间其他节点也应该同步更新成一样的数据。举个栗子,分布式系统中三个节点A、B、C,对节点A更新数据value=1,那么B、C节点也应该在同一时间更新value=1。所以一致性强调的是一个时间点上所有节点数据一致。
-
可用性:可用性讲的是分布式系统中如果节点宕机,那么发送到给该系统的请求也应该及时响应成功。因此可用性强调的是任何时候任何请求服务系统都能给到及时响应。
-
分区容忍性:在分布式系统中各个节点会出现网络问题服务无法通信的情况,出现这种情况下整个系统也应该可以提供一致性或者可用性的功能。而不是整个系统无法提供服务。分区容忍性强调的是出现网络分区的情况下分布式系统也要提供应有的功能。
三个词语解释了意思,那么另外一层就是CAP理论中最多只能满足其二,而不能同时都满足,并且由于分区容忍性的特性,导致CAP要么满足AP,要么满足CP(其实就是网络不稳定),在出现分区容忍性的情况下,分布式系统要么只能提供一致性,要么只能提供可用性。
具体为啥不能同时提供:满足一致性的时候强调的是同一时间点的数据一致,满足可用性的时候强调的是整个系统啥时候都能提供服务,那么反推法,如果出现网络分区,那么导致同一时间点内所有节点没法保持一致,那么就导致没法保证一致性了,如果为了保证一致性,那么服务就不可用了。
2.3.BASE理论
CAP要求的是要么成功,要么失败的情况,这种情况下太绝对了,所以需要中和一下,所有就有了BASE理论。
BASE就是用来中和CAP那绝对的一致性或者可用性的。BASE也是三个单词的拼接,分别是:Basically Available、Soft State、Eventually Consistent,翻译一下就是基本可用性、软状态、最终一致性。三个词语解释如下:
-
基本可用性:基本可用性就是对CAP中一致性的中和,加了基本两个词就是能用就行,只要能提供服务就行,其它不过多要求。比如高并发、大流量下的系统能保证系统正常就可以,即使出现RT较高,或者服务降级等问题都可以接收。
-
软状态:软状态简单理解就是一种中间态,CAP的一致性中只有两个状态,要么一致,要么不一致,软状态就是在中间加了一个状态,通过这种中间调和的情况下保证系统的可用性,即分布式系统中允许多个节点数据之间存在短暂数据不一致。
-
最终一致性:前面说了既然通过软状态保证了可用性,但是也要保证数据的一致性,所以就有了最终一致性,这个可以理解为既然软状态是一种中间态,那么这个中间态最终要变成某种状态才算结束,那么就通过最终一致性进行保证,保证请求的最终结果是一致的即可,中间状态可以不纠结。这个最终一致性有点类似ACID,就是一个事务中,只要保证事务提交后最终的结果是正确的即可。
CAP和BASE理论为分布式系统提供了方向,这个方向指示分布式系统需要满足的特性到底是一致性、可用性还是最终一致性的问题。
2.4.paxos算法
没理解透彻
2.5.zab协议
zab全程zookeeper automic brodercast(zookeeper原则广播协议),zab协议是支持zookeeper创造的一种一致性算法,该算法基于paxos算法实现的,zab协议的核心思想也是基于中心化实现的,即通过leader角色进行保证一致性。在zab中存在三种角色分别是Leader、Follower、Observer三种角色,其中Leader是负责掌控全局的角色,所有的操作都经过Leader进行收口执行,然后Leader同步给各个Follower,在同步时则通过一致性算法保证数据的一致性。
因此通过上图可以看到客户端的所有请求都是先进入Leader进程中,然后Leader进行负责处理逻辑,然后将数据同步给其它Follower,如果期间发生Leader宕机或者Follower崩溃时,都会通过zab协议保证数据的一致性。
zab协议分为两部分,分别为消息广播和崩溃恢复:
消息广播:消息广播顾名思义就是将消息进行广播,说的是Leader收到客户端请求时,Leader将该请求转化为消息的方式广播给所有的Follower,当收到Follower反馈时再判断是否需要commit,这个反馈的判断也是一半以上的Follower都反馈可以提交后,Leader才会通知所有的Follower可以进行提交,这样Leader将收到的客户端请求广播给了所有的Follower,同时又保证了数据的一致性。
zab中是如何实现消息广播的呢,首先在zab中定义了一个对象zxid,zxid是zab定义的一个概念,是用来作为消息传递的一个事务编号,该编号是一个64位的二进制数,同时64位的二进制又区分了不同的概念,前32位代表了Leader的任期,即每换一个Leader该值就+1,因此在zookeeper中只要出现Leader选举,那么就需要将zxid的前32位的值+1,这样保证永远使用的是最新的一个Leader,同时每个Follower也都只认可zxid最大的那个。后32位代表的是消息的编号,在zookeeper中Leader每收到依次消息,并同步给Follower时该值就会+1,这样保证了Follower处理Leader的消息时不会错乱,因为在zookeeper中这样每次+1都保证了唯一从而形成了一个唯一的事务。
zxid的结构如下:
前面介绍了消息广播的结构体,那么消息广播是如何实现的呢?在zookeeper中实现消息广播并不是Leader同步调用Follower,而是通过增加队列的方式进行了异步化处理,这样主要是为了保证高可用性,如果使用同步调用的方式,那么Folower的压力会骤增,影响Follower的稳定性,造成出现频繁的崩溃恢复。Leader为每个Follower开辟了一个消息队列,Leader会将消息发送到同步队列中,由Follower来控制处理消息的能力。但是这里Leader并不是不关心Follower处理消息的状态,只不过通过回调的方式进行了处理,即Leader发送消息给每个消息队列,当Follower收到这条消息并持久化磁盘之后,再返回一个ACK响应给到Leader,那么此时消息才算同步完成,通过异步回调的方式保证了消息的持久化性,从而避免了消息丢失的风险。
异步化过程如下:
崩溃恢复:崩溃恢复字面意思就是崩溃了再恢复,崩溃的角色是Leader,恢复的是整个系统。例如在zookeeper中如果Leader节点宕机,那么分布式系统就无法收到客户端的请求,这样就导致整个系统崩溃,为了保证系统的稳定,此时需要重新选举Leader节点与客户端建立连接。zab的选举机制与paxos算法相似也是通过投票的方式,都是通过投票、发送、统计、校验、选举过程执行的。
- 首先每个Follower都进行投票,并且投票时都投自己,然后将该投票发送给所有的机器,每个机器上的zxid大概率不同
- 整个集群中收到投票后开始处理投票,处理投票的过程就是对比zxid的过程,前面说到了zxid的前32位是Leader任期,后32位是消息事务ID,那么首先对比的就是zxid的前32位,先选出前32位最大的,如果前32位相等,那么再选后32位最大的(后32位最大是保证看哪个机器上有最新的消息,这样将有最新消息的机器选举为Leader可以保证数据的一致性),如果后32位也相等,那么就对比myid哪个大,选myid最大的机器(myid来自zookeeper的配置文件zoo.cfg),这样选出最大的一个机器后进行投票,一直到一个机器得到的票数达到了集群中的半数,那么该机器会成为Leader。
- 选举成功后并没有结束,因此需要新Leader需要将数据同步给所有的Follower,同步之后才能保证数据的一致性。同步的过程就是zookeeper中的数据同步的过程。
崩毁恢复过程如下:
数据同步完成后,则完成了崩溃恢复的过程,此时zookeeper服务可以提供服务进行正常流转。
2.6去中心化
前面提到的Paxos算法以及zab协议,都是基于中心化实现的,也就是在整个分布式系统中选出一个Leader或者Master作为主导者维持系统的一致性,因此这就存在Leader或者Master宕机的情况,因此在分布式系统中数据不一致主要是在宕机时无法通过主导者维持数据的一致性,Paxos和zab协议都基于这种情况提出了相应的解决方案。 那么有没有一种部根据主导者实现的分布式算法呢?
去中心化的一个具体的实现就是分布式记账技术,该技术主要的核心点在于整个分布式系统中每个节点都具有记账的功能(而不是只有主导者才能记账)。一个代表的分布式记账技术实现的系统就是区块链。
参考资料
1.拉勾网分布式课程