聊聊分布式架构09——分布式中的一致性协议

news2024/11/16 1:45:36

目录

01从集中式到分布式

系统特点

集中式特点

分布式特点

事务处理差异

02一致性协议与Paxos算法

2PC(Two-Phase Commit)

阶段一:提交事务请求

阶段二:执行事务提交

优缺点

3PC(Three-Phase Commit)

阶段一:CanCommit

阶段二:PreCommit

阶段三:doCommit

优缺点

Paxos算法

拜占庭将军问题

Paxos 算法概述

Paxos 算法的基本流程

03Google Chubby对Paxos的实现


01从集中式到分布式

系统特点
集中式特点

集中式系统通常是单一服务器或单一数据中心的架构。在集中式系统中,每个终端或客户端机器仅仅负责数据的录入和输出,而数据的存储与控制处理完全交由主机完成。但是,随着业务不断发现,加上单一大型主机进行系统扩容又比较困难。以阿里集团的“去IOE”计划启动,电商系统开始正式迈入分布式系统时代。

分布式特点

分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。不难理解,分布式系统都会有如下几个特征:

  • 分布性:多台计算机在空间上随意分布

  • 对等性:没有主/从之分,既没有控制整个系统的主机,也没有被控制的从机,所有计算机节点是对等的。

  • 并发性:多个节点可能会并发地操作一些共享的资源,如数据库或分布式存储等。

  • 缺乏全局时钟:分布式系统由空间上随意分布的多个进程组成的,在系统中,很难定义谁先谁后。

  • 故障总会发生:系统中的所有计算机,都有可能发生任何形式的故障。

事务处理差异

事务具有四个特征:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称为事务的ACID特性。

  1. 原子性(Atomicity):原子性表示事务是一个不可分割的工作单元。这意味着事务中的所有操作要么全部成功,要么全部失败。如果事务的任何部分失败,整个事务将被回滚,以确保数据库状态不会处于不一致的状态。

  2. 一致性(Consistency):一致性确保事务在执行前和执行后,数据库的状态保持一致。这意味着事务必须遵循数据库的完整性约束和业务规则,以确保数据的正确性。如果事务违反了完整性约束,它将被回滚。

  3. 隔离性(Isolation):隔离性指的是多个并发事务之间的独立性。即使多个事务同时访问数据库,它们也不应相互干扰。数据库管理系统必须确保每个事务以独立的方式访问数据,以防止数据竞争和不一致性。

  4. 持久性(Durability):持久性确保一旦事务成功提交,其影响将持久保存在数据库中,即使在系统发生故障时也是如此。这意味着数据的更改不会因系统崩溃而丢失。

在单机数据库中,我们很容易能够实现一套满足ACID特性的事务处理系统,但是分布式的事务处理中问题却层出不穷。其中最为突出的问题是在可用性和一致性之间永远无法存在一个两全其美的方案,针对这个难题的讨论,出现了CAP和BASE这样的分布式系统经典理论。

  1. CAP 定理(CAP Theorem):

    • 一致性(Consistency):所有节点看到的数据是一致的。这意味着无论对于系统的任何部分,如果读取操作返回了某个值,那么后续的读操作都应该返回相同的值。

    • 可用性(Availability):系统能够响应读取和写入请求,即系统在有限时间内响应每个非故障请求。

    • 分区容忍性(Partition Tolerance):系统在面临网络分区(节点之间的通信中断)的情况下仍能继续运行。

    CAP 定理指出,分布式系统无法同时满足这三个特性,最多只能同时满足其中两个。这意味着在面对网络分区时,分布式系统需要在一致性和可用性之间做出权衡。不同的系统可以选择不同的策略,具体取决于应用程序的需求。

  2. BASE 模型

    • 基本可用性(Basically Available):系统保持基本的可用性,即使出现故障,也能继续运行。系统可以放宽一些一致性要求,以保持可用性。

    • 柔性状态(Soft state):系统的状态可以随时发生变化,而不一定要保持强一致性。在某些时刻,系统的部分数据可能会处于不一致状态,但这并不妨碍系统的正常运行。

    • 最终一致性(Eventually Consistent):最终一致性意味着系统最终会在某个时刻达到一致状态,尽管在某些时刻可能不是一致的。系统通过异步复制等机制来逐渐将数据带入一致状态。

    BASE 模型强调了在分布式系统中放宽一致性要求,以提高可用性和性能。它适用于一些大规模、高并发、高可用性的系统,如互联网应用和分布式数据库。

