fabric 共识机制

由于fabric是分布式的系统,因此需要共识机制来保障各个节点以相同的顺序状态保存账本,达成一致性。 在当前fabric1.4版本中,存在三种共识机制,分别是solo,kafka,etcdraft。交易的共识包括3个阶段的处理:提议阶段、打包阶段和验证阶段。

1.Solo 共识模式

Solo共识模式指网络环境中只有一个排序节点,从Peer节点发送来的消息由一个排序节点进行排序和产生区块;由于排序服务只有一个排序节点为所有Peer节点服务,没有高可用性和可扩展性,不适合用于生产环境,通常用于开发和测试环境。

Solo共识模式调用过程说明:

  1. Peer节点通过gPRC连接排序服务,连接成功后,发送交易信息。
  2. 排序服务通过Recv接口,监听Peer节点发送过来的信息,收到信息后进行数据区块处理。
  3. 排序服务根据收到的消息生成数据区块,并将数据区块写入账本(Ledger)中,返回处理信息。
  4. Peer节点通过deliver接口,获取排序服务生成的区块数据。

2.Kafka 共识模式

Hyperledger Fabric的核心共识算法通过Kafka集群实现,简单来说,就是通过Kafka对所有交易信息进行排序(如果系统存在多个channel,则对每个channel分别排序)。
Kafka是一个分布式的流式信息处理平台,目标是为实时数据提供统一的、高吞吐、低延迟的性能。
Kafka由以下几类角色构成:

  • Broker:消息处理节点,主要任务是接收producers发送的消息,然后写入对应的topic的partition中,并将排序后的消息发送给订阅该topic的consumers。 大量的Broker节点提高了数据吞吐量,并互相对partition数据做冗余备份(类似RAID技术)。
  • Zookeeper:为Brokers提供集群管理服务和共识算法服务(paxos算法),例如,选举leader节点处理消息并将结果同步给其它followers节点,移除故障节点以及加入新节点并将最新的网络拓扑图同步发送给所有Brokers。
  • Producer:消息生产者,应用程序通过调用Producer API将消息发送给Brokers。
  • Consumer:消息消费者,应用程序通过Consumer API订阅topic并接收处理后的消息。

Kafka将消息分类保存为多个topic,每个topic中包含多个partition,消息被连续追加写入partition中,形成目录式的结构。一个topic可以被多个consumers订阅。简单来说,partition就是一个FIFO的消息管道,一端由producer写入消息,另一端由consumer取走消息(注意,这里的取走并不会移除消息,而是移动consumer的位置指针)。

在Hyperledger Fabric中的Kafka实际运行逻辑如下:

  1. 对于每一条链,都有一个对应的分区
  2. 每个链对应一个单一的分区主题
  3. 排序节点负责将来自特定链的交易(通过广播RPC接收)中继到对应的分区
  4. 排序节点可以读取分区并获得在所有排序节点间达成一致的排序交易列表
  5. 一个链中的交易是定时分批处理的,也就是说当一个新的批次的第一个交易进来时,开始计时
  6. 当交易达到最大数量时或超时后进行批次切分,生成新的区块
  7. 定时交易是另一个交易,由上面描述的定时器生成
  8. 每个排序节点为每个链维护一个本地日志,生成的区块保存在本地账本中
  9. 交易区块通过分发RPC返回客户端
  10. 当发生崩溃时,可以利用不同的排序节点分发区块,因为所有的排序节点都维护有本地日志

3. Etcdraft 共识模式

Raft 是 v1.4.1 中引入的,它是一种基于 etcd 的崩溃容错(CFT)排序服务。Raft 遵循 “领导者和追随者” 模型,其中领导者在通道中的orderer节点之间动态选出(这个节点集合称为“consenter set”),该领导者将消息复制到跟随者节点。由于系统可以承受节点(包括领导节点)的丢失,只要剩下大多数排序节点(即所谓的“仲裁”),Raft就被称为“崩溃容错”(CFT)。换句话说,如果一个通道中有三个节点,它可以承受一个节点的丢失(剩下两个节点)。

