【读点论文】Chain Replication for Supporting High Throughput and Availability

news2025/3/23 17:21:37

在分布式系统中,强一致性往往和高可用、高吞吐是矛盾的。比如传统的关系型数据库,其保证了强一致性,但往往牺牲了可用性和吞吐量。而像 NoSQL 数据库,虽然其吞吐量、和扩展性很高,但往往只支持最终一致性,无法保证强一致性。由此 Chain Replication for Supporting High Throughput and Availability 提出了链式复制协议,旨在保证高吞吐、高可用的同时,支持数据的强一致性。

链式复制协议

所谓链式复制,顾名思义就是将各个数据节点串联成一条链,如同一个链表,第一个节点是 header 头,最后一个节点是 tail 尾节点,如图所示:

chain-replication-01

该协议对服务器环境有两个要求:

  • 当服务器故障时会停机
  • 如果某台服务器停机,环境能够将该服务器从链中移除

这样对于多台服务器组成的一条链,当客户端发来请求时:

  • 写请求:全部发送到 header 节点。
  • 读请求:全部发送到 tail 节点。
  • 响应:全部由 tail 节点响应。

基于上述流程,一个写请求到来时,先在 header 进行运算并写入,然后不断向后传播,一直到尾结点写入成功后,整个写请求才算成功。
读请求全部发送到 tail 节点,只有在尾节点写成功的数据才会被读取到,因此保证了强一致性。

容错处理

链式复制需要有一个管理面(Control Plane)来管理其节点信息,论文中称其为 master 服务,其主要功能如下:

  • 检查链中各节点是否正常
  • 当链中的节点信息发生变化时,及时更新各个节点的前后节点信息
  • 通知客户端链的 header 和 tail 节点信息

通常可以使用 Zookeeper 或者 etcd 这种具有强一致性存储的组件来实现。其节点扩缩容的处理如下:

Header 节点故障

当 header 节点故障时,master 服务会选择原 header 的后一个节点作为新的 header 节点。此时如果有数据写入被 header 接收但尚未被 header 的后续节点收到,对于客户端来说相当于请求丢失,可以通过重试机制来解决。

Tail 节点故障

当 tail 节点故障时,master 服务会选择原 tail 的前一个节点作为新的 tail 节点。因为所有已经写入 tail 节点的数据肯定已经写入到其前一个节点中,因此不会造成任何数据丢失。

其他节点故障

当链中间的某个节点 S 故障时,master 服务需要通知 S 节点的前一个节点 S- 和后一个节点 S+,将 S 从链中移除,并更新 S- 和 S+ 的前后节点信息。这样可能会导致数据丢失,比如某些写请求已经被传到了 S 节点,但尚未被传到 S+ 节点,因此需要一个同步机制如下:

  • S 节点故障停机,master 检测到故障后获取 S- 和 S+ 的信息
  • master 向 S+ 节点发送消息 1 请求 S+ 节点的请求序列号
  • S+ 收到消息 1 后,向 master 返回消息 2 告知其请求序列号
  • master 发送消息 3 给 S- 节点,告知其节点变更信息以及 S+ 的请求序列号
  • S- 收到消息后,根据S+的请求序列号同步其所缺失的请求,保证数据一致

扩容节点

为了实现的简易性,链式复制设定扩容时只能将新节点作为 tail 节点加入到链中,因为是一个新 tail 节点,其所需要做的唯一工作就是将前一个节点的数据同步到新节点中与此同时,原来的 tail 节点还可以继续工作,直到新节点与原来的 tail 节点数据同步完成,然后 master 服务可以切换 tail 节点:

  • T 节点被告知其不再是 Tail 节点,然后 T 可以将收到的读请求丢掉或者转发给新的 Tail 节点
  • 所有发送到 T 的写请求全部向后继续发给 Tail 节点
  • T+节点被告知成为新的 Tail 节点
  • master 服务通知所有客户端新的 Tail 节点信息

与主从复制的比较

链式复制算是主从复制(Primary/Backup)协议的一种变体,主要区别在于链式复制是类似链表的形式,写请求时串行,而主从复制是类似星形拓扑,写请求时并行。

论文比较了两者在读写和容错的优劣,在读写方面:

  • 对于 primary 负责读写的场景,primary 必须等待先前的写入成功后才能执行读取,性能要低于链式复制直接从 tail 节点读取的处理。
  • 对于写处理,链式复制是串行处理,延迟是每个节点写入的延迟总和;而主从复制是并行处理,延长取决于某个最慢节点的延迟情况,通常情况下要优于链式复制。

