paxos算法 paxos算法实现过程

莫娜号 1

常见分布式集群选举机制总结

1,ZooZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。keeper -- paxos

paxos算法 paxos算法实现过程paxos算法 paxos算法实现过程


paxos算法 paxos算法实现过程


2,kafka -- zookeeper上创建

3,redis -本机简单介绍了raft 的leader选举和日志,当然raft还有其他的特性本文并没有介绍,去看raft的论文,完整的了解raft。- 哨兵模式

4,Eureka -- 相互

我们探讨这几个集群的选举机制,其实就是探讨它们的高可用性。如果集群中的某些挂了,如何保证可用性?这个问题是分布式系统面临的三大问题之一。

Zookeeper的leader选举机制,是这四种集群中最复杂的选举机制,同时也是这四种集群中最接近paxos算法的实现。相比于Zookeeper的选举机制,kafka集群、redis集群、Eureka集群的选举机制简单了许多。

Zookeeper的leader选举是Zookeeper实现数据一致性的关键,同时也存在一些问题。认清Zookeeper的优点与缺陷,对于我们使用好它还是很有必要的。

Zookeeper的选举机制有2个触发条件:集群启动阶段和集群运行阶段leader挂机。这2种场景下选举的流程基本一致,我们以集群运行阶段leader挂机为例来进行说明。leader挂机以后,重新选举leader,选举的流程如下:

1,Zookeeper集群中的follower检测到leader挂机,然后把自己的状态置为LOOKING,开始进行leader选举。

2,每台选举自己为leader,然后把自己的选票通过广播通知其他。

3,每台接收来自其他的选票,并进行合法性校验,主要有两点校验,选举轮次校验和的状态的校验。

4,处理选票。每台都会将自己的选票与其他的选票进行PK,PK的规则如下:

个规则:首先进行ZXID的PK,大者获胜。

第二条规则:如果ZXID相等,则进行myid的PK,大者获胜。

经过PK以后,如果当前PK失败,则会把自己的选票重新投给胜者,然后把更新后的选票通过广播通知其他。

5,统计选票。根据超过半数的原则,每台都会统计leader的选票,如果超过半数,则结束选举。

6,更新状态。follower把自己的状态更新为FOLLOWING,leader把自己的状态更新为LEADING。

OK,这就是Zookeeper的leader选举机制。经过若干轮选举以后,Zookeeper集群继续对外提供服务。由于选票PK首先比较的是ZXID,所以Zookeeper能够保证leader的数据是的。

kafka集群是如何保证高可用性的呢?

kafka通过Zookeeper管理集群配置、选举leader、consumer group发生变化时进行rebalance。

概括来说,Kafka选举leader的过程是这样的:kafka的所有broker,在Zookeeper的/controller路径下创建临时,成功创建的那个broker就会成为leader,其他的broker就会成为follower。

当leader挂机时,临时会被删除,这是其他通过Zookeeper的watch机制,会到leader的变化,然后所有的follower会再次进行leader选举。

kafka的选举其实就是创建临时,这和Zookeeper分布式锁的实现原理基本相同。

redis主从切换和redis集群的理解。

要注意,主从切换默认只有一个,但是对于多个的集群,没有主从切换的说法。

redis没有类似Zookeeper的选举机制。redis的挂掉以后,redis集群是通过主从切换来保证高可用性的。

这里我们讨论自动切换,redis主从自动切换需要哨兵模式的支持,哨兵模式简单来说就是:和sle,在出现故障的时候,自动将sle切换成,恢复以后,作为新的sle对外提供服务。

准确的来说,Eureka集群中的各之间不存在主从关系。Eureka集群中的的关系是对等的,其他3种集群则都存在主从关系,这是Eureka集群的一个特色。

Eureka集群的各个server之间通过相互注册的方式来实现集群的高可用性。数据同步的方式是增量备份,这样可以保证每个server都是最全的数据。从而保证集群的高可用性。这样即使某个server挂了,集群还可以对外提供服务。

Eureka有一个配置项:eureka.client.fetch-register,是否从Eureka server获取注册信息。如果我们是Eureka集群,那么该项配置为true。这样Eureka server直接就可以相互注册。

OK,这篇文章只是对4种集群的选举机制进行了一个概括性的介绍,具体细节还是很复杂的。之前有文章重点分析过Zookeeper的leader选举,后续还会另起文章分析其他几种集群的选举机制,到时候我们再进行更深入的讲解。

一致性hash算法虚拟多少比较合适

AppendEntries RPC:

一致性算法:用于保证在分布式系统中每个都顺序执行相同的作序列,在每一个指令上执行一致性算法就能够保证最终各个的数据都是一致的。

2. 大用户量下高性能系统部署方案的制定及实施;