02一致性协议与Paxos算法

在对分布式系统进行架构设计的过程中,往往需要在一致性和可用性之间反复权衡,于是产生了一系列的一致性协议和算法,其中最著名的就是二阶段提交协议(2PC)、三阶段提交协议(3PC)和Paxos算法了。

2PC(Two-Phase Commit)

整个事务是分为两个阶段提交,二阶段提交是一种强一致性的算法。

阶段一:提交事务请求
  1. 事务询问

    协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。

  2. 执行事务

    各个参与者节点执行事务操作,并将 Undo 和 Redo 信息记录到事务日志中,尽量把提交过程中所有消耗时间的操作和准备都提前完成确保后面100%成功提交事务。

  3. 各个参与者向协调者反馈事务询问的响应

    如果各个参与者成功执行了事务操作,那么就反馈给参与者 yes 的响应,表示事务可以执行; 如果参与者没有成功执行事务,就反馈给协调者 no 的响应,表示事务不可以执行。

阶段二:执行事务提交

在阶段二中,协调者会根据反馈的情况决定最终是否可以进行事务提交操作。

  • 执行事务提交(都返回yes)

    1. 发送提交请求

      协调者向所有参与者节点发出Commit请求。

    2. 事务提交

      参与者接收到Commit请求后,正式执行事务提交操作,并在完成提交后释放事务执行期间占用的资源

    3. 反馈事务提交结果。

      参与者完成事务提交之后,向协调者发送Ack消息。

    4. 完成事务

      协调者收到所有参与者反馈的Ack消息后,完成事务

  • 中断事务(任何一个返回了no或者等待超时)

    1. 发送回滚请求

      协调者向所有参与者发出RollBack请求。

    2. 事务回滚

      参与者接收到RollBack请求后,利用阶段一的Undo信息执行回滚,在回滚完成后释放事务执行期间占用的资源。

    3. 反馈事务回滚结果

      参与者在完成事务回滚之后,向协调者发送Ack消息。

    4. 中断事务

      协调者接收到所有参与者反馈的Ack消息后,完成事务中断。

优缺点
  • 优点:原理简单,实现方便。

  • 缺点:同步阻塞,单点问题,脑裂。

3PC(Three-Phase Commit)

3PC是2PC的改进版,将二阶段提交协议的“提交事务请求”过程一分为二,形成由CanCommit、PreCommit和do Commit三个阶段组成的事务处理协议,如下所示:

阶段一:CanCommit
  1. 事务询问

    协调者向所有参与者发送一个包含事务内容的CanCommit请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应。

  2. 各参与者向协调者反馈事务询问的响应

    参与者在接收到来自协调者的CanCommit请求后,正常情况下,如果自身认为能顺利执行事务,会反馈yes,进入预备状态,否则反馈no。

阶段二:PreCommit

根据阶段一的反馈情况,包含两种可能:

  • 执行事务预提交(都返回yes)

    1. 发送预提交请求

      协调者向所有参与者发出PreCommit的请求,进入Prepared阶段。

    2. 事务预提交

      参与者收到PreCommit请求后,执行实务操作,记录Undo和Redo信息到事务日志中。

    3. 各参与者向协调者反馈事务执行的响应

      如果参与者成功执行了事务操作,反馈给协调者Ack响应,等待最终指令:提交(commit)或中止(abort)

  • 中断事务(任何一个返回了no或者等待超时)

    1. 发送中断请求

      协调者向所有参与者发出abort请求。

    2. 中断事务

      无论是收到协调者的abort请求,还是等待协调者请求过程中出现超时,参与者都会中断事务。

阶段三:doCommit