3.1 raft相关概念

  • 日志条目:Raft排序服务中的主要工作单元是“日志条目”,这些条目的完整序列称为“日志”。如果成员的多数(法定人数,换言之)成员到条目及其顺序达成一致,我们认为日志是一致的。

  • Consenter设置:排序节点主动参与给定信道的共识机制并接收信道的复制日志。这可以是所有可用节点(在单个群集中或在对系统通道有贡献的多个群集中),或者是这些节点的子集。

  • 有限状态机(FSM):Raft中的每个排序节点都有一个FSM,它们共同用于确保各个排序节点中的日志序列是确定性的(以相同的顺序编写)。

  • 法定人数:描述需要确认提案的最少数量的同意者,以便可以提交交易。对于每个consenter集,这是 大多数节点。在具有五个节点的群集中,必须有三个节点才能存在仲裁。如果由于任何原因导致法定数量的节点不可用,则orderer将无法用于通道上的读取和写入操作,并且不能提交新日志。

  • Leader:Leader负责提取新的日志条目,将它们复制到跟随者订购节点,以及管理何时认为条目已提交。这不是特殊类型orderer人。在情况决定的情况下,这只是orderer在某些时候可能拥有的角色,而不是其他角色。

  • Follower:Follower从Leader那里接收日志并确定性地复制它们,确保日志保持一致。Follower也会收到来自Leader的“心跳”信息。如果Leader停止在可配置的时间内发送这些消息,则追将发起选举,其中一个Follower将被选为新Leader。

3.2 raft在交易中的流程

每个通道都在Raft协议的单独实例上运行,这允许每个实例选择不同的leader。还允许集群由不同组织控制的排序节点组成的用例中进一步分散服务。虽然所有Raft节点必须是系统通道的一部分,但它们不一定必须是所有应用程序通道的一部分。通道创建者(和通道管理员)可以选择可用orderer的子集,并根据需要添加或删除orderer(一次只能添加或删除一个节点)。

在Raft中,交易(提案或配置更新的形式)由接收交易的orderer节点自动路由到该信道的当前leader。这意味着peer和应用程序不需要知道leader是谁。只有orderer节点需要知道。

3.3 raft节点选举日志传输

raft节点始终处于以下三种状态之一:follower,candidate或leader。所有节点最初都是follower。在这种状态下,他们可以接受来自leader的日志条目(如果已经当选),或者为leader投票。如果在设定的时间内没有收到日志条目或心跳(例如,五秒),则节点会自我提升到candidate状态。在候选状态中,节点请求来自其他节点的投票。如果候选人获得法定数量的选票,则将其提升为leader。leader接受新的日志条目并将其复制给follower。

虽然可以无限期地保留所有日志,但为了节省磁盘空间,Raft使用一个名为“snapshotting”的进程,用户可以在其中定义将在日志中保留多少字节的数据。每个快照将包含一定数量的块)。