在容错方面,链式复制有三种异常情况:

  • header 节点故障:对读数据没有影响,对于写请求需要等待 2 个消息延迟:master 广播新节点并通知客户端。
  • 其他节点故障:对读数据没有影响,但对于写请求,需要执行上图提到的同步操作后才能正常执行后续写入,因此数据写入不会丢失,但会延迟大约 4 个消息通信的时间。
  • tail 节点故障:对读写数据都会造成影响,需要 master 广播新节点并通知客户端新的 tail 节点,至少需要 2 个消息延迟。

对于 Primary/Backup 协议则有两种情况:

  • primary 故障:对读写数据都有影响。需要经历一个新的选主并同步数据的过程,大约会有 5 个消息延迟。

      1. master 通知所有从节点 primary 节点故障,停止处理请求。
      1. 从节点返回其当前的数据状态
      1. master 确定新的 primary 并通知 backup 节点
      1. 新的 primary 向所有 backup 节点同步数据
      1. master 通知所有客户端新的 primary 节点
  • backup 节点故障:没有写请求在处理,则读数据不会受到影响;如果有数据写入在处理,master 需要通知 primary 某个 backup 节点已经故障,因此可能会有 1 个消息延迟。

总体来看,链式复制在容错方面表现更好,其最坏情况下的延迟(尾结点故障)优于 Primary/Backup 的主节点故障,而最好情况下的延迟(中间节点故障)则与 Primary/Backup 的 backup 节点故障相当。

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

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

相关文章

Servlet、Servlet的5个接口方法、生命周期、以及模拟实现 HttpServlet 来写接口的基本原理

DAY15.1 Java核心基础 Servlet Servlet是一个接口,是java的基础,java之所以编写web的程序,接收请求并响应,就是因为Sevlet接口 Java 类实现了Servlet接口的时候就可以接收并响应请求,成为web服务器 Web服务器就是接…

贝叶斯公式的一个直观解释