paxos就是用于解决一致性问题的算法,有多个就会存在间通信的问题,

北大青鸟设计培训:分布式与区块链之间的关系分析?

其中,难题友好性正是众多 PoW 种赖以存在的基础,在比特中,SHA256 算法被用作工作量证明的计算方法,也就是我们所说的挖矿算法。

关于区块链技术的探讨我们在前几期的文章中已经说过很多次了,而且也给大家介绍了使用哪些编程开发语言来实现对区块链技术的具现化,今天我们就一起来了解一下,如何从分布式的角度来分析理解区块链的构造。

公有链使用BFT的一个例外是NEO,NEO使用了DBFT(delegated BFT)共识机制。DBFT共识机制下投票选出7个共识。这些是通过静态选出的,并完全由项目方部署。这也是NEO被外界质疑过于中心化的原因。(参考: 早期公有链明星项目-NEO )

区块链是源于比特中的底层技术,用于实现一个无中心的点对点系统,因为没有中心机构的参与,比特以区块链的形式来组织交易数据,防止“双花”,达成交易共识。

传统意义上的数字资产,比如游戏,是以集中式的方式管理的,仅能在单个系统中流转,由某个中心化机构负责协调,通常以数据库的方式来存储。

宏观上看,区块链和数据库一样,都是用来保存数据,只是数据存取的形式有所不同。

区块链本质上是一个异地多活的分布式数据库。

异地多活的提出,原本是为了在解决系统的容灾问题,多年来也一直是分布式数据库领域在探索的方向,但鲜有成效,因为异地多活需要解决数据冲突的问题,这个问题其实不好解决。

然而诞生于比特的区块链以一种全新的方式实现了全球大的异地多活数据库,它完全开放,没有边界,支持上万并可随机的加入和退出。

在区块链中数据冲突问题就更加突出了,区块链里每个是完全对等的多活架构,上万个要达成一致,数据以谁为准呢?比特采用的方式是POW,大家来算一个谜题,谁先算出来,就拥有记账权,在这个周期,就以他所记的账为准,下一个周期大家重新计算。

POW虽然消耗大量算力,好处是在争夺记账权的过程中POW只要在自身中计算hash,不需要经过网络投票来选举,网络通信的代价小,适合大规模之间共识。

青岛电脑培训://

所以后面发展出了PoS、DPoS,谁拥有资产多,谁就拥有记账权,或者大家投票,但这样又引入了经济学方面的问题,比如所谓的贿选的问题,这就不太好控制了。

在传统分布式数据库里,不叫共识算法,而叫一致性算法,本质上也是一回事。

但分布式数据库里一般数都很少,而且网络是可信的,通常都是安全可靠的,我们基本上可以相信每一个,即使它出现故障,不给应答,但不会给出应答。

所以在传统公司分布式数据里,都用Raft或Paxos协议去做这种一致性算法。

Zookpeer是什么?在系统中如何起作用?

Leader通过 AppendEntries RPC 将日志到时钟同步算法其他。

Zookeeper分布式服务框架是Apache Hadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题。如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

1. MGR | 深入浅出MGR

一条speculative chain有以下几个部分构成:

在以往,我们一般是利用MySQL的主从或半同步来提供高可用解决方案,但这存在以下几个比较的问题:

因为上述几个明显的缺点,因此MySQL推出了全新的高可用解决方案 -- 组,这是本系列文章要着重介绍的新特性。

MGR是M下图是整个集群中服务角色变化的流程图。ySQL 5.7.17开始引入的,但随着5.7版本逐渐退出历史舞台(MySQL 5.7已于2020年10月起不再做大的功能更新,只有修修补补以及针对安全更新),更多MGR相关特性都只在MySQL 8.0上才有。

因此,如果线上还有基于MySQL 5.7版本的MGR环境的话,建议尽快升级、迁移到MySQL 8.0版本。进一步提醒,MySQL 8.0.22及之后的版本,整体会更稳定可靠,也有些很不错的新功能(不只是MGR方面的)。

MGR具备以下几个特点:

MGR可以选择单主(Single-Primary)模式

如上图所示,一开始S1是Primary角色,提供读写服务。当它发生故障时,剩下的S2-S5会再投票选举出S2作为新的Primary角色提供读写服务,而S1再达到一定超时阈值后,就会被踢出。

亦可选择多主(Multi-Primary)模式(再次 强烈建议选用单主模式 )

如上图所示,一开始S1-S5所有都是Primary角色,都可以提供读写服务,任何一个发生故障时,只需要把指向这个的流量切换下就行。

上述两种架构模式下,应用端通过MySQL Router连接后端在MGR服务,当后端发生切换时,Router会自动感知,对应用端来说几乎是透明的,影响很小,架构上也更灵活。