菜鸟系列Fabric——Fabric 1.4共识机制(5)的更多相关文章

  1. 菜鸟学习Fabric源码学习 — kafka共识机制

    Fabric 1.4源码分析 kafka共识机制 本文档主要介绍kafka共识机制流程.在查看文档之前可以先阅览raft共识流程以及orderer服务启动流程. 1. kafka 简介 Kafka是最 ...

  2. 菜鸟系列Fabric源码学习—orderer服务启动

    Fabric 1.4 orderer 服务启动流程 1.提要 orderer提供broadcast和deliver两个服务接口.orderer节点与各个peer节点通过grpc连接,orderer将所 ...

  3. 菜鸟系列Fabric——Fabric 基本概念(1)

    Fabric 基本概念 1.区块链介绍 区块链之所以引来关注是因为比特币开源项目,尤其是比特币价值的飙升,让大家开始关注数字货币以及相关技术.那么区块链究竟是什么? 1.1 区块链定义 狭义上,区块链 ...

  4. Hyperledger Fabric(2)共识与交易

    Fabric 的网络节点本质上是互相复制的状态机,节点之间需要保持相同的账本状态.为了实现这个目的,各个节点需要通过共识( consensus )过程,对账本状态的变化达成一致性的认同. Fabric ...

  5. Hyperledger中的共识机制

    Hyperledger Consensus 共识过程 Hyperlydger中建立共识的过程由以下两个独立的过程构成: Ordering of transactions (交易排序) Validati ...

  6. 百度云BaaS体系揭秘,突破共识机制、单机计算和串行处理三大瓶颈

    区块链作为去中心化的技术机制拥有广泛的应用场景与市场潜能.自2017年爆发式增长后,区块链虽然已经进入平稳期,但仍然存在概念混淆.技术性能制约.智能合约制约.共识机制.网络建设等痛点.为了打破行业壁垒 ...

  7. 老K漫谈区块链的共识(1)——免信任的共识机制

    老k,柏链道捷CTO.清华阿尔山区块链研究中心高级工程师,超过17年的系统软件开发经验,在操作系统.编译器.虚拟机和符号执行方面都有实战经验.主持开发多个开眼项目,目前主要从事区块链底层系统开发工作. ...

  8. 通俗讲解:PoW共识机制与以太坊的关系、Ghost协议 及 PoS共识机制的变种---Casper

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  9. (转)区块链共识机制分析——论PoW,PoS,DPos和DAG的优缺点

    近期,随着区块链技术在社区中的声音越来越大,业界已经开始从技术角度对区块链进行全方位的解读.作为第一批区块链技术的实现,传统比特币与以太坊在共识机制.存储机制.智能合约机制.跨链通讯机制等领域并没有非 ...

随机推荐

  1. vue多套样式切换

    最近根据设计要求app需要根据不同环境切换不同样式,网上找了很多方法都不理想,后面自己脑洞大开这么完成的,请大佬多指教! 一.新建全局变量js文件和公用样式文件,在main.js中引入 import  ...

  2. python 通过序列索引迭代

    另外一种执行循环的遍历方式是通过索引,如下实例: #!/usr/bin/python # -*- coding: UTF-8 -*- fruits = ['banana', 'apple', 'man ...

  3. [Android]第一个cm调试分析

    0x00:写在前面  一直想入门Android安全,当时是极客大挑战出题的时候,被cx表哥甩锅强行去学了点android的开发,之后慢慢接触,感觉还是挺有意思的.cx表哥说先从逆向分析入门吧,之后可以 ...

  4. delphi中Tkbmmemtable数据转成SQL脚本

    unit UMemtableToSql; interface uses SysUtils, Classes, DB, kbmMemTable, Variants, Dialogs, SuperObje ...

  5. js获取用户当前页面复制的内容并修改

    如果只是单纯的获取页面上复制的内容可以使用window.getSelection()来获取选中的内容,在执行复制操作就可以了,但是如果想修改复制的内容可以先获取要复制的内容修改之后再用document ...

  6. triplet

    询问次数<=min(2*n,n+35) 一种类似hash的交互题 部分分n=5,限制10次 发现都问出来可以通过次数和大小确定所有的值和对应位置! n比较大 发现(X1,X2,i)能确定一些情况 ...

  7. leetcode题目3.无重复字符的最长子串(中等)

    题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "a ...

  8. State Threads之co-routine的创建和stack的管理

    1. 综述 协程库 State Threads Library 是一个基于 setjmp/longjmp 实现的 C 语言版用户线程库或协程库(user level thread). 基本协程例子: ...

  9. 小程序web-view利用url给内嵌的网页传值

    这个方法跟网页上的一样,直接通过截取url中传过来的参数来取值 <web-view src="https://www.baidu.com/test.html?url=http://ww ...

  10. HearthBuddy的plugin加载

    // Hearthbuddy.Windows.MainWindow // Token: 0x060001FF RID: 511 RVA: 0x0008951C File Offset: 0x00087 ...