如何在分布式系统中实现容错
扫描二维码
随时随地手机看文章
分布式系统是实现高可伸缩性,局部性和可用性的基本概念。然而,另一方面,当从客户端查看时,整个系统需要很多独创性才能看起来一致。另外,据说构建具有完整特征的分布式系统几乎是不可能的,并且有必要选择应用程序应该强调哪些性能。
除了描述这些分布式系统的特性外,我们还描述了具有高性能的区块链的特性。最后,通过总结容错属性,我们将进一步探索区块链的更大潜力,并希望通过讨论每个高级区块链项目(如Tendermint)全面解释MOLD应该瞄准的系统。
1. 简介(容错概述以及总体流程)
与单个系统不同,分布式系统存在部分故障。单个系统的整体故障往往会导致整个系统崩溃。另一方面,在部分故障中,系统可以在从部分故障中恢复的同时继续操作而不会严重影响整体性能。
在本文中,按照以下顺序,我们将解释容错;即使系统的一部分发生故障,系统也可以继续处理。
・什么样的属性是容错的
・什么样的失败以及它们如何被分类
・关于沟通失败
・“可靠的多播”,增加了进程的抵抗力
・关于分布式提交问题
2. 什么是容错?
容错
容错定义如下
即使发生故障也能够忍受服务
另外,具有容错性的系统有时被称为高可靠性系统,并且与可靠性系统相关的要求分为以下四种。
失败模型
分布式系统中进程的典型故障如下:
通信链路的故障也是分类的。
例如,对于分布式的失败,可能会发生虚假消息的传递,因此最难以处理。
冗余可以隐藏故障。这很容易理解,例如考虑到哺乳动物有两只眼睛,耳朵和肺。即使这些分布式器官中的一些失效,你也可以在隐藏故障的同时使用该系统。这称为物理冗余。冗余有三种类型:信息冗余,时间冗余和物理冗余。
3. 流程弹性
在描述容错之后,我们考虑如何实现容错。
进程复制
典型的方法是进程复制。在组中创建(复制)相同的进程称为复制。通过在分布式系统中复制,即使在部分故障的情况下,也可以通过正常过程提供服务。我们将复制过程称为副本。
复用(复制)有两种方法如下。
・主基础协议(被动复制)
・重复写入协议(PositiveReplicaTIon)
在前的中,只有主副本处理来自客户端的消息,而其他副本备份主进程。虽然复制品之间的处理结果没有不一致,并且通信功能的实现更容易,但是主复制品的故障需要选择算法,并且处理有些复杂。
在后一种情况下,所有副本都会从客户端接收和处理消息。此时,基于消息的处理需要总排序和原子性的两个属性。因此,原子多播需要更复杂的通信功能。
k容错
在重复写入协议中,据说具有k个容错,即使它们失败,k个组件也能正常移动。如果你有分布式故障,则至少需要2k+1个进程才能具有k容错能力。
原子组播问题
作为上述复制模型的前提,存在所有请求必须以相同顺序到达所有服务器的条件。这称为原子多播问题。这将在第5章中详细讨论。
流程之间的协议
进程之间协议的问题对于赋予分布式系统容错性是至关重要的。分布式协议算法的目的是在有限数量的步骤中达成共识,以实现彼此之间没有失败的过程,并且在代表性过程中存在一般分布式的问题。
分布式的一般问题
在具有k个错误进程的系统中,仅当存在2k+1个或更多正常进程并且整体上存在N=《 3k+1个进程时才达成协议。换句话说,只有超过三分之二的进程正常工作才能达成协议。(如果小于该值,则可能会因失败的过程而受到欺骗。)
附录:关于容错所需的正常节点数
对于许多协议,具有分布式阻塞的最大允许节点数被称为1/3。原因将在下面简要描述。
设“N”为节点总数,“F”为分布式节点,“T”为正常共识所需的节点数。
例如,假设“N-F”的正常节点被分成相同的数字,并且数字表示如下。
(N-F) / 2
由于“F”的分布式节点具有任意行为,为了正常地达成共识,必须满足以下表达式。
T 》 (N-F)/2 + F ・・・①
此外,考虑到F的所有分布式节点都处于离线状态的情况,其他正常节点可以采用共识,因此以下表达式成立。
N-F ≥ T ・・・②
从①·②,
N−F 》 (N−F)/2 + F
∴F 《 N3
基于上述,当总节点中分布式节点的数量小于1/3时,可以正常地达成共识。
4.可靠的客户端-服务器通信
到目前为止,我们讨论了分布式系统中进程的容错能力,并了解了复制。本章讨论了通信链路上容错的介绍。
P2P通信
分布式系统中的通信基础是连接一个进程和另一个进程的点对点通信(一对一通信)。
TCP
TCP:实现可靠通信的点对点通信
TCP具有序列号,定时器,校验和,确认,重传控制,拥塞控制等机制。例如,由于丢失消息而导致的遗漏失败可以通过包括TCP序列号的确认和基于确认的重传控制来处理。
发生故障时的RPC(远程过程调用)
RPC的目的是通过本地过程调用的形式实现进程间通信而不需要意识到通信部分。在使用RPC的分布式系统中可能会发生五个障碍。
1. 客户端无法找到服务器。
2. 从客户端到服务器的请求消息将丢失。
3. 收到请求后服务器崩溃。
4. 从服务器到客户端的响应消息将丢失。
5. 在客户端发送请求消息后发生故障。
作为对每个的对策,存在设置异常处理和计时器(时间限制)的方法。
5.可靠的团队沟通
我们在前一章中专注于一对一通信,因此我们在此解释一对多多播通信的高可靠性。在分布式系统中,重要的是发送消息而不会泄漏,包括订单到彼此的服务器。
在没有故障的情况下可靠的多播
考虑按顺序向每个成员发送消息。
发送方首先将多播消息保存在手头的历史存储器中。此外,发送方从接收方接收传输确认通知(ACK)。在ACK中,输入并返回最后一个消息标识符已完成传输。如果由于消息丢失等而无法接收到包含预期标识符的ACK,则发送方重新发送该消息。
确保来自发件人的邮件以相同的顺序传递给所有进程。
在分布式系统中,不是“一个过程”
具有“何时”发送方“在消息传递期间失败,该消息被传递到所有剩余进程或被忽略”的属性的可靠多播称为虚拟同步。
此外,作为虚拟同步并以总顺序执行消息传递的通信称为原子多播。
虚拟同步的一个实现示例是Isis。Isis保留并转移mmessageM进行处理,直到它知道所有成员都收到了消息M.
6.分布式提交
推广原子多播问题的问题称为分布式提交问题。
原子提交
有必要终始如一地判断不同的类似站点的进程是否一致地提交或中止。这种操作称为原子提交。
6–1.两阶段提交协议(2PC)
两阶段提交协议(2PC)是实现原子提交的典型方法。顾名思义,每个阶段包括两个步骤,组织如下。
(第1阶段【投票阶段】)
组织者向所有参与者发送VOTE_REQUEST消息
2. 收到VOTE_REQUEST消息的参与者如果能够提交其交易并通过发送VOTE_ABORT消息进行投票(如果需要中止),则向组织者发送VOTE_COMMT消息。
(第2阶段[提交阶段])
3. 组织者收集所有参与者的投票。如果所有投票都是COMMIT,我们自己承诺并向所有参与者发送GLOBAL_COMMIT消息。如果ABORT甚至多于一个,它决定中止交易并发送GLOBAL_ABORT消息。
4.参与者等待来自组织者的消息,如果它是GLOBAL_COMMIT本地,则提交,如果它是GLOBAL_ABORT则丢弃该交易。
在整个过程中,组织者和参与者进行如下状态转换。
阻止提交协议
上述两阶段提交协议存在很大问题。当组织者在阶段3中失败并且所有参与者都在等待来自组织者的消息时。,参与者不能合作决定应该最终采取的行动决定。据此,两阶段提交被称为阻塞提交协议。
实际上,在两阶段提交中阻塞自身很少发生,因此它没有被大量使用,但是设计了三阶段提交协议作为避免阻塞的解决方案。
6–2.三阶段提交
与两阶段提交协议不同,三阶段提交协议满足以下两个条件。[Skeen和Stonebraker,1983]指出,这两个条件对于没有阻塞的提交协议是必要和充分的。
1. 没有直接进入COMMIT状态或ABORT状态的情况。
2. 没有可能做出最终决定,也没有转换到COMMIT状态的状态。
SKEEN,D.andSTONEBRAKER,M”AFormalModelofCrashRecoveryinaDistributedSystem.”IEEETrans.Softw.Eng.,Mar.1983
具体地,在两阶段提交的两个阶段之间提供PRECOMMIT状态。
整个参与者和组织者改变状态如下。
两阶段提交的最大区别是所有进程都返回INIT,ABORT,PRECOMMIT状态。由于它永远不会处于READY状态,因此剩余的进程始终做出最终决定,并且可以充当非阻塞协议。
三阶段提交仅仅是一个概念表示,即使组织者失败,也没有正常工作的机制。然而,在区块链出现之后,它的历史将会发生很大变化。Tendermint项目通过在区块链中采用三阶段提交来实现非阻塞协议。
7.区块链中的容错
最后,基于上述内容,我们还将参考分布式区块链系统中的容错。
7–1.区块链容错
区块链的容错性很高。让我们根据第2章中分类的四个可靠性要求,仔细研究区块链的性质。
区块链系统停止运行的时间和数量很少。特别是在比特币网络中,可以说很少有高可用性和可靠性,因为即使某些节点出现故障,它也能实现零停机并继续正常运行。
接下来,关于安全性,当系统在区块链网络中不能正常运行时,将出现诸如“交易未被处理和阻塞”,“网络中的节点之间不共享信息以及分叉的分块”之类的问题。后者极有可能导致重大麻烦。
关于可维护性,可以说社区很容易划分,比如像比特币这样的公共区块链,并且难以从中恢复。比特币网络可以高度赞赏,因为它具有高可用性和可靠性,因此不需要恢复,但如果你希望具有可维护性,则应考虑选择私有链或联盟链。
此外,区块链非常有意义,因为它为分布式断层提供了有效的解决方案,这被认为是最难处理的。具体来说,它是以PoW等为代表的一致性算法……通过形成激励结构来处理分布式的一般问题;通过维持/贡献而不是基于博弈论破坏网络的行动,矿工凸轮获得更多利润的算法。应该注意的是,诸如硬叉之类的新问题正在发生,然而,可以说它已经取得了一定的成功。此外,
Hyperledger采用的PBFT也通过设置领导节点确认投票来实现高分布式容错。
7–2.Blcokchain流程弹性
考虑如何在容错描述之后实现容错。
首先,有两种处理复制的方法。
1.主要基础协议
2.重复写入协议
采用1的主基础协议的主要协议是基于PoW一致性算法的区块链。在PoW的情况下,它是主要基础中的本地写协议的规范。成功找到PoW的nonce值作为独占控件(领导者选择算法)的矿工获得了将区块添加为主服务器的权利。但是,当有权成为主服务器的节点同时出现时,区块链会分叉。
另一方面,采用2的重复写协议的是基于PBFT的区块链。包括Tendermint在内的各种基于PBFT的共识算法没有主要服务器首先负责地执行每个数据的更新,并且所有参与节点可以在同一时段执行写操作。也就是说,可以说PBFT类型一致性协议类似于重复写入类型的活动复制协议。
7–3.区块链高可靠性通信
我已经提到了区块链的过程,但这次我将重点关注通信链接。
在区块链中,参与网络的每个节点执行P2P通信并共享数据。另外,由领导者选择算法选择的主服务器执行多播,以便例如在找到随机数时将新添加的 区块的信息共享给每个参与节点。此时,考虑到在通信链路或节点中发生故障的情况,重要的是实现原子多播,其是虚拟同步并且以总的顺序执行消息传递。
那么,区块链中的原子多播问题和分布式提交问题是如何解决的呢?
在采用比特币等PoW的公共链中,原子多播尚未实现。因此,可能会发生频繁的叉子。由于每个节点随时间正确地共享数据,因此建立了一致性,但确认交易存储在区块中需要10分钟以上。
在这里,我们要关注Tendermint一致性算法。通常,存在2PC(两阶段提交)作为实现原子提交的方法,并且已经提出了作为改进版本的3PC方法,但两者都是不完整的。因此,Tendermint通过将区块链与3PC方法混合并在循环方法下在节点上添加约束来实现原子提交。下一章将解释这个创新分布式提交问题的方法。
7–4.Tendermint中的分布式提交(创新的三阶段提交模型)
首先,Tendermint是PBFT类型。在Hyperledger中,作为领导者的验证者始终是相同的过程,但是Tendermint具有领导者选择算法,并且通过循环法确定性地确定领导者。领导者共同提出存储在mempool中的下一个交易块。有了这个提议,Tendermint共识实现了3PC(三阶段提交)并实现了原子组播。Tendermint一致性算法可以大致分为三种状态。
1. PROPOSE
通过基于桩数的领导者选择算法通过循环法确定性地选择的验证器集的提议。在这种状态下开始投票。
2. PRE-VOTE
拟议区块的第一次投票。一旦获得三分之二或更多的批准,我们将继续进行下一步,但要等到收集所有选票的限制时间。由于这个时间限制,可以说Tendermint是部分异步一致性算法。此外,该投票算法具有1/3k的容错能力。
3. PRE-COMMIT
在预投票中超过2/3的同意第二次投票。此时,如下所述,当未收集2/3或更多的投票时,Tendermint的智能部分是一种衡量标准。
如前所述,通过为三阶段提交设置PRECOMMIT阶段,如果满足以下条件,则可以实现阻塞协议。
1. 没有直接转换为COMMIT状态或ABORT状态的状态
2. 没有可能做出最终决定,也没有转换到COMMIT状态的状态。
在Tendermint中,在第二个投票阶段投票的验证者Pre-Commit被锁定,并且只能在预投票中投票获得超过2/3票数的锁定区块或区块。通过锁定处理,满足上述两个条件。换句话说,由于每个验证器始终只能在预先提交中对一个块进行投票,因此它不会实现分叉机制。
换句话说,“Tendermint共识是确保添加区块的操作在网络中的所有节点上完成,或者根本没有节点完成;实现最终结果的下一代共识协议。