这个时代就是区块链时代

数据一致性的问题
目前基本生产环境中后台系统都是分布式系统,比如说一个网络变更(配置文件或者其他内容)如何在分布式网络中得到一致的执行结果,这是一个问题。

cap原理及一致性算法分类
在2000年 Principles of Distributed Computing大会上Eric Brewer发表了CAP理论。在2002年, Seth Gilbert和Nancy Lynch发表了更加正式的CAP理论论证。 cap原理中,有三个要素:

1. 一致性(Consistency)
2. 可用性(Availablity)
3. 分区容忍性(Partition Tolerance)
分布式系统只能满足其中两个要素。对于分布式说系统而言,分区容忍性是基本要求,设计分布式系统就是在一致性及可用性中取一个平衡。有两种衡量一致性的方式,客户端一致性:从开发者/客户端的角度:他们如何观察数据更新。服务器端一致性:从服务器端的角度:更新时如何流经系统,和系统对更新有和保证。

客户端一致性
1. 强一致性:在更新操作完成之后,任何后续的访问将返回更新的值。
2. 弱一致性:系统不能保证后续访问返回更新的值。需要在一些条件满足之后,更新的值才能返回。从更新操作开始,到系统保证任何观察者总是看到更新的值的这期间被称为不一致窗口。
3. 最终一致性:这是弱一致性的特殊形式;存储系统保证如果没有对某个对象的新更新操作,最终所有的访问将返回这个对象的最后更新的值。
服务器端一致性
在服务器端,我们需要更加深入地分析更新是如何流经系统,并由此来理解什么驱动了不同模式。这些模式正是系统的开发者能够体验到的。让我们先作如下定义。

1. N=存储数据副本的结点数量
2. W=在更新完成之前,需要同时认可接收的副本数量
3. R=当读操作访问数据对象,需要访问的副本数量
如果W+R>N, 那么写集合和读集合总是重叠并且能保证强一致性。 如在主备RDBMS中,如果使用了同步副本的方式,N=2,W=2和R=1。不管客户端读哪个副本,它总是获得一致性结果。

如果W+R<=N, 那么不能保证强一致性,只能是弱一致性或最终一致性。如在主备RDBMS中,使用异步同步副本,并开启从副本读功能的方式,那么N=2, W=1和R=1。在这种情况下,R+W=N, 一致性不能得到保证。

两阶段提交算法
待写

Paxos算法
Paxos算法主要应用在不存在恶意节点,只存在故障节点的分布式系统。Paxos算法把网络上所有节点分成三种角色:

1. Proposer:提出一个提案,等待大家批准为结案。往往是客户端担任该角色。
2. Accepter:负责对提案进行投票。往往是服务端担任该角色。
3. Learner:被告知结案结果,并与之统一,不参与投票过程。可能是客户端或服务端。
并缺算法需要满足安全性(saftey)和活性(liveness)两方面的约束要求:

1. safety: 保证决议结果正确性。一次执行决议过程中,只批准一个最终决议,意味着多数接受的结果能成为决议。 
2. liveness: 保证决议过程能在有限时间内完成。决议总会产生,并且learners能获得被批准的决议。
Raft算法
Raft算法把网络上所有节点分成三种角色:

1. Leader: 处理所有与客户端交互,日志复制,一般一次只有一个。
2. Follower: 类似选民,被动接收信息。
3. Candidate: 类似Proposer,但可以被选为一个新的Leader。
Raft算法分成两个阶段,第一阶段是选举过程,第二阶段是在Leader带领下进行操作,比如日志复制。假设网络上一共有N台服务器,下面是具体工程:

1. 任何服务器都可以成为Candidate,它向其他服务器发出选择自己的需求
2. 其他服务器回复同意,只要达到N/2+1的票数,该服务器当选为Leader
3. Leader向其他服务器发送命令,如日志复制命令
4. Leader与Followers之间通过心跳维护通信
5. 一旦Leader失联,Followers中等待一定时间超时后成为Candidate,然后重复前面的流程
具体过程可以看一下这个动画Raft Demo

POW
前面说的算法更多是确定节点数分布式共识算法,实际上在区块链网络中有很多节点,而去节点数可变。在这里,我们把上述所说的决议变成记账(两者其实都是一样),要在区块链达成记账一致性(共识),无非需要解决三个问题:

