分布式数据一致性小结

news2024/9/25 7:13:35

文章目录

    • 简介
    • 一、线性一致性
    • 二、顺序一致性
    • 三、因果一致性
    • 四、以客户端为中心的一致性
    • 参考

简介

分布式一致性问题包括数据一致性问题事务一致性问题。在此仅关注数据一致性问题数据一致性问题是因为分布式系统下数据需要复制而导致的。

数据一致性模型就是规定在并发的进行数据复制时,每个节点应该看到的视图是怎样的。
不同的 数据一致性模型 对于视图的规定不一样。

假设:
在这里插入图片描述
有两个进程 p1p2,各自发生的事件为 p1_1、p1_2p2_1、p2_2
如果不做任何限制,那么这四个事件在全局所有节点看来有 4! 种可能(由于网络波动或者任何原因,这些事件会完全的乱序由别的节点感知到)。
在这里插入图片描述
一致性模型 就是对事件的排列做出限制,让所有节点只可以感知到受限集合内的事件发生顺序。而限制集合内的事件发生顺序(视图)符合的特性就是 一致性模型 的特性。

在此只介绍几种常见的 一致性模型,包括:线性一致性顺序一致性因果一致性单调读单调写读己所写读后写

一、线性一致性

最强的一致性,要求分布式系统需要有一个全局时钟,在全局时钟下按顺序发生的事件,在各个节点处理时也必须按全局时钟顺序发生。即各个进程看到的操作顺序和全局时钟下的顺序一致。

简介中的例子,假设全局时钟下发生的顺序为 p1_1、p1_2 、p2_1、p2_2,则集群内的所有节点看到的顺序都是这个顺序。

如何实现线性一致性? 可以使用 raft 协议,但需要保证读、写操作都是通过 leader 进行执行,并通过决议。如果读操作可以读取从节点,则无法保证每个进程的操作执行顺序和全局时钟下的顺序一致,即读操作可能会读到旧的数据。

二、顺序一致性

满足顺序一致性有两个条件:

  • 每个节点对于某节点事件的执行顺序和发生该事件的节点一致
  • 对变量的读写要表现的像 FIFO 一样先入先出,即每次读到的都是最近写入的数据,不同节点对于共享变量的修改必须以相同的顺序被所有进程看到

简介中的例子,P1 的顺序为 p1_1 (write x = 1)、p1_2 (read x) ,P2 的顺序为 p2_1 (write x = 2)、p2_2 (read x),则集群中节点感知到的事件顺序可以为(但只能为一种,即有四种可能,但只有一种是集群中节点真实看到的序列):

  • p1_1、p1_2、p2_1、p2_2,此时 p1 读到 x = 1,p2 读到 x = 2
  • p1_1、p2_1、p1_2、p2_2,此时 p1、p2 读到的 x = 2
  • p2_1、p1_1、p1_2、p2_2,此时 p1、p2 读到的 x = 1
  • p2_1、p2_2、p1_1、p1_2,此时 p1 读到 x = 1,p2 读到 x = 2

如何实现顺序一致性? 可以使用 raft 算法,写操作必须由 leader 发起且经过 raft 状态机,读请求也是访问 leader 但可以不经过 raft 状态机,同一个节点的读请求必须在该节点的写请求执行完毕之后才能得到处理。例如,为每个节点维护一个任务队列,每个队列同一时刻可以取一个任务执行,如果是写写请求,串行执行,如果是读写请求,并行执行。

此时最新的更新,可能其他节点不能立马感知到,比如 p1_1、p1_2、p2_1、p2_2 这个序列:

  • 先取 p1_1p2_1 ,是写写,串行执行。
  • 假定先执行 p1_1p1_1 执行完毕后,从 p1 的请求队列中取p1_2, 此时待执行的请求为 p2_1p1_2,是读写,并行执行
  • p1_2 获取到 x = 1 (此时 p1 没有感知到最新的更新,但是它可以看到自己的最新更新)
  • p2_1 执行完毕,更新集群 x = 2
  • 再取 p2 请求队列中的 p2_2,读取到 x = 2

此时,每个节点可以看到自己的最新更新,但是可能看不到整个集群的最新更新,但是写写是没有冲突的,且每个节点对于请求的视图是一致的。

三、因果一致性

前面两种一致性都保证了集群中所有节点看到的视图是一致的,而因果一致性无需所有节点看到的视图一致。

