热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从分布式一致性算法到区块链共识算法(一)

从分布式一致性算法到区块链共识算法(一)本文主要参考书籍:区块链原理、设计与应用第二版一致性问题一致性问题是分布式领域最为基础也是最重要的问题。如果分布式系统能实现“一致”,对外就
从分布式一致性算法到区块链共识算法(一)

本文主要参考书籍:区块链原理、设计与应用第二版

一致性问题

一致性问题是分布式领域最为基础也是最重要的问题。 如果分布式系统能实现“一致”, 对外就可以呈现为一个完美的、可扩展的“虚拟节点”,相对物理节点具备更优越性能和稳 定性 。 这也是分布式系统希望能实现的最终目标。

一致性要求

  1. 可终止性( termination ):一致的结果在有限时间内能完成;
  2. 约同性( agreement):不同节点最终完成决策的结果是相同的;
  3. 合法性( validity):决策的结果必须是某个节点提出的提案 。

带约束的一致性

要实现绝对理想的严格一致性( strict consistency)代价很大 。 除非系统不发生任何故障,而且所有节点之间的通信无需任何时间,这个时候整个系统其实就等价于一台机器了 。
实际上,越强的一致性要求往往会造成越弱的处理性能,以及越差的可扩展性 。

一般来讲,强一致性( strong consistency)主要包括下面两类:

  1. 顺序一致性( sequential consistency) : Leslie Lamport 在 1979 年的经典论文 《 How toMake a Multiprocessor Computer That Correctly Executes
    Multiprocess Programs 》 中提出,是一种比较强的约束,保证所有进程看到的全局执行顺序( total order )
    一致,并且每个进程看自身的执行顺序( local order)跟实际发生顺序一致。 例如,某进程第 4 重分布式系统核心问题 令 37先执行
    A ,后执行 B ,则实际得到的全局结果中就应该为 A 在 B 前面,而不能反过来 。 同时所有其他进程在全局上也应该看到这个顺序 。
    顺序一致性实际上限制了各进程内指令的偏序关系,但不在进程间按照物理时间进行全局排序;
  2. 线性一致性( linearizability consistency) : Maurice P. Herlihy 与 Jeannette M. Wing 在1990 年的经典论文 《 Linearizability: A Correctness
    Condition for Concurrent Objects
    中共同提出,在顺序一致性前提下加强了进程间的操作排序,形成唯一的全局顺序(系统等价于是顺序执行,所有进程看到的所有操作的序列顺序都一致,并且跟实际发生顺序一致),是很强的原子性保证。
    但是比较难实现,目前基本上要么依赖于全 局的时钟或锁,要么通过一些复杂算法实现,性能往往不高 。

由于强一致性的系统往往比较难实现,而且很多时候,实际需求并没有那么严格需要 强一致性 。 因此,可以适当地放宽对一致性的要求,从而降低系统实现的难度 。 例如在一定约束下实现所谓最终一致性( eventual
consistency),即总会存在一个时刻(而不是立刻),让系统达到一致的状态 。 大部分 Web 系统实现的都是最终一致性 。
相对强一致性,这一类在某些方面弱化的一致性都笼统称为弱一致性(weak consistency ) 。

FLP不可能定理

定义

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

FLP 不可能原理实际上告诉人们,不要浪费时间,去为异步分布式系统设计在任意场 景下都能实现共识的算法。

正确理解

FLP不可能定理的最大适用前提是异步网络模型。何为同步、异步模型呢?

  1. 所谓异步模型,是说从一个节点到另一个节点的消息延迟是有限的,但可能是无界的(finite but can be unbounded)。这就意味着如果一个节点没有收到消息,它无法判断消息到底是丢失了,还是只是延迟了。也就是说,我们无法通过超时时间来判断某个节点是否故障。
  2. 所谓同步模型,是说消息传递的延迟是有限的,且是有界的。这就意味着我们可以通过经验或采样精确估算消息的最大可能延迟,从而可以通过超时时间来确定消息是否丢失、节点是否故障。
    综上所述,在分布式系统中,同步和异步这两个术语存在特殊的含义 。 同步是指系统中的各个节点的时钟误差存在上限;并且消息传递必须在一定时间
    内完成, 否则认为失败 ;同时各个节点完成处理消息的时间是一定的 。 对于同步系统,可以很容易地判断消息是否丢失 。
    异步是指系统中各个节点可能存在较大的时钟差异,同时消息传输时间是任意长的,各节点对消息进行处理的时间也可能是任意长的,这就造成无法判断某个消息迟迟没有被响应是哪里出了问题(节点故障还是传输故障?)

如何规避“FLP不可能定理”

研究者们通过调整问题模型来规避“FLP 不可能定理”从而寻找工程上可行的共识算法, 比如比特币系统中通过假定网络为弱同步性, 即网络节点间可以快速同步,以及矿工在一个区块上投入有限的时间等来规避“FLP
不可能定理”。通过调整问题模型规避“FLP 不可能定理”, 使得共识算法存在“工程解”。

CAP定理

定义

分布式系统无法同时满足一致性 (Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance), 最多只能同时满足其中两个特性, 如下图所示。
《从分布式一致性算法到区块链共识算法(一)》

  1. 一致性是指分布式系统中所有节点在同一时刻持有同样的数据信息,而且任何操作应该都是原子的,发生在后面的事件能看到前面事件发生导致的结果,注意这里指的是强一致性;
  2. 可用性是指系统处于服务状态, 当客户端发出请求, 服务端能在有效的时间内返回结果;
  3. 分区容忍性是指允许网络中部分节点不与其他节点通信,即允许网络发生分区(不同区域之间的节点不能建立通信)。

应用场景

  1. 弱化一致性
    对结果一致性不敏感的应用,可以允许在新版本上线后过一段时间才最终更新成功, 期间不保证一致性 。 例如网站静态页面内容 、 实时性较弱的查询类数据库等,简单分布式同步协议如 Gossip ,以及 CouchDB 、 Cassandra 数据库等,都是为此设计的 。
  2. 弱化可用性
    对结果 一 致性很敏感的应用,例如银行取款机,当系统故障时候会拒绝服务 。 MongoDB 、 Redis 、MapReduce 等是为此设计的 。 Paxos 、 Raft 等共识算法,主要处理这种情况 。在 Paxos
    类算法中,可能存在着无法提供可用结果的情形,同时允许少数节点离线 。
  3. 弱化分区容忍性
    现实中,网络分区出现概率较小,但较难完全避免。 两阶段的提交算法,某些关系型 数据库及 ZooKeeper 主要考虑了这种设计。 实践中,网络可以通过双通道等机制增强可靠性,达到高稳定的网络通信。

推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
  • 知识图谱表示概念:知识图谱是由一些相互连接的实体和他们的属性构成的。换句话说,知识图谱是由一条条知识组成,每条知识表示为一个SPO三元组(Subject-Predicate-Obj ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • Maven构建Hadoop,
    Maven构建Hadoop工程阅读目录序Maven安装构建示例下载系列索引 序  上一篇,我们编写了第一个MapReduce,并且成功的运行了Job,Hadoop1.x是通过ant ... [详细]
  • Ansibleplaybook roles安装redis实例(学习笔记二十九)
    1、相关redis参数:2、templatesredis.conf配置相关参数:daemonizeyespidfilevarrunredis_{{red ... [详细]
author-avatar
-晴天2602926075
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有