分布式系统综述
分布式系统是多个处理机通过通信线路互联而构成的为了完成共同的任务而协调工作的计算机节点组成的松散耦合系统。
区块链分布式板块综述
分布式系统拓扑结构概念
分布式拓扑结构是指网络之间设备的分布情况以及连接状态。
分布式系统概论
分布式系统基本机制
数据分片
数据分片将数据集划分为更小的不同的独立数据库。
数据复制
数据复制将数据集划分为更小的不同的独立数据集。
三种数据复制变更算法:主从复制、多主节点复制、无主节点复制。
主从复制
由主节点接受写操作请求,然后将更新后数据发送到所有从节点,读操作请求则在主从上都可以进行。
多主节点复制
每个主节点都可以接受写操作,主节点可以相互充当其他节点从节点,其过程与主从复制类似。
无主节点复制
所有的节点都支持直接接受写操作请求。
分布式系统优势
用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。
资源共享
加快计算速度
可靠性高
灵活度高
分布式系统劣势
分布式系统的缺点主要体现在系统设计、管理和运维上。
系统复杂性增加
维护性弱于单机系统
管理成本增加
分布式系统面临的挑战
分布式系统由于其大量机器协作,面临诸多挑战
异构的机器与网络
普遍的节点故障
不可靠的网络
分布式一致性和两个重要理论
分布式一致性概念
分布式一致性指多个节点对某一变量的取值达成一致,一旦达成一致,则变量的本次取值即被确定。
数据一致性
事务一致性
分布式一致性的类型
强一致性
数据更新后任何时刻所有的用户或者进程查询到的都是最近一次成功更新的数据
弱一致性
数据更新后可能访问部分或访问不到
最终一致性
在一段时间后数据最终达到一致
因果一致性
事务执行的前后逻辑保持一致
分布式一致性要求出现的原因
节点之间的网络通信是不可靠的
节点的处理可能是错误的
同步调用会让系统变得不具备可扩展性
分布式一致性系统的要求
可终止性
共识性
合法性
FLP不可能原理
概述
在网络可靠,但允许节点失效(即便只有一个)的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性共识算法。
该原理由 Fischer、Lynch 和 Patterson 三位科学家于 1985 年发表的论文《Impossibility of Distributed Consensus with One Faulty Process》中提出,后来该论文获得了 Dijkstra 奖12。
说明
参考文档
分布式系统核心技术 - FLP 不可能原理 - 《区块链技术指南 v1.6.2》 - 书栈网 · BookStack
CAP原理
分布式计算系统不可能同时确保以下三个特性:
参考文档
分布式系统核心技术 - CAP 原理 - 《区块链技术指南 v1.6.2》 - 书栈网 · BookStack
分布式系统中两个原则与多阶段提交
ACID原则
ACID是关系型数据库的事务需要遵守的原则。
BASE原则
网络分区
网络分区是分布式系统的常见异常。网络分区会导致数据不一致。
分区的情况很少出现,实际上CAP大多数时间能够同时满足一致性(C)和可用性(A)。
BASE理论简介
BASE理论是Basically Available(基本可用),Soft State(软状态)和Eventually Consistent(最终一致性)三个短语的缩写。
多阶段提交
概念
多阶段提交(3PC:Three-Phrase Commit)将节点划分为协调者与事务参与者,并将事务划分为尝试预提交阶段、预提交阶段、正式提交阶段。
- 投票之前,问能不能投票?
- 正式提交投票结果之前,问做出决定了吗?
- 正式提交投票结果
经过了三个步骤,确保了投票结果的产生
尝试预提交
预提交
正式提交
区块链共识算法演进
共识算法概述
定义:
区块链系统中各分布节点对事务或状态的验证、记录、修改等行为达成一致确认的方法。
共识算法具有以下三个特征
可终止性
合法性
共识性
区块链共识算法的演进
1959年 《主观概率的共识:平衡-互惠方法》 首次以一致性问题为研究对象 |
1982年 正式提出拜占庭容错类算法 解决了网络存在恶意节点时如何达成一致的过程和算法。 少数服从多数的原则 |
1989年 提出Paxos算法开创非拜占庭容错类算法 解决了存在网络故障时如何达成一致的过程和算法。 少数服从多数的原则 |
2008年10月 中本聪发表论文开启区块链共识算法研究 提出POW共识算法。 解决了扩容问题,支持节点随时加入与离开。 少数服从多数+工作量证明 |
2008年之后 学者们在共识算法领域的研究如雨后春笋般涌现,先后提出PoS、DPoS、Raft等一系列新的共识算法。 |
证明类共识算法概述
证明类共识被称为“Proof of X”类共识,即节点在每一轮共识过程中必须证明自己具有某种特定的能力,以获得记账权和奖励。
POW机制
POW采用按劳分配的原则,将算力作为记账的主要指标,算力大的节点将有更多的机会在区块链上进行记账。
基本要素
工作量证明函数
难度值
区块
记账策略
- 客户端产生新的交易,向全网广播
- 每个节点收到请求,将交易暂存于存储池中
- 每个节点进行pow工作量证明
- 当某个节点找到了证明,向全网广播
- 当且仅当该区块的交易时有效的且在之前从未存在的,其他节点才认同该区块的有效性
- 接受该区块且在该区块的末尾制造新的区块
POS机制
权益证明机制,即POS,是针对工作量证明机制存在的不足而设计出来的一种改进型共识机制。
基本原理
要求用户证明自己拥有一定数量的数字货币的所有权,即“权益”。
基本概念
币龄,即持有货币的时间。这是POS机制难度值确定的核心
利息,即在发现区块之后会根据一定的利息给付数字货币。
POS与POW共识算法比较
比较项 | POW | POS |
---|---|---|
记账权获得 | 以算力竞争记账权利 | 以权益竞争记账权利 |
篡改难度 | 低 | 高 |
头部玩家 | 未能解决 | 未能解决 |
选举类共识概述
概述
选举类共识是指节点在每一轮共识过程中通过“投票选举”的方式选出当前轮次的记账节点。
Paxos共识算法
机制
Paxos共识算法是一种选举类算法,采用了少数服从多数的原则选取结果。
Paxos节点被划分为不同角色:
提议者(Proposer):提出议案
决策者(Acceptor):参与决策,回应提案
最终决策学习者(Learner):不参与决策,接受议案
过程
Paxos共识算法过程包括提案生成过程和接受提案过程。
Raft共识算法
概述
Paxos和Raft都是为了实现一致性这个目标。
后来斯坦福大学的两位博士基于Paxos思想在《In Search of Understandable Consensus Algorithm》一文中提出了Raft算法。
角色
领导者(Leader):处理所有客户端交互
追随者(Follower):类似选民,完全被动
候选人(Candidate):可以被选为一个新的领导
Raft算法过程
分为两个阶段
- 选举过程
- 在选举出来的领导人带领下进行正常操作,比如日志复制等。
发出请求
每一个节点都有一个随机倒计时器,当倒计时结束的时候,这个节点切换为候选人状态,它想其他服务器跟随者发出要求选举自己的请求。
反馈
其他服务器同意了,发出OK。
注意如果在这个过程中,有一个follower宕机,没有收到请求选举的要求,因此候选人可以自己选自己,只要达到N/2+1的大多数票,候选人还是可以成为leader的。
脑裂
如果有多余的领导人被选出,则被称为脑裂(brain split),如果出现脑裂会导致数据的丢失或者覆盖。
避免脑裂
一个节点某任期内最多只能投一票
只有获得大多数选票才能称为领导人
发出命令
候选人就成为领导人,领导人可以向选民发出指令(比如进行日志复制)
心跳机制
以后通过“心跳机制”进行日志复制的通知
补充:
心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。
Leader宕机
如果一旦这个Leader宕机崩溃了,那么Follower中有一个成为候选者,发出邀票选举。
PBFT与蜜罐共识算法
PBFT共识算法
实用拜占庭容错算法(Practical Byzantine Fault Tolerance,简称PBFT)。
拜占庭将军问题
问题描述
拜占庭将军问题是一个分布式系统中的容错问题。想象一下,拜占庭帝国的军队被分割包围在敌城周围,各部分军队(将军)只能通过信使通信。将军们必须决定是进攻还是撤退。但是,其中有叛徒(可能是通信被篡改或者将军本身叛变),叛徒会传递错误的信息来扰乱正常的决策。 目标是在存在叛徒的情况下,让忠诚的将军们能够达成一致的作战计划(全部进攻或者全部撤退),并且这个计划是正确的(不会因为叛徒的干扰而做出错误决策)。
数学模型表示
假设有个将军,其中最多有个叛徒。将军们需要对一个值(进攻或撤退)达成共识。每个将军会向其他将军发送自己的意见(值),同时接收其他将军发来的意见。 难点在于如何在不知道哪些是叛徒的情况下,根据收到的信息做出正确的决策。例如,如果简单地采用多数投票,当叛徒数量较多时,可能会导致错误的决策。
PBFT简介
PBFT,实现了在有限个节点的情况下的拜占庭问题,算法经过三个阶段达成一致性,分别是有3f+1的容错性,即PBFT算法可以容忍小于1/9个无效或者恶意节点,并同时保证一定的性能。
PBFT核心和基本原则-少数服从多数
为什么是3f+1的容错性?
PBFT达成共识的过程——三阶段过程(预准备阶段、准备阶段、承诺阶段)
PBFT | POW机制 | |
---|---|---|
优点 |
|
|
缺点 | 无法扩展到1000个节点以上 |
|
蜜罐算法
简介
蜜罐算法(Honey Badger),是我们科学家与其他国家合作提出的一种拜占庭共识算法。
时间假设
指的是对于共识节点而言,他们期望对端节点在一个特定时间之内(特定时间长度不会变化)能够给出响应。
过程
分为三个步骤
加密交易
广播交易
解密交易
Avalanche和Algorand算法
Avalanche算法(雪崩算法)
简介
《Snowflake to Avalanche:A Novel Metastable Consensus Protocol Family for Cryptocurrencies》
亚秒级共识、高吞吐量、高安全性、全智能合约研发生态
Avalanche是共识算法的重大突破和创新。将传统分布式一致算法与经典区块链共识机制的设计思想结合。
核心约定
算法提出了一组拜占庭容错协议(简称共识家族 Consensus family)。
共识家族对诚信节点(Correct nodes)和恶意节点(Byzantine nodes)的行为做了提前约定。如下:
- 诚实节点之间绝不会提交彼此有冲突的业务,而恶意节点也无法制造与诚实节点的冲突。
- 恶意节点可以制造许多彼此冲突的业务提交,而诚实节点只会接受其中一个提交。
共识过程
Avalanche共识过程的发展经历了四个阶段,每个阶段(共识家族协议)都在前一个基础上进行了升级。
第一阶段Slush(融雪)
Slush协议规定每个节点有三种状态,即无状态、真和假,分别用黄色、蓝色和红色表示。
重复采样
第二阶段Snowflake(雪花)
在Slush的基础上对每个节点增加了一个计算器(counter)。具体来说:
- 每个节点都有一个计算器;
- 每一轮子采样完成后,如果颜色与上一轮相同,则计算器加1;
- 每一轮子采样完成后,如果颜色与上一轮不同,则计算器重置为0;
- 当计算器的值超过阈值时,则接受该节点所倾向的颜色。
- 图示和第一阶段一样。走和第一阶段同样的网络传播过程。
第三个阶段Snowball(雪球)
Snowball在Snowflake原有计算器基础上增加了置信度(confidence),通过概率算法,减少随机扰动。
第四阶段Avalanche(雪崩)
在Snowball的基础上添加有向无环图。一个DAG节点可以有多个父节点和多个子节点。而线性结构的节点只能有一个父节点和一个子节点。
Algorand算法
Algorand利用VRF函数(可验证随机函数)将区块产生者和投票者的选举随机化,让恶意节点难以攻击。
随机选择区块生成者与验证者
种子 | 凭证 | 验证者 | 领导者 | 区块产生 |
---|---|---|---|---|
在第一轮种子是系统随机生成,但是后轮次中,种子是前一轮种子和轮数的VRF的随机结果 | 凭证=VRF(种子+节点私钥签名+轮次) | 节点将区块与凭证广播,凭证出现概率小于某个值的节点成为验证者 | 验证者中凭证值最小的数为领导者 | 领导者广播的块将成为下一步验证的区块。 |