依然为简介中的假设,P1 的顺序为 p1_1 (write x = 1)、p1_2 (read x) ,P2 的顺序为 p2_1 (write x = 2)、p2_2 (read x),则集群中节点感知到的事件顺序可以为以下任意一种(不再限制所有节点看到的视图一致):

  • p1_1、p1_2、p2_1、p2_2,此时 p1 读到 x = 1,p2 读到 x = 2
  • p1_1、p2_1、p1_2、p2_2,此时 p1、p2 读到的 x = 2
  • p2_1、p1_1、p1_2、p2_2,此时 p1、p2 读到的 x = 1
  • p2_1、p2_2、p1_1、p1_2,此时 p1 读到 x = 1,p2 读到 x = 2

线性一致的情况,所有节点只能看到上述四种视图中的一种,而在因果一致的情况下,由于 p1 和 p2 没有任何因果关系,所有节点可以看到上述四种视图中的任意一种。因此我们也可以发现,如果不做一些同步的话,p1 和 p2 对于 x 的修改,对于对方都是不可见的。因此要想使用因果一致性保证对于冲突数据的修改不会出错,就必须在每次修改的时候都通知其他节点,从而创造因果关系。

即便每次修改都通知来创造因果,也不能绝对的保证不会出现写冲突,就比如上面的示例,p1 和 p2 同时修改,同时给对方发消息,即便都收到了请求,还是会造成 x 的写冲突。因为对方都表示自己是因,所以还需要额外的添加节点的优先级,比如数字越小,权重越高。这时候,p1和p2互发了消息,但是p1权重高,p2自动认为p1是因,因此会在全局形成一种可能的排序:p1_1、p2_1,同时还有 p1_1、p1_2p2_1、 p2_2 两种因果关系,所以节点可以看到视图就只有(需要同时满足上述三种因果关系的视图):

  • p1_1、p1_2、p2_1、p2_2
  • p1_1、p2_1、p1_2、p2_2

因此我们可以看到改造后的因果一致性虽然不需要保证每个节点的视图一致,但是更加受限,因此也是能保证写写无冲突,只有读可能会读不到最新的数据。

因果一致性的实现可以基于逻辑时钟或者向量时钟来实现。

四、以客户端为中心的一致性

单调读、单调写、读后写、读已之所写,这些都是站在客户端的角度来说的,属于后端集群一致性模型应该对外表现出来的视图应该符合的特性。

因此,这些都是后端集群的一致性模型需要实现的特性,比如如何让采用线性一致性模型的集群对外具有单调读、单调写、读后写等特性。

个人理解:就是在实现后端集群一致性模型的基础上,再对请求做一些限制或者对视图再做一些限制就可以实现上述特性。

参考

  • 图解一致性模型

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

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

相关文章

关于使用Object.create(null)来创建空对象,而不直接使用{}的优势

文章目录 前言1. 使用Object.create(null) 和 直接{}的区别2.子类继承父类3. 子类继承父类---进阶 前言 问题:为什么vue源码中使用Object.create(null)来创建空对象,而不直接使用{}??? 1. 使用Object.create(null) 和 直接{}的区别 优势&#xff1a…

Qt:玩转QPainter序列四

前言 接着干源码 正文 先看源码,然后我们逐条分析 QPainter 是一个强大的绘图类,用于在 QWidget、QImage、QPixmap 等设备上进行绘图操作。下面我会详细解释你提到的各个函数和属性,并通过示例展示它们的用法。 1. font() 和 setFont() …

彻底改变音乐产业——人工智能如何实现利润最大化并重塑市场

引言 索尼音乐 收购 以惊人的 1 亿英镑收购了 Queen 的音乐目录。近年来,我们看到投资基金投入数亿美元收购 Justin Bieber、Bruce Springsteen、Katy Perry 等顶级艺术家的音乐版权。据 Cambridge Associates 称,从 2013 年到 2017 年,仅音…

.NET COER+CONSUL微服务项目在CENTOS环境下的部署实践

一、整体的环境安装与部署 1.1、DOCKER环境的部署 1.1.1 安装DOCKER yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast && yu…

python学习9-数据获取与整理5

有点是生成快,如果想炫酷 还是要前端生成,比如 echarts Matplotlib可视化 Matplotlib是Python中最重要的数据可视化库之一,它提供了多种绘图工具,可以生成各种硬拷贝格式和交互式环境下的多种平台上的图形。本文将详细讲解Matplo…

【MySQL】一文带你理清InnoDB引擎的<内部架构>(内存结构,磁盘结构,后台线程)

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

【python报错已解决】`Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python`

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言: 在开发过程中,环境配置常常会引发一些难以预料的报错。如何快速定位并解决这些问题,成…

【C++ Primer Plus习题】5.6

