【区块链技术(06)】为什么分布式系统会存在数据一致性问题?本文带你理解:CAP和FLP定理、拜占庭将军问题;Paxos和Raft两种分布式算法

分布式系统一致性

一致性问题

在分布式环境中,由于各个节点之间的通信存在延迟和不确定性,如何保证数据的一致性称为一个挑战

一致性是指分布式系统中所有节点对于某个操作或数据状态达成的共识。

当多个节点参与某个操作时,它们需要遵循一定的规则来保证数据的一致性

CAP 和 FLP 定理

CAP 定理

在一个分布式系统中,当涉及到读写操作时,只能保证以下三点中的两点:

  • 一致性:Consistency
  • 可用性:Availability
  • 分区容错性:Partition tolerance
Consistence(一致性)

CAP理论中的一致性:

  • 强一致性(Strong Consistency)又称:线性一致性(Linearizable Consistency)

它要求多节点组成的分布式系统,能像单节点一样运作

如果一个写操作返回成功

  • 那么之后的读请求都必须读到这个新数据。

如果返回失败

  • 那么所有的读操作都不能读到这个数据

三种一致性:

  1. 强一致性:

    当更新操作完成后,在任何时刻所有的用户或进程查询到的都是最新一次成功更新的数据

  2. 弱一致性:

    当数据更新后,后续对该数据的读操作可能得到更新后的值,也可能是更新前的值

  3. 最终一致性:

    在某一时刻用户或进程查询到的数据可能都不同,但是最终成功更新的数据都会背所有用户或进程查询到

Availability(可用性)

CAP理论对可用性的定义:

  • 要求系统提供的服务必须**处于100%可用状态**,

  • 对于用户的每一个操作请求,系统总能够在有限的时间内返回结果

用户访问集群中的任意健康节点,必须能得到响应,而不是超时或拒绝。

  1. 一定返回数据
  2. 但不保证数据是最新的
Partition Tolerance(分区容错性)

Parittion(分区):

  • 因为网络故障或其他原因导致分布式系统中的部分节点与其他节点失去连接,形成独立分区

Tolerance(容错):

  • 在集群出现分区中整个系统也要持续对外提供服务

由于分布式系统通过网络进行通信,网络是不可靠的

当任意数量的消息丢失或延迟到达阈值时,系统仍会继续提供服务,不会挂掉

  1. 一直运行,不会存在系统挂掉的问题

FLP 定理

在异步通信场景,即使只有一个进程失败,也没有任何算法能保证非失败进程达到一致性

因为同步通信中的一致性背证明是可以达到的,因此在之前一直有人尝试各种算法解决以异步环境的一致性问题,有个FLP的结果。

sample难以涉及,除非先设计几种一致性算法,并用FLP说明这些算法都是错误的

系统模型

任何分布式算法或定义,都尤其对系统场景的假设:系统模型

假设:

  1. 异步通信

    与同步通信的最大区别是没有时钟、不能时间同步、不能使用超时、不能探测失败、消息可任意延迟、消息可乱序

  2. 通信健壮

    只要进程非失败,消息虽会被无限延迟,但最终会被送达

    并且消息仅会被送达一次(无重复)

  3. fail-stop模型

    进程失败如同宕机,不再处理任何消息

    相对Byzantine模型,不会产生错误消息

  4. 失败进程数量

    最多一个进程失败

都是用TCP协议(保证了消息健壮、不重复、不乱序),每个节点都有NTP时钟同步(可以使用超时),纯的异步场景相对比较少。

拜占庭将军问题

场景设定:

拜占庭帝国(Byzantine Empire)军队的几个师驻扎在敌城外,每个师都由各自的将军指挥。将军们只能通过信使相互沟通。

在观察敌情之后,他们必须制定一个共同的行动计划,如进攻(Attack)或者撤退(Retreat) ,且只有当半数以上的将军共同发起进攻时才能取得胜利