首先来个MGR的技术架构图:

MGR是以Plugin方式嵌入MySQL,部署更灵活方便。

事务从层通过钩子(hook)进入MGR API接口层,再分发到各组件层,在组件层完成事务Capture/Apply/Recover,通过协议层(Replication Protocol Logics)传输事务,经由GCS协调事务在各的最终一致性。

MGR间由组通信系统(GCS)提供支持,它提供了故障检测机制、组成员角色管理,以及安全且有序的消息传递,这些机制可确保在各间一致地数据。这项技术的核心是Paxos算法的实现,在MySQL里称之为XCom,由它充当MGR的通信引擎。

对于要提交的事务,组中的多数派必须就全局事务序列中给定的事务顺序达成一致。各做出决定提交或中止事务的选择,但所有都要做出相同的决定。如果发生网络分区,导致间无法达成一致决定,则在网络恢复前,MGR无法工作。

MGR支持单主和多主两种模式,在单主模式下,各会自动选定主,只有该主能同时读写,而其他(从)只能只读。在多主模式下,所有都可以进行读写。

相对于MariaDB Galera Cluster(以及基于此技术的Percona XtraDB Cluster,下面为了书写方便,都统称为PXC),个人认为MGR具备以下几个优势:

相对于传统主从(Replication),我认为MGR的优势有以下几点:

以上是我根据MySQL、MariaDB、Percona的资料整理得到的观点,不一定准确和全面,有不完善的地方还请留言指正。

本节主要介绍了什么是MGR,MGR的技术架构概要,以及MGR相对PXC的几个技术优势。

相信MGR也是MySQL未来几年的重头戏,建议跟紧方向,不要错过这班列车。

因个人水平有限,专栏中难免存在错漏之处,请勿直接文档中的命令、方法直接应用于线上生产环境。请读者们务必先充分理解并在测试环境验证通过后方可正式实施,避免造成生产环境的破坏或损害。

Enjoy GreatSQL :)

Tendermint 共识算法

分布式一致性算法一般可以分为两类:拜占庭容错和非拜占庭容错。

非拜占庭容错算法如 Paxos, Raft 等在当前的分布式系统中已经广泛使用,而拜占庭容错算法的实际应用范围相对来说小很多(特别是在区块链问世之前)。

Tendermint 属于拜占庭容错算法,它针对传统的 PBFT 算法做了优化,只需要有两轮投票即可达成共识,目前 Tendermint 算法主要应用在区块链系统中,这篇文章就从原理上来介绍 Tendermint 的共识机制。

关于 Tendermint 算法的完整描述在 这里 。

这里先介绍一下算法的流程,理解了算法流程之后,再来阐述该算法的安全性证明 (Proof of Safty) 和活性证明 (Proof of Liveness)。

下面这张图是 tendermint 状态转换图

算法主要有 NewHeigh -> Proe -> Prevote -> Precommit -> Commit 一共 5 个状态(阶段)。

上述每个状态都被称为一个 Step,首尾的 NewHeigh 和 Commit 这两个 Steps 被称为特殊的 Step,而中间加粗体的三个 Steps 则被称为一个 Round,是共识阶段,也是也是算法的核心原理所在。

需要注意的是,一个块的最终提交(Commit)可能需要多个 Round 过程,这是因为有许多原因可能会导致当前 Round 不成功(比如出块 Offline,提出的块是无效块,收到的 Prevote 或者 Precommit 票数不够 +2/3 等等),出现这些情况的话,解决方案就是移步到下一轮,或者增加 timeout 时间)。

这里,还要介绍一个重要概念:PoLC,全称为 Proof of Lock Change,表示在某个特定的高度和轮数(height, round),对某个块或 nil (空块)超过总结点 2/3 的 Prevote 投票,简单来说 PoLC 就是 Prevote 的投票集。

Tendermint 中有两种类型的,Validator 和 Non-Validator ,顾名思义,只有 Validator 会参与共识投票,而普通作为 Non-Validator ,不参与共识投票,只协助传递状态或向 Validator 发送交易请求。

初始状态下(创世块),高度为 0, 此时,系统会基于 Round Robin 原则来选出一个 Validator(每个 Validator 都有一定的 Voting Power),由这个 Validator 打包一个新的 Block, 并向所有发出 Proal,剩余的 Validator 对该 Proal 进行投票,最终达成共识。

以下,分阶段来阐述各个阶段:

当上一轮 Commit 结束,就会出现新高度,这是就需要进入下一轮共识了,也就是说,这就是新一轮共识过程的开始,这时候需要选出一个 Proer。选择算法是 Round Robin,基于他们的 Voting Power(上一轮的选中的 Validator 会把其 Voting Power 值减去 Total Voting Power,也就是说上一轮的 Validator 在这一轮,其 Voting Power 会变成负数)。