问题: 解答: #include <iostream> using namespace std;#define MONTHSCOUNT 12 #define YEARS 3int main() {string months[MONTHSCOUNT] { "January","February","March","April","May","June","J…

10倍加速LLM计算效率:消失的矩阵乘

矩阵乘法&#xff08;MatMul&#xff09;是深度学习中的主要计算瓶颈&#xff0c;尤其在ChatGPT等Transformer模型中&#xff0c;矩阵乘法的运行时长约占其总运行时长的45-60%&#xff0c;解决这一挑战对发展更经济的大模型具有重要意义。 为此&#xff0c;加州大学的研究人员在…

服务器搭建记录(两台服务器通过一个路由器的LAN口联网)

目录 服务器搭建记录&#xff08;两台服务器通过一个路由器的LAN口联网&#xff09;操作步骤&#xff1a;一、安装N卡驱动二、安装cuda三、安装cudnn四、配置SSH五、为服务器创建新sudo用户账号六、安装docker和NVIDIA-docker七、通过联网路由器 遇到的一些问题&#xff1a;参考…

小白之 FastGPT Windows 本地化部署

目录 引言环境步骤1. 安装 docker2. 启动 docker3. 浏览器访问4. One API 配置语言模型、向量模型渠道和令牌5. 创建 FastGPT 知识库6. 创建 FastGPT 应用 官方文档 引言 部署之前可以先看一下 RAG 技术原理&#xff0c;也可以后面回过头来看&#xff0c;对一些概念有些了解&a…

【C++指南】类和对象(二)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注

【leetcode】学习计划 - 面试经典150题 - 二叉树系列1

面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09; 目录 二叉树 104. 二叉树的最大深度 100. 相同的树 226. 翻转二叉树 101. 对称二叉树 105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树 二叉树结构 // Definition for a bin…

SpringSecurity前后端分离代码

1. 搭建 SpringBoot工程 1) 新建 boot 项目 只要一个 web 依赖 创建好的初始目录&#xff0c;直接将 demos 包删除。 导入依赖 <!-- security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-se…

redis | 认识非关系数据库Redis的字符串数据类型及过期时间expire的作用

Redis 非关 kv型 数据类型字符串数值操作 应用场景 ⭐字符串命令练习⭐⭐过期时间设定 expire ⭐⭐⭐检查过期时间 ttl key删除过期key机制惰性删除定期删除 数据类型 数据类型丰富&#xff0c;字符串strings,散列hashes,列表lists&#xff0c;集合sets,有序集合sorted sets等等…

MySQL Order By 工作原理探究以及索引优化手段

背景 这篇文章出发的契机&#xff0c;主要是看到京东定时任务优化里面有使用到「游标」这种策略去完成查询优化 https://mp.weixin.qq.com/s/aYJV3Z-1MZ_a6tUjoHa_9g 刚好之前自己在开发业务的时候&#xff0c;也碰到类似的场景&#xff0c;需要在每个季度末将被申诉的卡片更…

流媒体协议之RTMP

一、RTMP 协议概述 今天我们要一起了解的这个协议叫 RTMP 协议&#xff0c;它并不复杂&#xff0c;对于拉流相关的协议&#xff0c;我们可以先思考一下拉流一般要交互什么&#xff0c;我理解有以下几项&#xff0c; 连接信息&#xff1a;包括服务器的地址、端口号等&#xff…

每日Attention学习16——Multi-layer Multi-scale Dilated Convolution

模块出处 [CBM 22] [link] [code] Do You Need Sharpened Details? Asking MMDC-Net: Multi-layer Multi-scale Dilated Convolution Network For Retinal Vessel Segmentation 模块名称 Multi-layer Multi-scale Dilated Convolution (MMDC) 模块作用 多尺度特征提取与融合…

一家物流装备企业终止,业绩下滑严重,恐不符合创业板新上市标准

鸿安机械终止的原因如下&#xff1a;首先&#xff0c;报告期内鸿安机械的营业收入和净利润出现下滑趋势&#xff0c;公司最近一年净利润恐不达标&#xff0c;或许不能满足创业板更新的第一套上市标准&#xff1b;其次&#xff0c;鸿安机械经营业绩对比同行业可比公司&#xff0…

笔记整理—uboot启动过程(5)BL2板级初始化

上一章说到了uboot在BL2阶段大概都要干什么&#xff0c;也说到了为了实现这些要先进行内存排布&#xff0c;实现了这些后便可实现BL2部分的板级初始化。首先先来看一下init_fnc_ptr函数指针。 for(init_fnc_ptrinit_sequence;*init_fnc_ptr;init_fnc_ptr){if((*init_fnc_ptr)(…