然而,其中一些将军可能是叛徒,试图阻止忠诚的将军达成一致的行动计划. 更糟糕的是,负责消息传递的信使也可能是叛徒,他们可能篡改或伪造消息,也可能使得消息丢失。

当三个将军都忠诚时,可以通过投票确定一致的行动方案。

展示了一种场景:

  • 即General A, B通过观察敌军军情并结合自身情况判断可以发起攻击

    而General C通过观察敌军军情并结合自身情况判断应当撤退

最终三个将军经过投票表决得到结果为进攻: 撤退=2:1, 所以将一同发起进攻取得胜利.

对于三个将军,每个将军都能执行**两种决策(进攻或撤退)**的情况下,共存在6中不同的场景,对于其他5中场景可简单地推得,通过投票三个将军都将达成一致的行动计划.

当三个将军中存在一个叛徒时,将可能扰乱正常的作战计划

他给General A和General B发送了不同的消息, 在这种场景下General A通过投票得到进攻:撤退=1:2, 最终将作出撤退的行动计划;

General B通过投票得到进攻:撤退=2:1, 最终将作出进攻的行动计划.

结果只有General B发起了进攻并战败.

事实上,对于三个将军中存在一个叛徒的场景, 想要总能达到一致的行动方案是不可能的.

此外,论文中给出了一个更加普适的结论: 如果存在m 个叛将,那么至少需要3m+1个将军,才能最终达到一致的行动方案

Paxos算法

Paxos算法解决的问题正是分布式一致性问题,即一个分布式系统中的各个进程如何就某个值(决议)达成一致

Paxos算法运行在允许宕机故障的异步系统中,不要求可靠的消息传递可容忍消息丢失、延迟、乱序以及重复

它利用Majority机制保证了2F+1的容错能力

即:2F+1个节点的系统最多允许F个节点同时出现故障

Raft算法

raft是工程上使用较为广泛的强一致性、去中心化、高可用的分布式协议。

raft是一个共识算法(consensus algorithm),所谓共识,就是多个节点对某个事情达成一致的看法,即使是在部分节点故障、网络延时、网络分割的情况下。

在分布式系统中,共识算法更多用于提高系统的容错性,比如

  • 分布式存储中的复制集(replication)

raft协议就是一种leader-based的共识算法,与之相应的是leaderless的共识算法。

raft 为了易于理解目标,做了两个工作:

  • 问题分解
  • 状态简化

问题分解:

  • 是将"复制集中节点一致性"这个复杂的问题划分为数个可以被独立解释、理解、解决的子问题。

状态简化:

  • 对算法做出一些限制,减少需要考虑的状态数,使得算法更加清晰,更少的不确定性

🎶🥸🏏区块链专栏前瞻

💕👉博客专栏

相关推荐
狮恒4 小时前
OpenHarmony Flutter 分布式音视频协同:跨设备实时流传输与同步渲染方案
分布式·flutter·wpf·音视频·openharmony
Lansonli4 小时前
大数据Spark(七十五):Action行动算子foreachpartition和count使用案例
大数据·分布式·spark
野老杂谈5 小时前
【Solidity学习】合约基本结构与状态变量
学习·区块链
源代码•宸12 小时前
分布式缓存-GO(分布式算法之一致性哈希、缓存对外服务化)
开发语言·经验分享·分布式·后端·算法·缓存·golang
Wang's Blog14 小时前
RabbitMQ: 消息中间件技术选型
分布式·rabbitmq
小明的小名叫小明15 小时前
区块链核心知识点梳理(6)-区块链浏览器解读
区块链
Sui_Network17 小时前
备受期待的 POP 射击游戏 XOCIETY 正式在 Epic Games Store 开启体验
人工智能·游戏·rpc·区块链·量子计算·graphql
友莘居士19 小时前
Solidity 抽象合约与接口合约详解
区块链·抽象合约·接口合约
lkbhua莱克瓦2419 小时前
BTC-密码学原理
区块链·密码学·btc