在 Proe 开始的时候,该轮指定的 proer 需要通过 gossip 广播一条 proal 到所有的 peers。如果此时这个 proer 被锁在上一轮的某个 block 上,那么它就直接 proe 那个 block,同时包含一条 proof of lock 的信息。

Validator 收到 proe 信息之后就进入 Prevote 投票阶段。投票时,如果 Validator 被锁在之前一个 block 上,那么还是给之前那个 block 投 prevote 票,否则就投当前的 block。同时,它会继续收集对这个 block 的 prevote 投票,等轮到他 proe 的时候打包进 PoLC。

注意:

如果自己有 Lock-Block,这时又收到一个新的针对另外一个块的 PoLC,并且满足LastLockRound < PoLC-Round < 当前 Round,则解锁 Lock-Block。

如果 timeout 期间没收到 proal,或者收到的 proal 是无效的,那么就投 nil 票。

在 Prevote 阶段不会锁住任何 block。

Prevote 超时或者收到的 Prevote 的 nil 票超过 2/3 时,就进入 Precommit 阶段。

如果此时收到了 +2/3 的 prevote 投票,就广播一条 precommit 投票,同时, 把自己锁在当前的 block 上(把之前的都释放掉) 。一个一次只能锁在一个块上。

如果收到 +2/3 的 n那么我要问了,kafka是如何选举leader的呢?il 投票,那么就释放锁。

当一个锁在一个 block 上的时候(有 PoLC) ,它会将 LastLockRound 置为当前 Round,并对这个块投 Precommit 票。

如果有针对我之前 ZAB协议 的文章分析了zookeeper的zab协议,这里对比一下两者的异同。 nil 票的 PoLC,则解锁并且对 nil 投 Precommit 票;否则的话保持 Lock-Block 不变,并投 nil 。

如果在 timeout 期间内,没有收到对某个块的足够的 +2/3 投票(prevote 或者 nil 都行),那么就什么也不干。

Commit 阶段是一个特殊阶段,有两个并行的条件必须满足:

At any time during the consensus process if a node receives more than 2/3 of commits for a particular block, it immediay enters the Commit step if it hadn’t already. Thus there are two ways to enter the Commit step. A commit-vote for a block at round R counts as prevotes and precommits for all rounds R0 where R < R0 . Commit-votes are gossipped to neighboring peers in the background re-gardless of the current round or step。

At any time during the consensus process if a node is locked on a block from round R but receives a proof-of-lock for a round R0 where R < R0 , the node unlocks.

Tendermint 的安全性就是说,在对高度为 H 的块达成共识之后,不可能会出现新的高度为 H 的块,也就是说 Tendermint 保证不会分叉,保证不会分叉的主要角色就是 Lock-Block。

先看下wiki对于安全性证明的描述:

Assume that at most -1/3 of the voting power of validators is byzantine. If a validator commits block B at

round R, it's because it saw +2/3 of precommits at round R. This implies that 1/3+ of honest nodes are still

locked at round R' > R. These locked validators will remain locked until they see a PoLC at R' > R, but this

won't happen because 1/3+ are locked and honest, so at most -2/3 are ailable to vote for anything other

than B.

翻译:

定有最多小于总结点 1/3 的拜占庭。如果一个在第 R 轮提交一个块,则表明此在第 R 轮收到大于 2/3 的针对此块的 Precommit 投票。这也就意味有