该阶段会进行真正的提交,可能包含两种情况。

  • 执行提交

    1. 发送提交请求

      假设协调者正常,并且收到所有的参与者的Ack响应,将从“预提交”转为“提交”状态,向所有参与者发送doCommit请求。

    2. 事务提交

      参与者收到doCommit请求,正式执行事务提交,并在完成事务提交后释放资源。

    3. 反馈事务提交结果

      参与者完成事务提交之后,向协调者发送Ack消息。

    4. 完成事务

      协调者收到所有参与者反馈的Ack消息,完成事务。

  • 中断事务

    1. 发送中断请求

      假设协调者正常,向所有参与者节点发送abort请求。

    2. 事务回滚

      参与者收到abort请求,利用阶段二中的Undo信息执行事务回滚,回滚完成后释放资源。

    3. 反馈事务回滚结果

      参与者完成事务回滚后,向协调者发送Ack消息。

    4. 中断事务

      协调者收到所有参与者反馈的Ack消息后,中断事务。

一旦进入阶段三,可能会存在一下两种故障:

  • 协调者出现问题

  • 协调者与参与者之间网络出现问题

无论哪种情况,最终参与者都会在等待超时后,继续进行事务提交。

优缺点
  • 优点:降低了参与者的阻塞范围,在单点故障之后继续达成一致。

  • 缺点:网络分区的出现会导致协调者和参与者无法正常地网络通信,参与者仍会提交事务,会导致数据的不一致性。

Paxos算法

Paxos算法是1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。它需要解决的问题是如何在一个可能发生异常的分布式系统中快速且正确地在集群内部对某个数据的值达成一致,且不会破坏系统的一致性。

拜占庭将军问题

在拜占庭帝国,有一位将军领导一支军队,他需要协调攻城的计划。将军的军队分布在城市周围,而城市之间的通信需要通过信使传递消息。然而,帝国中存在叛变的将军,他们可能会传递虚假的消息以迷惑其他将军。问题的目标是找到一种方法,使得忠诚的将军能够在叛变的将军存在的情况下达成共识,以决定是否进攻城市。

Paxos 算法概述

是一种用于分布式系统中的共识算法,它的主要目标是使多个节点在分布式环境中达成一致的决策。

Paxos 算法解决了拜占庭将军问题中的信任问题和共识问题。它具有以下基本概念:

  1. 提议者(Proposers):这些是节点,它们提出值(决策)并试图说服其他节点接受这个值。

  2. 接受者(Acceptors):这些是节点,它们接受提议并投票赞成或反对提议。

  3. 学习者(Learners):这些是节点,它们学习提议的结果并在需要时应用它们。

Paxos 算法的基本流程
  1. 提议阶段

    • 提议者向接受者提出提议(值)。

    • 接受者根据一定规则投票赞成或反对提议。规则包括:一个接受者只能投票一次,接受者可以投赞成或反对票,如果一个接受者已经接受了一个提议,它不能再接受其他提议。

  2. 批准阶段

    • 如果提议者获得了多数接受者的赞成票,提议被批准。

    • 提议者通知所有节点提案已被批准,节点学习(获取)这个值。

  3. 学习阶段

    • 学习者学习提案的结果,并在需要时应用它。

03Google Chubby对Paxos的实现

Google Chubby 是 Google 内部使用的分布式锁服务,它基于 Paxos 算法实现。Chubby 允许分布式系统在多个节点之间协同工作,以确保数据一致性和强一致性。Google Chubby 不是开源的。

Chubby 本来应该被设计成一个包含Paxos算法的协议库,应用程序可以基于这个库方便地使用Paxos算法,但是它并没有这么做,而是把Chubby设计成了一个需要访问中心化节点的分布式锁服务。既然是一个服务,那么它肯定需要是一个高可靠的服务。所以 Chubby 被构建为一个集群,集群中存在一个中心节点(MASTER),采用Paxos协议,通过投票的方式来选举一个获得过半票数的服务器作为 Master,在 chubby 集群中,每个服务器都会维护一份数据的副本,在实际的运行过程中, 只有 master 服务器能执行事务操作,其他服务器都是使用paxos协议从master节点同步最新的数据。

