职业生涯规划JavaJava架构技术进阶

图文详解分布式一致性算法,这种方式你确定不搞一下?

2020-07-23  本文已影响0人  Java余笙

集中式与分布式

集中式

就是将所有的业务都部署在一个中心主机(节点)上,所有的功能都由这个主机集中处理。

特点

部署结构简单、不需要考虑多个主机之间的分布式协作问题。

分布式

分布式系统:指将硬件或者软件组件部署在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。

特点

  1. 分布性:多台计算机可空间上随意分布,跨机房、跨城市都可以。
  2. 对等性:分布式系统中没有主/从之分,都是对等的节点或者服务。 副本:指分布式系统对数据或服务冗余,以此提供高可用。数据副本:是指在不同的节点上持久化一份数据,当某一个节点上存储的数据丢失时,可以从副本上读取到该数据,这是分布式系统数据丢失问题最为有效的手段。服务副本:指多个节点提供同样的服务,每个节点都有能力接收来自外部的请求并进行相应的处理。
  3. 并发性:分布式系统中的多个节点,可能会并发地操作一些共享资源,诸如数据库或分布式存储等。
  4. 缺乏全局时钟:一个典型的分布式系统是由一系列在空间上随意分布的进程组成,进程彼此之间通过消息进行通信。因此,无法判断两个事件谁先谁后。可使用逻辑时钟。
  5. 故障总是会发生:除非需求指标允许,在系统设计时不能放过任何异常情况。如宕机、网络分区、网络超时等。

每一次分布式系统的请求与响应三态:成功,失败,超时。

超时情况:

  1. 没有成功发送到接收方,在发送过程中发生信息丢失。
  2. 成功发送到接收方,并成功处理,但返回给发送方过程中发生信息丢失。

所以需要有幂等。

分布式事务

分布式事务是指事务的参与者支持事务的服务器资源服务器以及事务管理器分别位于分布式系统的不同节点之上。通常一个分布式事务中会涉及对多个数据源或业务系统的操作。分布式事务也可以被定义为一种嵌套型的事务,同时也就具有了ACID事务的特性。

CAP理论

分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然需要保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。

网络分区:是指在分布式系统中,不同的节点分布在不同的子网络(机房或异地网络等)中,由于一些特殊的原因导致这些子网络之间出现网络不连通的状况,但各个子网络的内部网络是正常的,从而导致整个网络的环境被切成了若干个孤立的区域。

定理:任何分布式系统只可同时满足二点,没法三者兼顾。

需要根据实际业务进行取舍。

BASE理论

BASE思想主要强调基本的可用性,如果你需要High 可用性,也就是纯粹的高性能,那么就要以一致性或容错性为牺牲。

一致性协议

一致性协议:为了使基于分布式系统架构下的所有节点进行事务处理过程中能够保持原子性和一致性而设计的一种算法。通常有二阶段提交协议、三阶段提交协议、PaxosZookeeper的ZAB协议、Raft、Pbft等。

2PC、3PC引入了两个概念。

协调者:负责统一调度分布式节点的执行逻辑

参与者:被调度的分布式节点

2PC:Two-Phase Commit二阶段提交协议

二阶段主要采取:先尝试,后提交。

2PC优缺点

3PC:Three-phase Commit 三阶段提交协议

因为2PC有很多问题,所以在2PC基础上,改进为3PC:canCommit、preCommit、doCommit三个阶段。

改进点:

  1. 3PC是将2PC的第一阶段分为两个阶段,先发起事务询问,再执行事务。
  2. 同时在协调者、参与者中引入超时机制。
3PC-第一阶段 3PC-事务中断1 3PC-第三阶段 3PC-事务中断2

3PC优缺点

所以2PC、3PC各有优缺点,可根据实际业务场景进行选择。既然2PC、3PC都会产生数据不一致。下面我们来看一看分布式领域常用的一致性算法。

Paxos算法

Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的基于消息传递具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一。 Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。

Paxos以及下面的RAFT都假设不存在拜占庭将军问题,只考虑节点宕机、网络分区、消息不可靠等问题。属于CFT(Crash Fault Tolerance)算法。

系统中有三种角色proposers,acceptors,和 learners。可以一个节点多个角色。

  1. proposers 提出提案,提案信息包括提案编号和提议的 value;
  2. acceptor 收到提案后可以接受(accept)提案,若提案获得多数派(majority)的 acceptors 的接受,则称该提案被批准(chosen);
  3. learners 只能“学习”被批准的提案。

多数派:指 n / 2 +1 。n为总节点数量。

Paxos算法分为两个阶段。具体如下:

注意:Proposer可以随时丢弃提案,并且提出新的提案;Acceptor也可以随时响应,接受编号更大的提案。

思考:如果两个Proposer还处于第一阶段时,互相提出编号更大的提案?会发生什么?

这时候会出现“活锁”状态,陷入了无限死循环中(破坏了算法活性)。

那需要怎么防止呢?

可以选出一个主Proposer,只有主Proposer可以提出提案。

至于怎么选择,不属于Paxos的范畴,可以参考RAFT使用竞选,谁快谁当选;也可以参考PBFT的依次成为leader等。

RAFT算法

RAFT算法分为两个阶段:Leader选举,日志复制。也有三种角色,分别为:

  1. Leader(领导者):负责发送要进行共识的数据,如果客户端发送的数据不是发送到Leader而是其他角色,其他角色会进行转发至Leader。
  2. Follower(追随者):参与共识的角色
  3. Candidate(候选者):如果Follower没有收到Leader的心跳响应超过150——300ms,会进行Leader选举。

每个节点的身份都可以是以上三种中的其一。

我这里只是对于算法正常流程的描述,强烈推荐动画版RAFT(看不懂算我输,不过记得回来点个赞,哈哈哈)

总结

本文从集中式到分布式理论CAP、BASE以及2PC、3PC流程,描述了分布式事务常用的思想;再详细说明了Paxos以及Raft算法流程等。Paxos以及Raft算法属于CFT算法范畴,都能容忍最多n/2(向下取整)的节点出现宕机、网络分区等的强一致性算法。Paxos属于比较晦涩的算法,工程实现比较复杂,但其思想很有借鉴意义。有兴趣的可以去看看Paxos的推导过程,个人认为很有意思,能够想明白每一步,对于理解其他算法,也大有帮助;也可以去看看Zookeerper的ZAB算法,后面有机会专门写一篇。但这些算法不能真正意义上用于区块链共识,毕竟leader说什么,其他节点就会执行,没有节点之间的共识过程。那什么算法可以用于区块链共识呢?

参考书籍

《从Paxos到Zookeeper++分布式一致性原理与实践++》

作者:9龙
链接:https://juejin.im/post/5f1919ed6fb9a07e9b1ad2b7
来源:掘金

上一篇 下一篇

猜你喜欢

热点阅读