大于1/3 的诚实在第 R’ (R' > R)轮仍然锁定在这个块上(因为大于 2/3 的 Precommit 投票必定包含大于 1/3 诚实的 Precommit 投票)。只有当遇到针对另一个

块的 PoLC 时才会解锁,但是在 R' 轮是不可能有针对某个块的 PoLC,因为已经有大于 1/3 的诚实已经锁定在这个块上,所以就不可能有对另外一个块大于 2/3

的 Prevote 投票。

下面给出较为详细的证明过程,设高度为 H 的块 b 在第 R 轮达成共识。给出如下条件:

需要证明, 当 x 个 commit 之后,剩余(也就是 y + z)的没有 Commit 块 b 的不会对另外一个块达成共识。

也就是说需要证明:y + z - z0 < 2/3,设所有的拜占庭都对 b 投了 Precommit,则满足:x + y + z0 > 2/3。

简而言之,要从 x + y + z0 > 2/3 证明 y + z - z0 < 2/3。

我们通过反证法来证明:

设 y + z - z0 > 2/3,也就是在第 r 轮之后有可能造成分叉,则:

x + y + z - z0 > 2/3 + x => 1 - z0 > 2/3 + x => x + z0 < 1/3。

而上面我们提到了,因为x已经 Commit 块 b,则 x + y + z0 > 2/3,且 y < 1/3,则说明 x + z0 必须大于1/3。由此证明,y + z - z0 < 1/3 成立,在第 R 轮之后无法对另一个块达成共识,也就不可能出现分叉。

活性证明相对来说就要简单一些,设多于 1/3 的分别 Lock 在不同的块上,则在 Prevote 阶段的条件保证最终 round 较小的会 unlock,而且 proal 的超时时间会随着轮数的提高而提高。

在证明安全性的过程中提到,有可能会有部分由于没有收到足够的 Precommit 投票导致无法 commit,这个时候可以通过同步来使各个的状态尽量保持一致,在wiki中提到一个 JSet 和 VSet 的概念,当已经 commit 时,就可以广播一条消息携带 VSet 给其他,其他验证对于块的 commit 是否有效。这一点其实和 bft-raft (另外一个拜占庭容错算法,Raft 算法的变种)的做法类似。

知链区块链金融应用实践平台成绩怎么算

PoW共识算法以算力作为竞争记账权的基础,以工作量作为安全性的保障,所有矿工都遵循最长链原则。新产生的区块包含前一个区块的哈希值,现存的所有区块的形成了一条链,链的长度与工作量成正比,所有的均信任最长的区块链。如果当某一组织掌握了足够的算力,就可以针对比特网络发起攻击。当攻击者拥有足够的算力时,能够计算出的区块,从而掌握最长链。此时比特主链上的区块大部分由其生成,他可以故意拒绝某些交易的确认和进行双花攻击,这会对比特网络的可信性造成影响,但这一行为同样会给攻击者带来损失。通过求解一维随机游走问题,可以获得恶意攻击成功的概率和算力之间的关系:

本文将对区块链中常见的七类共识算法进行介绍,希望对读者探索区块链有所帮助。

MGR是MySQL Group Replication的缩写,即MySQL组。

1. 工作量证明(PoW)

中本聪在2009年提出的比特(Bitcoin)是区块链技术最早的应用,其采用PoW作为共识算法,其核心思想是间通过哈希算力的竞争来获取记账权和比特奖励。PoW中,不同根据特定信息竞争计算一个数学问题的解,这个数学问题很难求解,但却容易对结果进行验证,解决这个数学问题的可以创建下一个区块并获得一定数量的奖励。中本聪在比特中采用了HashCash[4]机制设计这一数学问题。本节将以比特采用的PoW算法为例进行说明,PoW的共识步骤如下:

收集上一个区块产生后全网待确认的交易,将符合条件的交易记入交易内存池,然后更新并计算内存池中交易的Merkle根的值,并将其写入区块头部;

在区块头部填写如表1.1所示的区块版本号、前一区块的哈希值、时间戳、当前目标哈希值和随机数等信息;

表1.1 区块头部信息

随机数nonce在0到232之间取值,对区块头部信息进行哈希计算,当哈希值小于或等于目标值时,打包并广播该区块,待其他验证后完成记账;

一定时间内如果无法计算出符合要求的哈希值,则重复步骤2。如果计算过程中有其他完成了计算,则从步骤1重新开始。

比特产生区块的平均时间为10分钟,想要维持这一速度,就需要根据当前全网的计算能力对目标值(难度)进行调整[5]。难度是对计算产生符合要求的区块困难程度的描述,在计算同一高度区块时,所有的难度都是相同的,这也保证了挖矿的公平性。难度与目标值的关系为:

难度值=目标值/当前目标值 (1.1)

根据比特的设计,每产生2016个区块后(约2周)系统会调整一次当前目标值。根据前2016个区块的实际生产时间,由公式(1.4)计算出调整后的难度值,如果实际时间生产小于2周,增大难度值;如果实际时间生产大于2周,则减小难度值。根据最长链原则,在不需要同步难度信息的情况下,所有在一定时间后会得到相同的难度值。

在使用PoW的区块链中,因为网络延迟等原因,当同一高度的两个区块产生的时间接近时,可能会产生分叉。即不同的矿工都计算出了符合要求的某一高度的区块,并得到与其相近的确认,全网会根据收到区块的时间,在先收到的区块基础上继续挖矿。这种情况下,哪个区块的后续区块先出现,其长度会变得更长,这个区块就被包括进主链,在非主链上挖矿的会切换到主链继续挖矿。

图1.1 攻击者算力与攻击成功概率

2. 权益证明(PoS)

随着参与比特挖矿的人越来越多,PoW的许多问题逐渐显现,例如随着算力竞争迅速加剧,获取代需要消耗的能源大量增加,记账权也逐渐向聚集了大量算力的“矿池”集中[6-9]。为此,研究者尝试采用新的机制取代工作量证明。PoS的概念在最早的比特项目中曾被提及,但由于稳健性等原因没被使用。PoS最早的应用是点点(PPCoin),PoS提出了龄的概念,龄是持有的代与持有时间乘积的累加,计算如公式(1.4)所示。利用龄竞争取代算力竞争,使区块链的证明不再仅仅依靠工作量,有效地解决了PoW的资源浪费问题。

其中持有时间为某个距离最近一次在网络上交易的时间,每个持有的龄越长,则其在网络中权益越多,同时的持有人还会根据龄来获得一定的收益。点点的设计中,没有完全脱离工作量证明,PoS机制的记账权的获得同样需要进行简单的哈希计算:

其中proofhash是由权重因子、未消费的产出值和当前时间的模糊和得到的哈希值,同时对每个的算力进行了限制,可见龄与计算的难度成反比。在PoS中,区块链的安全性随着区块链的价值增加而增加,对区块链的攻击需要攻击者积攒大量的龄,也就是需要对大量数字货持有足够长的时间,这也大大增加了攻击的难度。与PoW相比,采用PoS的区块链系统可能会面对长程攻击(Long Range Attack)和无利害攻击(Nothing at Stake)。

除了点点,有许多也使用了PoS,但在记账权的分配上有着不同的方法。例如,未来(Nxt)和黑(BlackCion)结合所拥有的权益,使用随机算法分配记账权。也在逐步采用PoS代替PoW。

3. 委托权益证明(DPoS)

比特设计之初,希望所有挖矿的参与者使用CPU进行计算,算力与匹配,每一个都有足够的机会参与到区块链的决策当中。随着技术的发展,使用GPU、FPGA、ASIC等技术的矿机大量出现,算力集中于拥有大量矿机的参与者手中,而普通矿工参与的机会大大减小。

采用DPoS的区块链中,每一个都可以根据其拥有的股份权益投票选取代表,整个网络中参与竞选并获得选票最多的n个获得记账权,按照预先决定的顺序依次生产区块并因此获得一定的奖励。竞选成功的代表需要缴纳一定数量的保证金,而且必须保证在线的时间,如果某时刻应该产生区块的没有履行职责,他将会被取消代表资格,系统将继续投票选出一个新的代表来取代他。

DPoS中的所有都可以自主选择投票的对象,选举产生的代表按顺序记账,与PoW及PoS相比节省了计算资源,而且共识只有确定的有限个,效率也得到了提升。而且每个参与都拥有投票的权利,当网络中的足够多时,DPoS的安全性和去中心化也得到了保证。

4. 实用拜占庭容错算法(PBFT)

在PBFT算法中,所有都在相同的配置下运行,且有一个主,其他作为备份。主负责对客户端的请求进行排序,按顺序发送给备份。存在视图(View)的概念,在每个视图中,所有正常按照处理消息。但当备份检查到主出现异常,就会触发视图变换(View Change)机制更换下一编号的为主,进入新的视图。PBFT中客户端发出请求到收到答复的主要流程如图4.1所示[10] [11],之间交换信息3次,整个过程包含以下五个阶段:

图4.1 PBFT执行流程

目前以PBFT为代表的拜占庭容错算法被许多区块链项目所使用。在联盟链中,PBFT算法最早是被Hyper ledger Fabric项目采用。Hyperledger Fabric在0.6版本中采用了PBFT共识算法,授权和背书的功能集成到了共识之中,所有都是共识,这样的设计导致了的负担过于沉重,对TPS和扩展性有很大的影响。1.0之后的版本都对的功能进行了分离,分成了三个背书(Endorser)、排序(Orderer)和出块(Committer),对的功能进行了分离,一定程度上提高了共识的效率。

Coos项目使用的Tendermint[12]算法结合了PBFT和PoS算法,通过代抵押的方式选出部分共识进行BFT的共识,其减弱了异步设并在PBFT的基础上融入了锁的概念,在部分同步的网络识能够通过两阶段通信达成共识。系统能够容忍1/3的故障,且不会产生分叉。在Tendermint的基础上,Hotstuff[13]将区块链的块链式结构和BFT的每一阶段融合,每阶段间对前一区块签名确认与新区块的构建同时进行,使算法在实现上更为简单,Hotstuff还使用了门限签名[14]降低算法的消息复杂度。

5. Paxos与Raft

共识算法是为了保障所存储信息的准确性与一致性而设计的一套机制。在传统的分布式系统中,最常使用的共识算法是基于Paxos的算法。在拜占庭将军问题[3]提出后,Lamport在1990年提出了Paxos算法用于解决特定条件下的系统一致性问题,Lamport于1998年重新整理并发表Paxos的论文[15]并于2001对Paxos进行了重新简述[16]。随后Paxos在一致性算法领域占据统治地位并被许多公司所采用,例如腾讯的Phxpaxos、阿里巴巴的X-Paxos、亚马逊的AWS的DynamoDB和谷歌MegaStore[17]等。这一类算法能够在数量有限且相对可信任的情况下,快速完成分布式系统的数据同步,同时能够容忍宕机错误(Crash Fault)。即在传统分布式系统不需要考虑参与恶意篡改数据等行为,只需要能够容忍部分发生宕机错误即可。但Paxos算法过于理论化,在理解和工程实现上都有着很大的难度。Ongaro等人在2013年发表论文提出Raft算法[18],Raft与Paxos同样的效果并且更便于工程实现。

Raft中占据主导地位,必须保证的安全性,一旦被恶意控制将造成巨大损失。而且交易量受到吞吐量的限制。目前许多联盟链在不考虑拜占庭容错的情况下,会使用Raft算法来提高共识效率。

当前在公有链往往基于PoS类算法,抵押代增加共识的准入门槛,通过经济学博弈增加恶意的作恶成本,然后再在部分通过筛选的中通过随机选举算法,从符合条件的候选中随机选举部分进行共识。

Dodis等人于1999年提出了可验证随机函数(Verifiable Random Functions,VRF)[19]。可验证随机函数是零知识证明的一种应用,即在公私钥体系中,持有私钥的人可以使用私钥和一条已知信息按照特定的规则生成一个随机数,在不泄露私钥的前提下,持有私钥的人能够向其他人证明随机数生成的正确性。VRF可以使用RSA或者椭圆曲线构建,Dodis等人在2002年又提出了基于Diffie-Hellman 困难性问题的可验证随机函数构造方法[20],目前可验证随机函数在密钥传输领域和区块链领域都有了应用[21]。可验证随机函数的具体流程如下:

在公有链中,VRF已经在一些项目中得到应用,其中VRF多与PoS算法结合,所有想要参与共识的质押一定的代成为候选,然后通过VRF从众多候选中随机选出部分共识。Zilliqa网络的新都必须先执行PoW,网络中的现有验证新的PoW并授权其加入网络。区块链项目Ontology设计的共识算法VBFT将VRF、PoS和BFT算法相结合,通过VRF在众多候选中随机选出共识并确定共识的排列顺序,可以降低恶意分叉对区块链系统的影响,保障了算法的公平性和随机性。图灵奖获得者Micali等人提出的Algorand[22]将PoS和VRF结合,可以采用代质押的方式成为候选,然后通过非交互式的VRF算法选择部分组成共识委员会,然后由这部分执行类似PBFT共识算法,负责交易的快速验证,Algorand可以在为诚实的情况下保证系统正常运行。Kiayias等人提出的Ouroboros[23]在第二个版本Praos[24]引入了VRF代替伪随机数,进行分片中主的选择。以Algorand等算法使用的VRF算法为例,主要的流程如下:

公有链中设计使用的VRF中,被选为记账的概率往往和其持有的代正相关。公有链的共识范围是无法预先确定的,所有满足代持有条件的都可能成为共识,系统需要在数量和参与度都随机的中选择部分进行共识。而与公有链相比,联盟链参与共识的数量有限、已知,这种情况下联盟链之间可以通过已知的列表进行交互,这能有效防止公有链VRF设计时可能遇到的女巫攻击问题。

7. 结合分片技术的公式算法

分片技术是数据库中的一种技术,是将数据库中的数据切成多个部分,然后分别存储在多个中。通过数据的分布式存储,提高的搜索性能。区块链中,分片技术是将交易分配到多个由子集组成的共识组中进行确认,再将所有结果汇总确认的机制。分片技术在区块链中已经有一些应用,许多区块链设计了自己的分片方案。

Luu等人于2017年提出了Elastico协议,将分片技术应用于区块链中[25]。Elastico首先通过PoW算法竞争成为网络中的记账。然后按照预先确定的规则,这些被分配到不同的分片委员会中。每个分片委员会内部执行PBFT等传统拜占庭容错的共识算法,打包生成交易。在超过的对该交易进行了签名之后,交易被提交给共识委员会,共识委员会在验证签名后,最终将所有的交易打包成区块并记录在区块链上。

Elastico验证了分片技术在区块链中的可用性。在一定规模内,分片技术可以近乎线性地拓展吞吐量。但Elastico使用了PoW用于选举共识,这也导致随机数产生过程及PoW竞争共识的时间过长,使得交易延迟很高。而且每个分片内部采用的PBFT算法通讯复杂度较高。当单个分片中数量较多时,延迟也很高。

在Elastico的基础上,Kokoris-Kogias等人提出OmniLedger[26],用加密抽签协议替代了PoW选择验证者分组,然后通过RandHound协议[27]将验证者归入不同分片。OmniLedger。OmniLedger在分片中仍然采用基于PBFT的共识算法作为分片中的共识算法[28],并引入了Atomix协议处理跨分片的交易,共识过程中之间通信复杂度较高。当分片中数量增多、跨分片交易增多时,系统TPS会显著下降。

Wang等人在2019年提出了Monoxide[29]。在PoW区块链系统中引入了分片技术,提出了连弩挖矿算法(Chu ko-nu mining algorithm),解决了分片造成的算力分散分散问题,使得每个矿工可以同时在不同的分片进行分片,在不降低安全性的情况下提高了PoW的TPS。

共识算法4 (BFT)

MGR是MySQL四部战略走的关键一环,依靠MGR和MySQL Shell、MySQL Router已实现了读扩展,以及写扩展(MGR多主模式),下一步预计实现sharding,让我们拭目以待。

拜占庭将军问题(Byzantine Generals Problem),由Leslie Lamport、Robert Shostak和Marshall Pease,在其同名论文中提出(1982年)。拜占庭将军问题现在主要指分布式对等网络间的通信容错问题。在分布式网络中,不同的计通过交换信息达成共识。但有时候,系统中的成员可能出错而发送错误的信息,用于传递信息的通讯网络也可能导致信息损坏,也可能存在恶意或被黑客攻破的故意发送错误的信息,从而导致系统无法达成共识或者达成错误的共识。(参考: BFT Wikipedia )

拜占庭将军问题提出后,有很多的算法被提出用于解决这个问题。这类算法统称拜占庭容错算法(BFT: Byzantine Fault Tolerance)。BFT从上世纪80年代开始被研究,目前已经是一个被研究得比较透彻的理论,具体实现都已经有现成的算法。

BFT算法中最典型的是PBFT(Practical BFT)。PBFT是由Miguel Castro和Barbara Liskov于1999年提出。PBFT算法解决了之前拜占庭容错算法效率不高的问题,将算法复杂度由指3、熟悉网络基础知识数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行。PBFT在保证安全性和可用性的前提下,提供了 (n-1)/3 的容错性。(细节请参考: PBFT )

PBFT之后,很多进一步提升性能或鲁棒性的BFT算法先后被提出,例如Zyzzyva、ABsTRACTs、Aarark、RBFT等等。近几年,由于区块链的热度,无数针对区块链应用场景优化过的BFT算法也不断涌现出来。虽然目前PBFT已经不能说是的,或最适合区块链的BFT算法。但是PBFT已经足够好了,而且在实际应用中已经非常成熟。

在BFT共识机制中,网络中的数量和身份必须是提前确定好的。BFT共识机制无法做到PoW共识机制中实现的任何人都可以随时加入挖矿。另外,BFT算法无法应用到大量的,业内普遍认为100个是BFT算法的上限。所以BFT算法无法直接用于公有链,BFT算法适合的场景是私有链和联盟链。业内大名鼎鼎的联盟链Hyperledger fabric v0.6采用的是PBFT,v1.0又推出PBFT的改进版本SBFT。这里再顺便提一句,在可信环境下共识算法一般使用传统的分布式一致算法PAXOS或者RAFT。

基于BFT的PoS的典型例子是tendermint(Coos采用了tendermint作为共识核心)。

zookeeper什么意思

Paxos算法是桑德尔的另一项经典工作。在分布式系统中,一致性问题是非常重要的,而Paxos算是解决分布式系统中一致性问题的一种算法。

zookeeper是动物的意思。

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper包含一个简单的原语集,提供Ja和C的接口。

ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_homesrc

它的原理:

ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proer交错提交时,有可能互相排斥导致没有一个proer能提交成功,而Fast Paxos做了一些优化,通过选举产生一个leader (),只有leader才能提交proer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。

ZooKeeperBFT算法和公有链合适的结合点在于基于BFT的PoS共识算法(BFT based PoS)。基于BFT的PoS共识算法要点有:一,网络通过锁定虚拟资产申请成为区块链系统的验证者(或矿工)。系统验证者的数量是动态变化的。二,系统从当前验证者中随机选择一个人作为区块提案人。三,系统验证者对区块提案进行投票表决,投票可能要进行多轮才能达成共识。每个人的投票比重与锁定的虚拟资产成比例。的基本运转流程:1、选举Leader。2、同步数据。3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。4、Leader要具有的执行ID,类似root权限。5、集群中大多数的机器得到响应并接受选出的Leader。

最后修改时间:
格子王者荣耀人物 王者荣耀人物格子画
上一篇
u盘保密管理(u盘保密区打不开怎么办)
下一篇

相关文章