E E E:抓到娃娃 H H H:坐地铁 H ˉ \bar H Hˉ:坐公交 P ( E ) P ( H ) P ( E ∣ H ) P ( H ‾ ) P ( E ∣ H ‾ ) P({E}) P({H}) P({E} \mid {H}) {P}(\overline{{H}}) {P}({E} \mid \overline{{H}}) P(E)P(H)P(E∣H)P(H)P(E∣H) P (…

Java 大视界 -- Java 大数据分布式计算中的通信优化与网络拓扑设计(145)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

reconstruct_3d_object_model_for_matching例子

文章目录 1.获取om3文件2.准备可视化3.准备3D可视化4.读取3D模型5.显示成对注册结果16.显示成对注册结果27.联合注册模型8.处理图像8.1子采样8.2 图像计算与平滑8.3 三角测量 9.基于表面做3D匹配10.评估模型准确度10.1 在场景中找到模型10.2 计算模型和场景之间的距离 11.立体系…

【JavaWeb学习Day27】

Tlias前端 员工管理 条件分页查询&#xff1a; 页面布局 搜索栏&#xff1a; <!-- 搜索栏 --><div class"container"><el-form :inline"true" :model"searchEmp" class"demo-form-inline"><el-form-item label…

Webrtc编译官方示例实现视频通话

Webrtc编译官方示例实现视频通话 前言 webrtc官网demo中给了一个供我们学习和应用webrtc的一个很好的例子&#xff1a;peerconnection&#xff0c;这期我们就来编译和运行下这个程序看看视频通话的效果以。 1、打开源码工程 继上期源码编译完成后&#xff0c;我们使用vs打开…

大数据学习(80)-数仓分层

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

刘强东突然发声:不该用算法压榨最底层兄弟!东哥,真正的人民企业家

今天忙了一天&#xff0c;很累&#xff0c;准备睡觉的时候&#xff0c;看到网上盛传的刘强东的朋友圈&#xff0c;东哥又在朋友圈发文了。 说实话&#xff0c;看完之后&#xff0c;感动&#xff0c;真的感动。 尤其是当我看到这两句话的时候。 1、我们所学的知识、商业模式、技…

Java 记忆链表,LinkedList 的升级版

文章目录 记忆链表 MemoryLinkedList实战源代码 众所周知&#xff0c;ArrayList 和 LinkedList 是 Java 集合中两个基本的数据结构&#xff0c;对应数据结构理论中的数组和链表。但在这两个数据结构&#xff0c;开发者们通常使用 ArrayList&#xff0c;而不使用 LinkedList。JD…

poetry安装与使用

文章目录 安装方法创建虚拟环境其他常用命令从 poetry.lock 中安装第三方依赖包 安装方法 安装命令&#xff08;全局安装&#xff0c;不要在虚拟环境中安装&#xff0c;方便后面创建环境使用&#xff09; pip install poetry修改虚拟环境路径&#xff08;首次使用poetry时执行&…

UVM config机制及uvm_resource_pool

目录 1. uvm_config_db 类源码 1.1 set 1.2 get 2. uvm_resource_pool 2.1 uvm_resource_pool::set 2.2 uvm_resource 3. usage 4. 小结 uvm提供一种uvm_config_db机制使得在仿真中通过变量设置来修改环境,使环境更加灵活。本文主要介绍uvm_config_db#(type)::get/set…

JAVA学习*接口

接口 在生活中我们常听说USB接口&#xff0c;那接口是什么呢&#xff1f; 在Java中&#xff0c;接口相当于多个类的一种公共规范&#xff0c;是一种引用数据类型。 定义接口 public interface IUSB {public static final String SIZE "small";public abstract vo…

Python实验:读写文本文件并添加行号

[实验目的] 熟练掌握内置函数open()的用法&#xff1b;熟练运用内置函数len()、max()、和enumerate()&#xff1b;熟练运用字符串的strip()、ljust()和其它方法&#xff1b;熟练运用列表推导式。 [实验和内容] 1.编写一个程序demo.py&#xff0c;要求运行该程序后&#xff0…

IDEA导入jar包后提示无法解析jar包中的类,比如无法解析符号 ‘log4j‘

IDEA导入jar包后提示无法解析jar包中的类 问题描述解决方法 问题描述 IDEA导入jar包的Maven坐标后&#xff0c;使用jar中的类比如log4j&#xff0c;仍然提示比如无法解析符号 log4j。 解决方法 在添加了依赖和配置文件后&#xff0c;确保刷新你的IDE项目和任何缓存&#xff…

数据结构——顺序栈seq_stack

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介绍了数据结构——顺序栈 目录 一、概念 1.1 顺序栈的基本概念 1.2 顺序栈的存储结构 二、基本操作 2.1 结构体定义 2.2 初始化 2.3 判空 2.4 判满 2.5 扩容 2.6 插入 入栈 2.7 删除 出栈 2.8 获取栈顶元…

python3.13.2安装详细步骤(附安装包)

文章目录 前言一、python3.13.2下载二、python3.13.2安装详细步骤1.查看安装文件2.启动安装程序3.安装模式选择4.自定义安装配置5.高级选项设置6.执行安装7.开始安装8.安装完成8.打开软件9.安装验证 前言 在数字化时代&#xff0c;Python 已成为不可或缺的编程语言。无论是开发…

AI-Talk开发板之更换串口引脚

一、默认引脚 CSK6011A使用UART0作为Debug uart&#xff0c;AI-Talk开发板默认使用的GPIOA2和GPIOA3作为Debug uart的RX和TX&#xff0c;通过连接器CN6引出。 二 、更换到其它引脚 查看60xx_iomux_v1.0可以&#xff0c;UART0的tx和rx可以映射到很多管脚上。 结合AI-Talk开发板…

深度解读DeepSeek:源码解读 DeepSeek-V3

深度解读DeepSeek&#xff1a;开源周&#xff08;Open Source Week&#xff09;技术解读 深度解读DeepSeek&#xff1a;源码解读 DeepSeek-V3 深度解读DeepSeek&#xff1a;技术原理 深度解读DeepSeek&#xff1a;发展历程 文章目录 整体流程模型初始化模型前向传播MoE https:/…

JavaIO流的使用和修饰器模式(直击心灵版)

系列文章目录 JavaIO流的使用和修饰器模式 文章目录 系列文章目录前言一、字节流&#xff1a; 1.FileInputStream(读取文件)2.FileOutputStream(写入文件) 二、字符流&#xff1a; 1..基础字符流:2.处理流&#xff1a;3.对象处理流&#xff1a;4.转换流&#xff1a; 三、修饰器…

爬虫入门re+bs4

目录 前言 1. 导入必要的库 2. 定义获取网页HTML内容的函数 get_html 3. 定义获取数据的函数 get_data 4. 定义获取文章正文内容的函数 content_text 5. 定义获取单条课程数据的函数 get_one_course_data 6. 定义保存数据的函数 save_data 7. 定义文件名合法化处理函数 sanitiz…