首页系统综合问题深入剖析迅雷链共识算法 直抵区块链技术灵魂

深入剖析迅雷链共识算法 直抵区块链技术灵魂

时间2023-09-10 20:21:14发布分享专员分类系统综合问题浏览129

今天小编给各位分享免费迅雷会员激活码的知识,文中也会对其通过深入剖析迅雷链共识算法 直抵区块链技术灵魂和迅雷在区块链这方面有哪些优势吗?谢谢了。等多篇文章进行知识讲解,如果文章内容对您有帮助,别忘了关注本站,现在进入正文!

内容导航:

  • 深入剖析迅雷链共识算法 直抵区块链技术灵魂
  • 迅雷在区块链这方面有哪些优势吗?谢谢了。
  • 北大青鸟设计培训:区块链技术中的共识算法?
  • 区块链 --- 共识算法
  • 一、深入剖析迅雷链共识算法 直抵区块链技术灵魂

     共识算法是所有区块链的基础,它们构成了区块链平台中的最重要部分。迅雷链采用独创的同构多链框架,而且通过优化的DPoA+PBFT共识算法实现了秒级确认。本文从技术层面深度剖析共识算法的背景、原理及分类,以及迅雷链PBFT算法的详细解读。

    区块链是一种由多节点共同维护,共同信任的分布式存储系统,它可以用于登记和发行数字化资产、产权凭证、积分等,并以点对点的方式进行转账、支付和交易。

    区块链系统与传统的中心化账本系统相比,具有完全公开、不可篡改、防止多重支付等优点,并且不依赖于任何的可信第三方。

    由于点对点网络下存在较高的网络延迟,各个节点所观察到的事务先后顺序不可能完全一致。

    因此区块链系统需要设计一种机制对在差不多时间内发生的事务的先后顺序进行共识。这种对一个时间窗口内的事务的先后顺序达成共识的算法被称为“共识算法”。

    共识算法在区块链系统中的位置图

    共识算法通常被应用在分布式系统中,区块链系统从广义上也可以被看做一个分布式系统。

    共识算法保证区块链系统中每一个节点之间事务记录的一致性,同时起到防范系统遭受诸多种类的安全攻击,包括拜占庭攻击、女巫攻击、51% 攻击等。

    共识算法背景

    CAP定律

    CAP 定律(Consistency,Availability,Partition Tolerance theorem),说的是在一个分布式计算机系统中,一致性,可用性和分区容错性这三种保证无法同时得到满足,最多满足两个。

    其中,分区容错性指的是在网络中断,消息丢失的情况下,系统照样能够工作;一致性说的是分布式系统中,所有节点在同一时刻看到同一个值;可用性说的是每个请求都会收到一个应答,无论该应答是成功还是失败。

    而对于分布式数据系统,分区容忍性是基本要求,否则就失去了价值。因此分布式数据系统在一致性和可用性之间取一个平衡,不可能二者同时达到。

    对于迅雷链而言,数据在任何时刻的不一致都是一种不好的用户体验,因此迅雷链选择保证数据绝对一致性,并以提高强一致性算法的可用性为努力的方向。

    FLP 不可能原理

    在网络可靠,存在节点失效(即使只有一个)的最小异步模型系统中,不存在一个可以解决一致性问题的确定性算法。即:

    异步分布式系统不存在任意场景下都能实现共识的算法。在异步网络环境中只要有一个故障节点, 任何共识算法都无法保证正确结束。

    因此,在迅雷链中,选用了实用拜占庭容错算法(PBFT),一方面通过容错性,降低节点失效对整个分布式系统的影响,另一方面采用多次重试和更换失效节点机制,降低节点间长时间失效的概率,保证系统的可用性。

    状态机复制

    状态机复制是一项很有效的容错技术。

    在这个模型中,程序(比如一个 apache server)被视为一个一致性状态机,意思就是给程序一定顺序的输入请求 ,程序执行后相关处理数据结果就会在多个节点中达成一致的状态。

    也就是说如果给予每个节点的输入请求序列顺序一致,在执行相同操作的前提下,这些节点就会达成相同的状态。

    每个节点都包含一个状态机,在节点间共识数据的结果将在状态机中体现。状态机中的数据将是外界获取数据的来源。

    共识算法分类

    在区块链系统中,共识算法作为保证分布式节点间数据一致性的算法,可以被分为两大类,即概率一致性算法和绝对一致性算法。

    概率一致性算法指在不同分布式节点之间,有较大概率保证节点间数据达到一致,但仍存在一定概率使得某些节点间数据不一致。

    对于某一个数据点而言,数据在节点间不一致的概率会随时间的推移逐渐降低至趋近于零,从而最终达到一致性。

    例如工作量证明算法(Proof of Work, PoW)、股份证明算法(Proof of Stake, PoS)和委托股权证明算法(Delegated Proof of Stake, DPoS)都属于概率一致性算法。

    而绝对一致性算法则指在任意时间点,不同分布式节点之间的数据都会保持绝对一致,不存在不同节点间数据不一致的情况。

    例如分布式系统中常用的 PAXOS 算法及其衍生出的 RAFT 算法等,以及拜占庭容错类算法(类 BFT 算法)。

    一般而言,回顾上面所述 CAP 原理,概率一致性算法保证了系统的可用性而牺牲了系统的一致性,绝对一致性算法则与之相反,保证了系统的一致性而牺牲了系统的可用性。

    各算法之间对比如下表,★数量越多,代表相应对比项表现越好。

    迅雷链的业务需求保证分布式系统中的强一致性,并具备一定的容错和防拜占庭节点作恶的能力,因此选择类 BFT 算法作为共识算法。

    在实用拜占庭容错(PBFT)算法的基础上,为了解决算法网络消耗高的问题,作出了一些优化,提高了算法的可用性。

    下面首先介绍区块链中最常用的强一致性算法——实用拜占庭容错(PBFT)算法。

    PBFT 算法介绍

    假设系统中节点数量为 R=3f+1,其中 f 为系统中拜占庭节点的数量。

    在发送消息的时候通过环境状态、时间戳、请求、回复信息,客户端同样等待 2f+1 个回复,同时保证签名、时间戳、回复信息来保证一致。

    这里存在两种情况,一种是客户端请求超时,那就再发送一次,如果是主节点 P 出故障,那就改变环境状态,新选一个 P 节点。保证第二次的执行过程。

    在实际的算法流程中,PBFT 算法定义三个任务阶段:预准备(pre-prepare)、准备 (prepare)、确认 (commit)。

    预准备:P 分配一个系统序列号 ID,发送给所有 B 节点。

    发送格式(环境状态、ID、信息摘要、客户端请求)。B 节点验证信息摘要和客户端请求一致,验证当前环境状态编号。

    准备:B 节点在接收信息后加上自己的消息日志,发送至其余节点。P 和 B 节点同时验证消息签名,如果一致,那么就把验证通过写入消息日志。每个节点在准备阶段对每个副本节点验证预准备的消息和准备消息一致性检查完毕。

    确认:在前面两个极端一切正常的话,在同一系统环境中,所有请求序号一致,验证消息一致,简单理解就是确认 2f+1 个节点发送了之前发送的序号和消息。

    每个节点接受确认消息,签名正确;消息的系统环境编号 V 与节点的环境编号 V 一致;消息的序号 ID 满足序列要求。节点通过确认至少 2f+1 个副本信息,保证整个系统中算法的正确性。

    图中,C 是客户端,0、1、2、3 是分布式系统中的节点成员,其中由 0 节点提议区块,,1、2、3 节点对提议出来的区块进行投票,其中 3 节点已发生故障。我们默认 3 发送信息为无效。那么 PBFT 算法执行的流程如下:

    C 发起一笔请求到 0 号节点。

    节点 0 开始对请求排序编号,并把请求序号发送到 1、2、3 节点。

    1、2 节点互相之间和 0 节点之间发送消息。

    0、1、2 之间确认 0 节点的分配序号,互相确认。

    0、1、2 确认信息回复 C。

    客户端 C 判断收到确认是否在 2f+1 内,确认结果。

    在每一轮共识分三个阶段达成共识:Pre-Prepare、Prepare 和 Commit,整个流程如下:

    从全网节点选举出一个提议节点(Proposer),新区块由提议节点负责生成。

    每个节点把客户端发来的交易向全网广播,提议节点将从网络收集到需放在新区块内的多个交易排序后存入列表,并将该列表向全网广播。

    每个节点接收到交易列表后,根据排序模拟执行这些交易。所有交易执行完后,基于交易结果计算新区块的哈希摘要,并向全网广播。

    如果一个节点收到的 2f 条来自其它节点发来的摘要都和自己的相同,就向全网广播一条 commit 消息。

    如果一个节点收到 2f+1 条 commit 消息,即可提交新区块及其交易到本地的区块链和状态数据库。

    迅雷链共识算法

    迅雷链采用了同构多链架构,将不同的账户锚定在不同的同构链上,然后接入层将交易路由到发送方所在的链上进行区块打包与共识。

    共识成功的区块中的交易会根据接收方所在的链的不同,跨链转发到相应的链上。若交易接收方与发送方同属于一条链,则不再进行交易转发。

    在每一条同构链上,验证人节点对打包好交易的区块进行共识。共识采用优化过的 PBFT 算法。

    以处于某一区块高度的共识操作为例,由于共识的达成需要超过 2/3 的节点确认,因此每一次共识可能需要多轮投票才能达成。

    与传统的 PBFT 算法类似,对于每一轮共识操作,又包括三个阶段:Propose,Prevote 和 Precommit。

    当在某一轮达成共识 (收到 +2/3 的 Precommit 投票) 后,就会进入对下一个高度的共识,从第 0 轮开始。下面简单介绍下详细的步骤:

    首先介绍关于锁定区块的概念,表示在某个特定的高度和轮数,节点对某个块收到超过节点总数 2/3 的 Prevote 投票集合后,则此节点对于此高度此轮的区块进行锁定。也就是说,节点以锁定区块来表示对某一个区块的认可。

    Propose 阶段:系统中所有验证人节点轮流作为提议者提出提议,而系统中非提议者的节点在收到提议后,就会进入 Prevote 阶段。如果当前节点此前存在已锁定区块,则还需要收集所有针对已锁定区块的 Prevote 投票。

    PreVote 阶段:当节点进入到 Prevote 阶段后,每个节点广播自己的 PreVote 投票。

    具体的,如果当前区块高度或投票轮数高于此前已锁定的区块高度或轮数,则将原锁定的区块进行解锁。

    如果此时节点仍含有未解锁的区块,则对此锁定的区块投 PreVote 投票。或者如果节点收到合法的 Propose 区块,则对此区块投 ProVote 投票。

    当阶段超时或者接收到大于 2/3 的针对某个块的投票后,则节点锁定此区块并进入

    PreCommit 阶段:当节点存在已锁定区块,则对此区块投 PreCommit 投票。当节点收到针对已锁定区块大于 2/3 的 PreCommit 投票是,就可以将这个块 Commit,并且进入针对下一个高度块的共识。

    若 PreCommit 阶段定时器超时,则节点保存已锁定区块,然后重新返回到 Propose 阶段。

    各节点通过在以上阶段上循环,对区块进行一致性共识。与 PBFT 算法类似,迅雷链共识也经过了三阶段提交,但通过引入区块锁定操作,通过缓存待确认区块,降低了未达成共识情况下重复通信区块带来的网络压力,从而提升了共识效率。

    一、迅雷在区块链这方面有哪些优势吗?谢谢了。

    还是有一定的优势的。18年8月15日晚,迅雷公布了未经审计的第二季度财报,总营收为6580万美元,同比增幅达70.7%,创下了连续10个季度保持高速增长的新纪录。其中云计算及其他互联网增值服务(IVAS)板块增幅最大,达186.9%,录得营收3650万美元,继续领跑迅雷整体业务。今年Q1,迅雷云计算及IVAS板块收入首次超过在线广告和会员业务的总和,成为公司整体收入的主要来源。Q2,该板块收入占比再度超过50%,巩固了“主力业务”的地位。与此同时,迅雷的传统业务也维持着稳步增长的态势。财报显示,迅雷会员业务Q2收入为2110万美元,同比增长2.5%;在线广告业务收入820万美元,同比增长57.2%。现在的迅雷因为很多年前迅雷就转型区块链,因为具备先发优势,已获得领先世界的技术成果。迅雷是中国区块链第一股,是第一个all in区块链的领头羊

    二、北大青鸟设计培训:区块链技术中的共识算法?

    关于区块链技术的一些讲解和知识点分析我们已经给大家分享过很多次了。
    今天,南宁java课程就再来了解一下,区块链技术中的共识算法的一些基本定义与特点。
    简单过一下区块链我们一般意识形态中的链是铁链,由铁铸成,一环扣一环。
    形象地,区块链的也可以这么理解,只不过它不是由铁铸成,而是由拥有一定数据结构的块连接而成,这是一个简单的雏形通俗讲解共识所谓共识,通俗来说,就是我们大家对某种事物的理解达成一致的意思。
    比如说日常的开会讨论问题,又比如判断一个动物是不是猫,我们肉眼看了后觉得像猫,其满足猫的特征,那么我们认为它是猫。
    共识,是一种规则。
    继续我们的会议例子。
    参与会议的人,通过开会的方式来达到谈论解决问题。
    对比区块链中,参与挖矿的矿工通过某种共识方式(算法)来解决让自己的账本跟其他节点的账本保持一致。
    让账本保持一致的深入一层意思就是,让链中区块信息保持一致。
    为什么需要共识,不需要可不可以?当然不可以,生活中没了共识的规则,一切乱套。
    区块链没了共识的规则,各个节点各干各的,失去一致的意义。
    这两个例子的对应的关系如下:会议的人=挖矿的矿工开会=共识方式(算法)谈论解决问题=让自己的账本跟其他节点的账本保持一致如果你对节点的概念意思不懂,请先理解为矿工,一个节点内部包含很多角色,矿工是其中之一。
    共识算法目前常见的在区块链中,节点们让自己的账本跟其他节点的账本保持一致的共识方式(算法)有如下几种:PoW,代表者是比特币(BTC)弊端:矿池的出现,一定程度上违背了去中心化的初衷,同时也使得51%攻击成为可能,影响其安全性。
    存在巨大的算力浪费,看看矿池消耗大量的电力资源,随着难度增加,挖出的不够付电费PoS,代表者是以太坊(ETH),从PoW过度到PoS弊端:破坏者对网络的攻击成本很低,拥有代币就能竞争另外拥有代币数量大的节点获得记账权的概率会更大,会使得网络共识受少数富裕账户支配,从而失去公正性。

    三、区块链 --- 共识算法

    PoW算法是一种防止分布式服务资源被滥用、拒绝服务攻击的机制。它要求节点进行适量消耗时间和资源的复杂运算,并且其运算结果能被其他节点快速验算,以耗用时间、能源做担保,以确保服务与资源被真正的需求所使用。

    PoW算法中最基本的技术原理是使用哈希算法。假设求哈希值Hash(r),若原始数据为r(raw),则运算结果为R(Result)。

    R = Hash(r)

    哈希函数Hash()的特性是,对于任意输入值r,得出结果R,并且无法从R反推回r。当输入的原始数据r变动1比特时,其结果R值完全改变。在比特币的PoW算法中,引入算法难度d和随机值n,得到以下公式:

    Rd = Hash(r+n)

    该公式要求在填入随机值n的情况下,计算结果Rd的前d字节必须为0。由于哈希函数结果的未知性,每个矿工都要做大量运算之后,才能得出正确结果,而算出结果广播给全网之后,其他节点只需要进行一次哈希运算即可校验。PoW算法就是采用这种方式让计算消耗资源,而校验仅需一次。

     

    PoS算法要求节点验证者必须质押一定的资金才有挖矿打包资格,并且区域链系统在选定打包节点时使用随机的方式,当节点质押的资金越多时,其被选定打包区块的概率越大。

    POS模式下,每个币每天产生1币龄,比如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000。这个时候,如果你验证了一个POS区块,你的币龄就会被清空为0,同时从区块中获得相对应的数字货币利息。

    节点通过PoS算法出块的过程如下:普通的节点要成为出块节点,首先要进行资产的质押,当轮到自己出块时,打包区块,然后向全网广播,其他验证节点将会校验区块的合法性。

     

    DPoS算法和PoS算法相似,也采用股份和权益质押。

    但不同的是,DPoS算法采用委托质押的方式,类似于用全民选举代表的方式选出N个超级节点记账出块。

    选民把自己的选票投给某个节点,如果某个节点当选记账节点,那么该记账节点往往在获取出块奖励后,可以采用任意方式来回报自己的选民。

    这N个记账节点将轮流出块,并且节点之间相互监督,如果其作恶,那么会被扣除质押金。

    通过信任少量的诚信节点,可以去除区块签名过程中不必要的步骤,提高了交易的速度。
     

    拜占庭问题:

    拜占庭是古代东罗马帝国的首都,为了防御在每块封地都驻扎一支由单个将军带领的军队,将军之间只能靠信差传递消息。在战争时,所有将军必须达成共识,决定是否共同开战。

    但是,在军队内可能有叛徒,这些人将影响将军们达成共识。拜占庭将军问题是指在已知有将军是叛徒的情况下,剩余的将军如何达成一致决策的问题。

    BFT:

    BFT即拜占庭容错,拜占庭容错技术是一类分布式计算领域的容错技术。拜占庭假设是对现实世界的模型化,由于硬件错误、网络拥塞或中断以及遭到恶意攻击等原因,计算机和网络可能出现不可预料的行为。拜占庭容错技术被设计用来处理这些异常行为,并满足所要解决的问题的规范要求。

    拜占庭容错系统

    发生故障的节点被称为 拜占庭节点 ,而正常的节点即为 非拜占庭节点

    假设分布式系统拥有n台节点,并假设整个系统拜占庭节点不超过m台(n ≥ 3m + 1),拜占庭容错系统需要满足如下两个条件:

    另外,拜占庭容错系统需要达成如下两个指标:

    PBFT即实用拜占庭容错算法,解决了原始拜占庭容错算法效率不高的问题,算法的时间复杂度是O(n^2),使得在实际系统应用中可以解决拜占庭容错问题
     

    PBFT是一种状态机副本复制算法,所有的副本在一个视图(view)轮换的过程中操作,主节点通过视图编号以及节点数集合来确定,即:主节点 p = v mod |R|。v:视图编号,|R|节点个数,p:主节点编号。

    PBFT算法的共识过程如下:客户端(Client)发起消息请求(request),并广播转发至每一个副本节点(Replica),由其中一个主节点(Leader)发起提案消息pre-prepare,并广播。其他节点获取原始消息,在校验完成后发送prepare消息。每个节点收到2f+1个prepare消息,即认为已经准备完毕,并发送commit消息。当节点收到2f+1个commit消息,客户端收到f+1个相同的reply消息时,说明客户端发起的请求已经达成全网共识。

    具体流程如下

    客户端c向主节点p发送请求。o: 请求的具体操作,t: 请求时客户端追加的时间戳,c:客户端标识。REQUEST: 包含消息内容m,以及消息摘要d(m)。客户端对请求进行签名。

    主节点收到客户端的请求,需要进行以下交验:

    a. 客户端请求消息签名是否正确。

    非法请求丢弃。正确请求,分配一个编号n,编号n主要用于对客户端的请求进行排序。然后广播一条消息给其他副本节点。v:视图编号,d客户端消息摘要,m消息内容。进行主节点签名。n是要在某一个范围区间内的[h, H],具体原因参见 垃圾回收 章节。

    副本节点i收到主节点的PRE-PREPARE消息,需要进行以下交验:

    a. 主节点PRE-PREPARE消息签名是否正确。

    b. 当前副本节点是否已经收到了一条在同一v下并且编号也是n,但是签名不同的PRE-PREPARE信息。

    c. d与m的摘要是否一致。

    d. n是否在区间[h, H]内。

    非法请求丢弃。正确请求,副本节点i向其他节点包括主节点发送一条消息, v, n, d, m与上述PRE-PREPARE消息内容相同,i是当前副本节点编号。进行副本节点i的签名。记录PRE-PREPARE和PREPARE消息到log中,用于View Change过程中恢复未完成的请求操作。

    主节点和副本节点收到PREPARE消息,需要进行以下交验:

    a. 副本节点PREPARE消息签名是否正确。

    b. 当前副本节点是否已经收到了同一视图v下的n。

    c. n是否在区间[h, H]内。

    d. d是否和当前已收到PRE-PPREPARE中的d相同

    非法请求丢弃。如果副本节点i收到了2f+1个验证通过的PREPARE消息,则向其他节点包括主节点发送一条消息,v, n, d, i与上述PREPARE消息内容相同。进行副本节点i的签名。记录COMMIT消息到日志中,用于View Change过程中恢复未完成的请求操作。记录其他副本节点发送的PREPARE消息到log中。

    主节点和副本节点收到COMMIT消息,需要进行以下交验:

    a. 副本节点COMMIT消息签名是否正确。

    b. 当前副本节点是否已经收到了同一视图v下的n。

    c. d与m的摘要是否一致。

    d. n是否在区间[h, H]内。

    非法请求丢弃。如果副本节点i收到了2f+1个验证通过的COMMIT消息,说明当前网络中的大部分节点已经达成共识,运行客户端的请求操作o,并返回给客户端,r:是请求操作结果,客户端如果收到f+1个相同的REPLY消息,说明客户端发起的请求已经达成全网共识,否则客户端需要判断是否重新发送请求给主节点。记录其他副本节点发送的COMMIT消息到log中。
     

    如果主节点作恶,它可能会给不同的请求编上相同的序号,或者不去分配序号,或者让相邻的序号不连续。备份节点应当有职责来主动检查这些序号的合法性。

    如果主节点掉线或者作恶不广播客户端的请求,客户端设置超时机制,超时的话,向所有副本节点广播请求消息。副本节点检测出主节点作恶或者下线,发起View Change协议。

    View Change协议

    副本节点向其他节点广播消息。n是最新的stable checkpoint的编号, C 2f+1验证过的CheckPoint消息集合, P 是当前副本节点未完成的请求的PRE-PREPARE和PREPARE消息集合。

    当主节点p = v + 1 mod |R|收到 2f 个有效的VIEW-CHANGE消息后,向其他节点广播消息。 V 是有效的VIEW-CHANGE消息集合。 O 是主节点重新发起的未经完成的PRE-PREPARE消息集合。PRE-PREPARE消息集合的选取规则:

    副本节点收到主节点的NEW-VIEW消息,验证有效性,有效的话,进入v+1状态,并且开始 O 中的PRE-PREPARE消息处理流程。
     

    在上述算法流程中,为了确保在View Change的过程中,能够恢复先前的请求,每一个副本节点都记录一些消息到本地的log中,当执行请求后副本节点需要把之前该请求的记录消息清除掉。

    最简单的做法是在Reply消息后,再执行一次当前状态的共识同步,这样做的成本比较高,因此可以在执行完多条请求K(例如:100条)后执行一次状态同步。这个状态同步消息就是CheckPoint消息。

    副本节点i发送给其他节点,n是当前节点所保留的最后一个视图请求编号,d是对当前状态的一个摘要,该CheckPoint消息记录到log中。如果副本节点i收到了2f+1个验证过的CheckPoint消息,则清除先前日志中的消息,并以n作为当前一个stable checkpoint。

    这是理想情况,实际上当副本节点i向其他节点发出CheckPoint消息后,其他节点还没有完成K条请求,所以不会立即对i的请求作出响应,它还会按照自己的节奏,向前行进,但此时发出的CheckPoint并未形成stable。

    为了防止i的处理请求过快,设置一个上文提到的 高低水位区间[h, H] 来解决这个问题。低水位h等于上一个stable checkpoint的编号,高水位H = h + L,其中L是我们指定的数值,等于checkpoint周期处理请求数K的整数倍,可以设置为L = 2K。当副本节点i处理请求超过高水位H时,此时就会停止脚步,等待stable checkpoint发生变化,再继续前进。
     

    在区块链场景中,一般适合于对强一致性有要求的私有链和联盟链场景。例如,在IBM主导的区块链超级账本项目中,PBFT是一个可选的共识协议。在Hyperledger的Fabric项目中,共识模块被设计成可插拔的模块,支持像PBFT、Raft等共识算法。
     

     

    Raft基于领导者驱动的共识模型,其中将选举一位杰出的领导者(Leader),而该Leader将完全负责管理集群,Leader负责管理Raft集群的所有节点之间的复制日志。
     

    下图中,将在启动过程中选择集群的Leader(S1),并为来自客户端的所有命令/请求提供服务。 Raft集群中的所有节点都维护一个分布式日志(复制日志)以存储和提交由客户端发出的命令(日志条目)。 Leader接受来自客户端的日志条目,并在Raft集群中的所有关注者(S2,S3,S4,S5)之间复制它们。

    在Raft集群中,需要满足最少数量的节点才能提供预期的级别共识保证, 这也称为法定人数。 在Raft集群中执行操作所需的最少投票数为 (N / 2 +1) ,其中N是组中成员总数,即 投票至少超过一半 ,这也就是为什么集群节点通常为奇数的原因。 因此,在上面的示例中,我们至少需要3个节点才能具有共识保证。

    如果法定仲裁节点由于任何原因不可用,也就是投票没有超过半数,则此次协商没有达成一致,并且无法提交新日志。

     

    数据存储:Tidb/TiKV

    日志:阿里巴巴的 DLedger

    服务发现:Consul& etcd

    集群调度:HashiCorp Nomad
     

    只能容纳故障节点(CFT),不容纳作恶节点

    顺序投票,只能串行apply,因此高并发场景下性能差
     

    Raft通过解决围绕Leader选举的三个主要子问题,管理分布式日志和算法的安全性功能来解决分布式共识问题。

    当我们启动一个新的Raft集群或某个领导者不可用时,将通过集群中所有成员节点之间协商来选举一个新的领导者。 因此,在给定的实例中,Raft集群的节点可以处于以下任何状态: 追随者(Follower),候选人(Candidate)或领导者(Leader)。

    系统刚开始启动的时候,所有节点都是follower,在一段时间内如果它们没有收到Leader的心跳信号,follower就会转化为Candidate;

    如果某个Candidate节点收到大多数节点的票,则这个Candidate就可以转化为Leader,其余的Candidate节点都会回到Follower状态;

    一旦一个Leader发现系统中存在一个Leader节点比自己拥有更高的任期(Term),它就会转换为Follower。

    Raft使用基于心跳的RPC机制来检测何时开始新的选举。 在正常期间, Leader 会定期向所有可用的 Follower 发送心跳消息(实际中可能把日志和心跳一起发过去)。 因此,其他节点以 Follower 状态启动,只要它从当前 Leader 那里收到周期性的心跳,就一直保持在 Follower 状态。

    Follower 达到其超时时间时,它将通过以下方式启动选举程序:

    根据 Candidate 从集群中其他节点收到的响应,可以得出选举的三个结果。

    共识算法的实现一般是基于复制状态机(Replicated state machines),何为 复制状态机

    简单来说: 相同的初识状态 + 相同的输入 = 相同的结束状态 。不同节点要以相同且确定性的函数来处理输入,而不要引入一下不确定的值,比如本地时间等。使用replicated log是一个很不错的注意,log具有持久化、保序的特点,是大多数分布式系统的基石。

    有了Leader之后,客户端所有并发的请求可以在Leader这边形成一个有序的日志(状态)序列,以此来表示这些请求的先后处理顺序。Leader然后将自己的日志序列发送Follower,保持整个系统的全局一致性。注意并不是强一致性,而是 最终一致性

    日志由有序编号(log index)的日志条目组成。每个日志条目包含它被创建时的任期号(term),和日志中包含的数据组成,日志包含的数据可以为任何类型,从简单类型到区块链的区块。每个日志条目可以用[ term, index, data]序列对表示,其中term表示任期, index表示索引号,data表示日志数据。

    Leader 尝试在集群中的大多数节点上执行复制命令。 如果复制成功,则将命令提交给集群,并将响应发送回客户端。类似两阶段提交(2PC),不过与2PC的区别在于,leader只需要超过一半节点同意(处于工作状态)即可。

    leader follower 都可能crash,那么 follower 维护的日志与 leader 相比可能出现以下情况

    当出现了leader与follower不一致的情况,leader强制follower复制自己的log, Leader会从后往前试 ,每次AppendEntries失败后尝试前一个日志条目(递减nextIndex值), 直到成功找到每个Follower的日志一致位置点(基于上述的两条保证),然后向后逐条覆盖Followers在该位置之后的条目 。所以丢失的或者多出来的条目可能会持续多个任期。
     

    要求候选人的日志至少与其他节点一样最新。如果不是,则跟随者节点将不投票给候选者。

    意味着每个提交的条目都必须存在于这些服务器中的至少一个中。如果候选人的日志至少与该多数日志中的其他日志一样最新,则它将保存所有已提交的条目,避免了日志回滚事件的发生。

    即任一任期内最多一个leader被选出。这一点非常重要,在一个复制集中任何时刻只能有一个leader。系统中同时有多余一个leader,被称之为脑裂(brain split),这是非常严重的问题,会导致数据的覆盖丢失。在raft中,两点保证了这个属性:

    因此, 某一任期内一定只有一个leader
     

    当集群中节点的状态发生变化(集群配置发生变化)时,系统容易受到系统故障。 因此,为防止这种情况,Raft使用了一种称为两阶段的方法来更改集群成员身份。 因此,在这种方法中,集群在实现新的成员身份配置之前首先更改为中间状态(称为联合共识)。 联合共识使系统即使在配置之间进行转换时也可用于响应客户端请求,它的主要目的是提升分布式系统的可用性。

    关于免费迅雷会员激活码的问题,通过《北大青鸟设计培训:区块链技术中的共识算法?》、《区块链 --- 共识算法》等文章的解答希望已经帮助到您了!如您想了解更多关于免费迅雷会员激活码的相关信息,请到本站进行查找!

    爱资源吧版权声明:以上文中内容来自网络,如有侵权请联系删除,谢谢。

    免费迅雷会员激活码
    电脑分辨率设置对于游戏效果的影响 网页布局必知!种设置div高度的实用方法一次性get!