以下是关于 Google Chubby 和其对 Paxos 的实现的一些简要信息:

  1. Paxos 算法实现:Chubby 使用 Paxos 算法作为其核心共识算法。Paxos 用于确保 Chubby 中的数据一致性。这意味着 Chubby 使用多个 Paxos 实例来处理不同类型的数据,例如锁、配置信息等。

  2. 领导者选举:Chubby 中有一个特殊的节点称为 "master" 或 "leader",它负责协调锁服务并维护一致性。Chubby 使用 Paxos 来选择 leader。Leader 选举是 Paxos 的一个实例,用于确保只有一个节点成为 leader。

  3. 分布式锁管理:Chubby 提供了分布式锁服务,使得多个客户端可以竞争获取锁。这些锁的管理也基于 Paxos,确保锁的一致性和互斥性。

  4. 配置管理:Chubby 用于存储和维护配置信息,如服务的地址、节点信息等。这也是一个使用 Paxos 来维护一致性的应用。

  5. 故障容忍性:Chubby 具有一定的故障容忍性。即使一些节点出现故障,Chubby 仍然能够继续工作。Paxos 的特性使得 Chubby 在节点失效和网络分区的情况下能够维护一致性。

  6. 性能优化:Chubby 做了一些性能优化,以提高 Paxos 算法的效率。这包括缓存机制和快速恢复机制。

参考书籍:从Paxos到Zookeeper 分布式一致性原理与实践 [倪超著]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1116397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kubeadm初始化搭建cri-dockerd记录 containerd.io

07.尚硅谷_搭建K8s集群(kubeadm方式)-部署master节点_哔哩哔哩_bilibili 视频里的版本只有1.17而现在(2023.10.20)kubernetes最新版本是1.28,需要搭载cri-dockerd, 先去网站下载了对应的rpm包cri-dockerd…

计算机算法分析与设计(14)---贪心算法(会场安排问题和最优服务次序问题)

文章目录 一、会场安排问题1.1 问题描述1.2 思路分析1.3 例题分析1.4 代码编写 二、最优服务次序问题2.1 问题描述2.2 思路分析2.3 代码编写 一、会场安排问题 1.1 问题描述 假设在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进…

kettle 导出Excel 日期信息为空bug

