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

目录

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.rhkb.cn/news/166346.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实际项目中最常用的设计模式

在软件开发领域,设计模式是一种经过验证的通用解决方案,用于解决各种常见问题。它们有助于提高代码的可维护性、可扩展性和可重用性。虽然有许多不同的设计模式,但以下是实际项目中最常用的一些: 1. 单例模式 (Singleton Pattern) 单例模式确保一个类只有一个实例,并提供…

蓝桥杯每日一题2023.10.21

后缀表达式 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 30分解法&#xff1a;要求出最大的结果就需要加的数越大&#xff0c;减的数越小&#xff0c;以此为思路简单列举即可 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N 2e5 10…

AI智能分析视频监控系统如何助力智慧民宿规范化、安全最大化?

民宿智能监控系统是一种便捷而有效的安全解决方案&#xff0c;它可以提供全面的监控和保护民宿的功能。以下为具体方案&#xff1a; 1、视频监控 安装高清摄像头覆盖民宿的关键区域&#xff0c;如大门、入口、走廊和共用区域等。这些摄像头可以实时监控&#xff0c;记录入住和…

线上Timeout waiting for connection from pool问题分析和解决方案

目录 现象 理论分析 代码分析 解决方案 方案一:直接修改pollingConnectionManager 方案二:修改HttpClient 参考 现象 线上共有5个类似服务,但是只有流量较大的服务会出现成功率的问题。 问题的表现主要是在GetFile(fileId=AgACAgUAAxkDAAEbP1JlJPxyJM82phEKhYYZYfY9…

工业RFID厂家与您分享工业生产制造的应用案例

随着科技的不断进步&#xff0c;RFID技术在工业生产制造领域的应用越来越广泛。AGV/RGV小车运输、立体仓库、生产线、物料跟踪与管理等各行业工业自动化的使用上都有着RFID的身影。为工业生产制造智能化自动化提供了助力。下面&#xff0c;为大家分享RFID技术在工业生产制造上的…

使用C#和Flurl.Http库的下载器程序

根据您的要求&#xff0c;我为您编写了一个使用C#和Flurl.Http库的下载器程序&#xff0c;用于下载凤凰网的图片。以下是一个简单的示例代码&#xff1a; using System; using Flurl.Http;namespace DownloadImage {class Program{static void Main(string[] args){string url…

Unity之ShaderGraph如何实现触电电流效果

前言 之前使用ASE做过一个电流效果的shader&#xff0c;今天我们通过ShaderGraph来实现一个电流效果。 效果如下&#xff1a; 关键节点 Simple Noise&#xff1a;根据输入UV生成简单噪声或Value噪声。生成的噪声的大小由输入Scale控制。 Power&#xff1a;返回输入A的结果…

docker运行redis镜像

很多项目会用到redis作为缓存用到项目中&#xff0c;鉴于刚了解过docker&#xff0c;今天这里用docker运行redis镜像&#xff0c;这样下载&#xff0c;安装运行&#xff0c;或者是使用后的删除都会干净&#xff0c;简单。 好了&#xff0c;第一步是先拉取镜像&#xff0c;使用d…

2023年浙大MEM考前80天上岸经验分享

时间过得真快&#xff0c;转眼间已经是十月份了。回想起去年这个时候&#xff0c;我还在为考研而感到焦虑不安。然而&#xff0c;如今我已经在浙大MEM项目学习了一个多月的时间了。在这一个月的学习过程中&#xff0c;我不仅学到了许多专业知识&#xff0c;还结识了很多志同道合…

STM32cubemx对FreeRTOS的适配(工程模板配置)

文章目录 前言一、工程的创建二、什么是CMSIS三、STM32cubemx生成的FreeRTOS工程分析总结 前言 本篇文章将带大家使用STM32cubemx对FreeRTOS进行工程模板的配置。 一、工程的创建 1.开始工程的创建&#xff1a; 2.芯片型号选择&#xff1a; 3.修改时钟为TIM8&#xff1a; …

JS学习-CryptoJS加密库

CryptoJS加密库 安装库 npm install crypto-js如下例子 对称加密 const CryptoJS require(crypto-js); //引入加密库 var str"123456" //md5加密 console.log(CryptoJS.MD5(str).toString()) var str2 CryptoJS.enc.Utf8.parse(str); //可以把字符串转成UTF-…

大数据Flink(一百):SQL自定义函数(UDF)和标量函数(Scalar Function)

文章目录 SQL自定义函数(UDF)和标量函数(Scalar Function)

只需五步,在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出现则代表安装…

微信小程序之会议OA系统首页布局搭建与Mock数据交互

目录 前言 一、Flex 布局&#xff08; 分类 编程技术&#xff09; 1、Flex布局是什么&#xff1f; 2、基本概念 3、容器的属性 3.1 flex-direction属性 3.2 flex-wrap属性 3.3 flex-flow 3.4 justify-content属性 3.5 align-items属性 3.6 align-content属性 4、项目…

CentOS | 添加普通用户并授权sudo

sudo -i adduser peter passwd peter whereis sudoers nano /etc/sudoers添加一行新用户到root组 ## Allow root to run any commands anywhere root ALL(ALL) ALL peter ALL(ALL) ALL如果提升权限后无法cd到其他目录等&#xff0c;修改 /etc/passwd 文件&…

2023CANN训练营第二季——Ascend C算子开发(入门)——基础概念

第一章 Ascend C 算子开发入门 一、基础概念 1.Ascend C 概念&#xff1a;Ascend C是CANN针对算子开发场景推出的编程语言&#xff0c;原生支持C和C标准规范&#xff0c;最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术&#xff0c;极大提高算子…

Linux中shell外壳,用户权限,文件权限

Linux 权限 1.shell外壳1.1 shell外壳的定义1.2 shell外壳的作用1.3 shell的原理 2.Linux用户权限2.1创建普通用户2.2 用户之间的切换2.3 sudo指令 3.Linux文件权限3.1文件访问者的分类&#xff08;人&#xff09;3.2 文件文件类型和访问权限&#xff08;事物属性&#xff09;3…

大语言模型(LLM)综述(一):大语言模型介绍

A Survey of Large Language Models 前言1. INTRODUCTION2. OVERVIEW2.1 大语言模型的背景2.2 GPT系列模型的技术演变 前言 随着人工智能和机器学习领域的迅速发展&#xff0c;语言模型已经从简单的词袋模型&#xff08;Bag-of-Words&#xff09;和N-gram模型演变为更为复杂和…

【模型推理优化学习笔记】张量并行和流水线并行简介

张量并行 当每个张量被分成多个块时&#xff0c;就会发生张量并行性&#xff0c;并且张量的每个块都可以放置在单独的 GPU 上。在计算过程中&#xff0c;每个块在不同的 GPU 上单独并行处理&#xff0c;并且可以通过组合来自多个 GPU 的结果来计算结果&#xff08;最终张量&am…

postman发送soap报文示例

一、SOAP和WSDL SOAP是一种基于XML的协议 WSDL&#xff08;网络服务描述语言&#xff0c;Web Services Description Language&#xff09;是一门基于 XML 的语言&#xff0c;用于描述 Web Services 以及如何对它们进行访问 二、postman发送soap请求 1、发送post请求&#x…