1. 谁拥有记账权
2. 别的节点为什么需要采纳提出节点的记账结果
3. 记账结果如何保证一致性
2009年,中本聪提出划时代基于概率的POW(Proof Of Work,工作量证明)算法,并运用到比特币上。POW算法原理比较简单,先说比较简单的情况,在一轮记账过程中,全网会设定一个难度值,每个节点把区块打包后不断通过特定算法算区块hash值,直到找到比难度小的hash值则可以产生一个合法记账,并广播出去。其他节点接收到记账后可以很方便验证记账合法性,合法后把帐记到自己本地账本,同时让自己进入下一轮记账算力的竞争。由于合法记账需要消耗大量的算力,需要消耗实际的电力,其他节点会倾向承认此次记账。

虽然可以通过算法大大降低特定时间内合法记账的个数,但并不能保证冲突,比如在同一个竞争的周期中有两笔合法记账从而导致分叉。当其他节点接收到两笔合法记账的时候,可以通过特定策略(比如随机选择或者优先选择先接收到),选取一块合法记账区块,并在此基础上继续进行下一轮记账算力竞争。由于合法记账产出的随记性,最终得到更快确认(比如6次确认)的记账区块会成为主链上的记账区块,分叉记账区块被抛弃。

POS
POW需要浪费大量的算力做无意义的运算来保障网络安全性,这是一直被诟病的地方。针对这一点,POS(Proof Of Stake,权益证明)算法被提出,通过所有者权益证明来产生合法记账。POS算法原理就是在网络中拥有更多特定权益的人更多机会产生合法记账,而由于拥有更多特定权益会倾向于维护网络的安全,同时引入一定的惩戒措施来保证作恶会受到制裁。
POS算法中的权益有很多种实现方式,比如说引入“币龄”的概念,也就是说持币者持币的时间越长,币龄越长,所拥有的权益越大。同时为鼓励更多人持币,可引入利息制度,通过经济上鼓励,让更多人忠于网络维护网络,保证网络安全。
同样,产生合法记账方式也有多种,比如通过权益大小适当降低计算难度进行快速产生一次合法记账,或者在一群权益较高的节点中轮训获取记账权益快速产生合法记账。
通过引入权益为公信力进行背书,可以减少计算次数及提升出块速度。

DPOS
在POS算法基础上衍生DPOS(Delegated Proof of Stake,股份授权证明机制)算法。原理是让所有持币人都有机会选出自己的代表,比如全网有1万个参与人,通过一定的算法,参与人以自己的代币为权益证明,选出101个代表,这些代表可以轮流或者采用PoS算法加权的获得记账权,进行记账。 DPoS理论上不要求选出的代表个体本身是权益所有人,看起来更民主,更开放。网络参与者做为选民有机会选出自己的代表,来给自己的利益代言。如果选出的代表不作为(轮到自己记账时不记账),或者作恶,可以把他们踢掉,如有必要进行惩罚(选民们也有可能被惩罚)。否则记账者有机会获得相应的奖励,也有可能将奖励发放给选出自己的民众们。

PBFT
POW, POS, DPOS均是公有链上面最终一致性的共识算法。由于公有链实际上是多节点连接网络,会存在通信延迟,网络故障等,因此会在同一个时间段内有很大概率存在多个节点获得记账权,产生多个合法记账从而导致分叉。分叉的存在实际上就意味着当前的合法记账区块只是被暂时被接受,需要随着时间推移,有更多合法记账区块对它进行确认才会更大概率的被接受而达到最终一致性(比如比特币合法记账区块6次确认才能大概率正式成为主链上的区块)。
实际中,一些业务场景需要达到强一致性,比如在商品消费场景中,一笔支付完成后马上完成商品交割,这一笔支付后面不可能被推翻。为实现这种业务场景,可以采用更小规模的区块链的方式,即是联盟链的方式来进行。

联盟链的业务场景中,大部分节点都是机构节点,数量有限,PBFT(Practical Byzantine Fault Tolerance)算法可以很好的运用在联盟链的场景中

https://download.csdn.net/download/qq_38921412/10460568  区块链技术ppt

https://bbs.csdn.net/topics/392384734 转

猜你喜欢

转载自blog.csdn.net/qq_38921412/article/details/80623284