当前位置:   article > 正文

不懂分布式系统的核心问题:一致性与共识,还想入门区块链?挖矿?

不懂分布式系统的核心问题:一致性与共识,还想入门区块链?挖矿?

对于要能容忍拜占庭错误的情况,一般包括PBFT(Practical Byzantine Fault Tolerance)为代表的确定性系列算法、PoW为代表的概率算法等。对于确定性算法,一旦达成了对某个结果的共识就不可逆转,即共识的是最终结果;而对于概率类算法,共识结果则是临时的,随着时间的推移或某种强化,共识结果被推翻的概率越来越小,成为事实上的最终结果。拜占庭类容错算法往往性能比较差,容忍不超过1/3的故障节点。

不懂分布式系统的核心问题:一致性与共识,还想入门区块链?

FLP不可能原理

========

FLP不可能原理:在网络可靠,但允许节点失效(即便只有一个)的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性共识算法。

先说一下什么是“同步”“异步”,同步是指系统中的各个节点的时钟误差存在上限;并且消息传递必须在一定时间内完成;否则认为失败;同时各个节点完成处理消息的时间是一定的。同步系统很容易判断消息是否丢失。异步是指系统中的各个节点可能存在较大的时钟差异,同时消息传输时间是任意长的,各个节点对消息进行处理的时间也可能是任意长的,就无法判断收不到消息响应式节点故障还是传输故障。

FLP不可能原理是否意味着研究共识算法没有意义?这只是学术界研究的最极端情形。

科学告诉你什么是不可能的;工程则告诉你,付出一些代价,可以把它变成可行。

在付出一些代价的情况下,我们在共识的达成上,能做到多好?回答这个问题的一个很有名的原理:CAP原理。

CAP原理

=====

CAP原理:分布式计算系统不可能同时确保以下三个特性:

  • 一致性(consistency)

  • 可用性(availability)

  • 分区容忍性(partition)

不懂分布式系统的核心问题:一致性与共识,还想入门区块链?

**(1)分区容忍性:**网络可能发生分区,即节点之间的通信不可保障。

大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。

不懂分布式系统的核心问题:一致性与共识,还想入门区块链?

上图中,G1 和 G2 是两台跨区的服务器。G1 向 G2 发送一条消息,G2 可能无法收到。系统设计的时候,必须考虑到这种情况。

一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。

**(2)一致性:**任何操作应该都是原子的,发生在后面的事件能看到前面事件发生导致的结果,这指的是强一致性。

写操作之后的读操作,必须返回该值。举例来说,某条记录是 v0,用户向 G1 发起一个写操作,将其改为 v1。

不懂分布式系统的核心问题:一致性与共识,还想入门区块链?

接下来,用户的读操作就会得到 v1。这就叫一致性。

问题是,用户有可能向 G2 发起读操作,由于 G2 的值没有发生变化,因此返回的是 v0。G1 和 G2 读操作的结果不一致,这就不满足一致性了。

为了让 G2 也能变为 v1,就要在 G1 写操作的时候,让 G1 向 G2 发送一条消息,要求 G2 也改成 v1。

不懂分布式系统的核心问题:一致性与共识,还想入门区块链?

这样的话,用户向 G2 发起读操作,也能得到 v1。

**(3)可用性:**在有限时间内,任何非失败节点都能应答请求。

只要收到用户的请求,服务器就必须给出回应。用户可以选择向 G1 或 G2 发起读操作。不管是哪台服务器,只要收到请求,就必须告诉用户,到底是 v0 还是 v1,否则就不满足可用性。

**一致性和可用性,为什么不可能同时成立?**答案很简单,因为可能通信失败(即出现分区容错)。

如果保证 G2 的一致性,那么 G1 必须在写操作时,锁定 G2 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,G2 不能读写,没有可用性不。

如果保证 G2 的可用性,那么势必不能锁定 G2,所以一致性不成立。

综上所述,G2 无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。

应用场景

弱化一致性的场景,例如网站静态页面内容,实时性较弱的查询类数据库等对一致性不敏感的。

弱化可用性的场景,例如银行取款机,对一致性很敏感。

弱化分区容忍性,某些关系型数据库及ZooKeeper主要考虑这种设计。网络可以通过双通道等机制增强可靠性,达到高稳定的网络通信。

ACID原则

======

ACID原则指的是:

  • Atomicity(原子性)

  • Consistency(一致性)

  • Isolation(隔离性)

  • Durability(持久性)

这是比较有名的描述一致性的原则,通常出现在分布式数据库领域。满足一致性需求,但是允许付出可用性的代价。

  • A:每次操作是原子的,要么成功,要么不执行;

  • C:数据库的状态是一致的,无中间状态;

  • I:各种操作之间互不影响;

  • D:状态的改变是持久的,不会失效。

与ACID相对的一个原则是BASE(Basic Availability, Soft-state, Eventual Consistency)原则,牺牲对一致性约束(但实现最终一致性),来换取一定的可用性。

区块链的分布式特性

=========

区块链有一种机制来保护自身的安全性,那就是分布式。相对于用一个中心化的实体来管理区块链网络,区块链采用的是一种peer-to-peer网络,并且所有人都可以加入。当有人加入这个网络时,他就会得到整个区块链的复制。这个人就可以以此来验证是否所有的区块还是合法未篡改的。

那么接下来我们就来看看,当某人创建了一个新的区块时,会发生哪些改变这个新的区块会被发送给网络上的所有人。每个人再验证这个区块以确保这个区块没有被篡改过。如果所有的东西都被检验正确之后,那么每个人就都会把这块新的区块加到自己的区块链上。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

读者福利

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

更多笔记分享

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

[外链图片转存中…(img-yn2GVioO-1713445195979)]

更多笔记分享

[外链图片转存中…(img-8D2C80mP-1713445195980)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/597327
推荐阅读
相关标签
  

闽ICP备14008679号