今天做个需求,跨库联表查询数据。导出为Excel ,但是日期数据除了问题。日期yyyy/mm/dd hh:mm:ss 竟然是空的 。 解决办法: 一、(网上给出最多的解决方案,但本人不实用。需要安装MySQL监听) to_char(日期,…

Mojo——会燃的 AI 编程语言

点击链接了解详情 导语:本文简介 Mojo 的背景与特点,并分享如何通过腾讯云 Cloudstudio 的 WebIDE 和分享社区快速学习和上手 Mojo。 🔥🔥🔥 腾讯云 Cloud Studio 已开放 Mojo 应用模版。 什么是 Mojo Mojo 是基于 P…

CodeFormer和GFPGAN的本地部署与效果对比

CodeFormer和GFPGAN是两个图片人脸修复的开源程序,两个程序不相伯仲,效果都非常棒,在stable diffusion中这两个插件都有集成进去!我们今天就将这两个程序的本地独立安装和使用方法记录一下! CodeFormer github主页地址…

【前端】使用tesseract插件识别提取图片中的文字

前言 有时候项目需要识别证照信息,或者拍照搜索内容等。图片处理一般是后端处理比较好,不过前端也有相关插件处理,tesseract.js就是一种前端处理方案。 使用tesseract tesseract更多的语言模型:language配置 安装 Tesseract.…

react中JSX基础与useState的基本使用 + 评论显示删除需求案例

参考视频:https://www.bilibili.com/video/BV1ZB4y1Z7o8/?p3&spm_id_frompageDriver&vd_source5c584bd3b474d579d0bbbffdf0437c70 如果没有安装create-react-app需要先全局安装 命令:npm i -g create-react-app1.快速搭建开发环境 create-re…

国内有哪些做得好的企业协同办公软件

在当今信息化时代,企业协同办公软件成为了提升企业效率和推动协作的重要工具。国内市场涌现出许多优秀的企业协同办公软件,为企业提供了高效、便捷的协同办公解决方案。在本文中,我们将向大家介绍3款在国内好评如潮的企业协同办公软件&#x…

驱动day2 字符设备驱动 LED亮灯

可参考arm点灯C语言 cortex-A7核 点LED灯 &#xff08;附 汇编实现、使用C语言 循环实现、使用C语言 封装函数实现【重要、常用】&#xff09;-CSDN博客 1 应用程序 test.c #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <…

Adobe 推出 Photoshop Elements 2024 新版

&#x1f989; AI新闻 &#x1f680; Adobe 推出 Photoshop Elements 2024 新版 摘要:Adobe 最新发布 Photoshop Elements 2024 版本,新增引入 AI 功能,提供匹配颜色、创建照片卷、一键选择照片天空或背景等新功能,界面也进行了优化更新。本次发布重点加强了 AI 支持,简化复杂…

软考系列(系统架构师)- 2019年系统架构师软考案例分析考点

试题一 软件架构&#xff08;架构风格、质量属性&#xff09; 【问题1】&#xff08;13分&#xff09; 针对用户级别与折扣规则管理功能的架构设计问题&#xff0c;李工建议采用面向对象的架构风格&#xff0c;而王工则建议采用基于规则的架构风格。请指出该系统更适合采用哪种…

ant design vue Message 用法以及内容为 html片段情况

ant design vue 的 Message 用法 全局展示操作反馈信息 何时使用 # 可提供成功、警告和错误等反馈信息。顶部居中显示并自动消失&#xff0c;是一种不打断用户操作的轻量级提示方式。 全局配置&#xff1a; // main.ts// 进行全局配置 message.config({top: 0.7rem,//高度…

Qt作业九

1、思维导图 2、作业 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include <QTime> #include <QTimerEvent> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAME…

面向对象设计原则,详细介绍及分析

一、介绍&#xff1a; 面向对象设计原则是面向对象设计的基石&#xff0c;是面向对象设计的质量、保障、思想。 一共有七个设计原则&#xff0c;设计模式就是面向对象设计原则的经典应用 单一职责原则* 强调&#xff1a;高内聚低耦合&#xff0c;每一种类型的业务区分 开闭原则…

计算各数位的和是否相等(桶排)

// 分别计算左右两边各数的和&#xff0c;不同值时的数量 eg.四位数&#xff0c;左边数的有10~99&#xff0c;右边数有00~99 和有1~18 和有0~18 桶排&#xff0c;和相同放一个桶&#xff0c;分别计算左右两边不同和的数量 while (len < 8){int left[50] …

2023区块链国赛有黑幕

2023全国职业院校技能大赛区块链技术应用赛项 有黑幕&#xff01;&#xff01;河北软件职业技术学院举行的全国职业院校技能大赛区块链技术应用赛项违反比赛公平原则&#xff1a; 1、在评分阶段居然允许企业人员进入裁判所在区域&#xff0c;偏向性的引导裁判评分&#xff0c…

只需五步,在Linux安装chrome及chromedriver(CentOS)

一、安装Chrome 1&#xff09;先执行命令下载chrome&#xff1a; wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm2&#xff09;安装chrome yum localinstall google-chrome-stable_current_x86_64.rpm看到下图中的Complete出现则代表安装…

网络安全—自学笔记

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类…

搭建哨兵架构(windows)

参考文章&#xff1a;Windows CMD常用命令大全&#xff08;值得收藏&#xff09;_cmd命令-CSDN博客 搭建哨兵架构&#xff1a;redis-server.exe sentinel.conf --sentinel 1.在主节点上创建哨兵配置 - 在Master对应redis.conf同目录下新建sentinel.conf文件&#xff0c;名字绝…

<蓝桥杯软件赛>零基础备赛20周--第1周

报名明年年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列。 每个周末发1个博客&#xff0c;共20周&#xff0c;到明年3月初结束。跟上本博客的节奏&#xff0c;省赛三等奖跑不掉。 每周…