【分布式】Viewstamped Replication Revisited

篇前感悟:
阅读分布式系统文章的意义其实并不在于你个人真正地去开发这样一个基于这种协议的系统,因为真正去开发一个高可用的分布式系统实在是太难了(对我来说…)更多的还是汲取其中的思想,包括设计思路,优化思路等等。 简单地举个例子,比如说这篇优化中的witness角色引入,也许也可以在其他系统中得到应用。 真正能在工程实践中使用到的并非是完整的一篇论文,而是其中的一个点、两个点。

建议阅读:

  • 更多背景介绍: https://zhuanlan.zhihu.com/p/428147777
  • 更多细节:https://zhuanlan.zhihu.com/p/66427412

一、假设

  • 仅处理crash failure,不考虑拜占庭故障
  • 针对异步网络
  • 2f+1个节点可以容忍f个节点发生非拜占庭故障

二、协议架构

在这里插入图片描述
在这里,Replica也就是节点; VR Code负责处理VR协议,Service Code负责处理和执行命令 。

三、协议组成

1. normal operation

正常执行流程。

  1. client发送消息到primary
  2. primary收到后比较request-number和client-table中的信息,如果req-num < client table中记录的,则丢弃+ 发送response,因为req已经处理过了。否则继续。
  3. primary 的 op-number 增加,request 增加到log末尾,然后发送prepare消息给其他节点(backups,副本)
  4. backups按顺序处理prepare。 一个副本需要具备op-number前所有entry才能处理请求。如果缺失entry,说明状态落后,需要state transfer。
    处理的时候,同primary,本地的op-number增加,request 增加到本地log中,更新client-table, 返回prepareOK给primary
  5. primary收集了多数prepareOK消息时,就可以认为当前的operation可以commit了,这个operation就可以被顺序执行到,commit-number增加,通知client,更新执行结果到client-table
  6. 对于已经commit的消息,需要通知backups,这个通知消息并不是单独发,而是包含在下一次prepare消息中(这样节约了一次发送开销)。如果长期没有client请求,也就是长期无需发送prepare消息的话,那就再单独发送一次commit消息给backups
  7. backups接收到发来的commit消息,再执行operation,更新result到client-table

注: 这里的op-number 类比于是Raft中的log index, commit-number类比于是commit index。 如果一切正常,长时间来看commit-number == op-number

如果step5,primary已经commit,但此时primary宕机了,那如何将commit-number通知到backup呢?那就涉及到part 3-recovery了。而其他节点也会发现primary不在了,那么此时就要做view change

2. view change

在VR协议中的view 可以理解为Raft的term。view change就是切主;view number可以理解为Raft的任期号。

  1. 发生时间:replica发现自己超时未收到primary的消息,那么递增自己的view-number or 收到了view change的更大的view-number(说明存在其他replica已经开始选主),那么view-number更新为收到的新number

  2. 一个replica收到f个startViewChange消息时候,就发送消息doViewChange给新的primary

  3. 新的primary收到f+1条消息,更新自己的view-number,并选择view-number最大的消息log作为new log,如果view-number相同,则选择op-number最大的;设置commit-number为所有消息中的最大值,更新status为normal,发送给其他副本view change结束的消息;其他副本更新相关信息
    (对比Raft, Raft只能是主给从发log,而这里可以从节点给新主节点发log)

  4. new primary开始负责接收client消息

3. recovery

宕机后的节点重新加入集群,需要重新请求所有日志。

区别于state transfer: 节点并没有宕机,但是日志落后,此时需要state transfer。

  1. 发送recovery给所有replica,携带唯一序号
  2. 处于normal状态的replica响应, 只有primary给请求者回复log内容
  3. 收到f+1个响应(包括primary),则更新本地log,更新完后切换状态到normal

四、优化

  1. effective recovery
    就是需要节点每隔一段时间持久化一下当前state,在recovery的时候直接从磁盘中拿出之前该节点的state就行,而不用传输全部的log (和Raft的 snapshot还是有点区别的,snapshot是指传输的时候把log打包,但目的是一样的,就是让恢复的时候无需全量传输log)

  2. view change
    doViewChange消息中携带1-2个最新的log,而不是全部log。log用于更新新primary状态,由于新primary一般比较新,所以带少量即可。

  3. witness
    2f+1节点集群中只有f+1个节点需要active(active状态的节点需要存储状态和执行operation),其他f个为witness(不需要存state和执行op)。 active replica出现故障,witness才参与进来。大多数正常时间,witness节点把资源拿去干别的。

  4. batching
    客户端发来的请求可以收集一下,一起跑。节约通信开销,但是一次处理的时间变长(延迟增加)

  5. fast reads
    仅primary处理读请求,而不需要得到其他节点的response (prepareOK)
    需要额外实现lease机制,保证读请求的primary在有效期内,防止网络分区带来的脑裂问题。

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

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

相关文章

计算机网络:网络字节序

目录 一、字节序1.字节序概念2.字节序的理解&#xff08;1&#xff09;大端模式存储数据&#xff08;2&#xff09;小端模式存储数据 二、网络字节序 一、字节序 1.字节序概念 字节序&#xff1a;内存中存储多字节数据的顺序。 难道存储数据还要看顺序吗&#xff1f; yes。内…

Opencv-C++笔记 (17) : 模板匹配

文章目录 1--概念2-- 方法3 结果3.1 ROI区域的获取使用自适应目标匹配 1–概念 opencv 提供了一个专门用于模板匹配的函数 cv::matchTemplate();其调用方式如下&#xff1a; void cv::matchTemplate(cv::InputArray image, // 用于搜索的输入图像, 8U 或 32F, 大小 W-Hcv::Inpu…

2023年初中信息技术学科暑假备课

目录 2023年初中信息技术学科暑假备课1. 创意空间1.1 教师的空间1.2 学生的空间1.3 关于FTP服务器设置 2. 什么是编程2.1 编程语言2.2 人人都应学好编程2.3. 编程难吗&#xff1f;2.4 python用途 3. 开发环境3.1 打开IDLE3.2 IDLE窗口3.2.1 shell窗口和编辑窗口 4. 项目式教学4…

开发测试框架一 - 创建springboot工程及基础操作

一、创建及运行方式 1. 从官网导入&#xff1a; 注意&#xff1a;由于我的java版本是1.8&#xff1b;所以选中了spring2.7.14&#xff1b;如果你的java版本是9及以上&#xff0c;选中spring3相关的同时Java 版本也要对应起来 2. 创建第一个get请求 创建Controller package及…

Golang下载安装

目录 1. 下载压缩包 2. 解压 3. 查看SDK是否安装成功 4. 配置环境变量 5. 查看环境变量是否配置成功 1. 下载压缩包 官网下载地址&#xff1a; All releases - The Go Programming Language Windows64位选择如下下载&#xff1a; 2. 解压 解压后内容如下&#xff1a; …

uniapp-微信小程序篇

uniapp-微信小程序篇 一、创建项目(以Vue3TS 项目为示例) 可以通过命令行的方式创建也可以通过HBuilderX进行创建&#xff08;通过HBuilderX创建的项目建议选择最简单的模板&#xff09;&#xff0c;个人建议使用命令行方式。 (1) 命令行方式&#xff1a; npx degit dcloudio…

Vue3实现图片懒加载及自定义懒加载指令

Vue3实现图片懒加载及自定义懒加载指令 前言1.使用vue3-lazyload插件2.自定义v-lazy懒加载指令2.1 使用VueUse2.2 使用IntersectionObserver 前言 图片懒加载是一种常见性能优化的方式&#xff0c;它只去加载可视区域图片&#xff0c;而不是在网页加载完毕后就立即加载所有图片…

CentOS 7 下 Keepalived + Nginx 实现双机高可用

CentOS 7 下 Keepalived Nginx 实现双机高可用 文章目录 CentOS 7 下 Keepalived Nginx 实现双机高可用服务器准备服务信息服务架构 服务安装nginxKeepalived 服务配置nginxKeepalived 启动服务nginxkeepalived 服务验证查看 VIP 状态CURL 命令访问浏览器访问 高可用验证停止…

(7)(7.1) 使用航点和事件规划任务

文章目录 前言 7.1.1 设置Home位置 7.1.2 视频&#xff1a;制作并保存多路点任务 7.1.3 视频&#xff1a;加载已保存的多航点任务 7.1.4 使用说明 7.1.5 提示 7.1.6 自动网格 7.1.7 任务指令 7.1.8 任务结束 7.1.9 任务重置 7.1.10 MIS_OPTIONS 7.1.11 任务再出发 …

时序预测 | MATLAB实现基于CNN卷积神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN卷积神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN卷积神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 1.Matlab实现CNN卷积神经网络时间序列预测未…

docker 学习--03 环境安装(本人使用的win10 Linux也是在win10下模拟)

docker 学习–03 环境安装&#xff08;本人使用的win10 Linux也是在win10下模拟&#xff09; docker 学习-- 01 基础知识 docker 学习-- 02 常用命令 文章目录 docker 学习--03 环境安装&#xff08;本人使用的win10 Linux也是在win10下模拟&#xff09;[TOC](文章目录) 1. wi…

深入源码分析kubernetes informer机制(二)Reflector

[阅读指南] 这是该系列第二篇 基于kubernetes 1.27 stage版本 为了方便阅读&#xff0c;后续所有代码均省略了错误处理及与关注逻辑无关的部分。 文章目录 Reflector是什么整体结构工作流程list拉取数据缓存resync操作watch监听操作 总结 Reflector是什么 reflector在informer…

如何实现安全上网

l 场景描述 政府、军工、科研等涉密单位或企业往往要比其他组织更早接触高精尖的技术与产品&#xff0c;相对应的数据保密性要求更高。常规的内外网物理隔离手段&#xff0c;已经满足不了这些涉密单位的保密需求&#xff0c;发展到现在&#xff0c;需求已经演变成既要保证网络…

(十六)大数据实战——安装使用mysql版的hive服务

前言 hive默认使用的是内嵌据库derby&#xff0c;Derby 是一个嵌入式数据库&#xff0c;可以轻松地以库的形式集成到应用程序中。它不需要独立的服务器进程&#xff0c;所有的数据存储在应用程序所在的文件系统中。为了支持hive服务更方便的使用&#xff0c;我们使用mysql数据…

【数据结构】“栈”的模拟实现

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

MySQL 索引 详解(保姆级教程)

一、索引概述 索引是帮助 MySQL 高效获取数据的数据结构&#xff08;有序&#xff09;。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c;这样就可以在这些数据结构上…

本地oracle登录账号锁定处理,the account is locked

1.打开cmd命令窗口 2.打开sqlplus: sqlplus /nolog(加/nolog是不登录服务器的意思&#xff0c;不加就需要输账号密码) 3.切换到管理员&#xff1a;conn / as sysdba; 第2步第3步可以合并&#xff0c;直接使用sysdba登录&#xff1a;sqlplus / as sysdba; 4.解锁账号&#x…

Python web实战之Django 的 WebSocket 支持详解

关键词&#xff1a;Python, Django, WebSocket, Web 如何使用 Django 实现 WebSocket 功能&#xff1f;本文将详细介绍 WebSocket 的概念、Django 的 WebSocket 支持以及如何利用它来创建动态、响应式的 Web 应用。 1. WebSocket 简介 1.1 什么是 WebSocket&#xff1f; 在 W…

阿里云FRP内网穿透挂载多台服务器

1. FRP介绍 FRP (Fast Reverse Proxy) 是比较流行的一款。FRP 是一个免费开源的用于内网穿透的反向代理应用&#xff0c;它支持 TCP、UDP 协议&#xff0c; 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站&#xff0c; 帮你实现 公网 ←→ FRP(服务器…

OpenCV importerror:dll load failed

从预编译的二进制文件安装OpenCV&#xff0c;从github下载opencv-4.8.0-windows.exe 编译好的文件。按照官方文档拖入cv2.pyd文件。 https://docs.opencv.org/4.8.0/d5/de5/tutorial_py_setup_in_windows.html 使用pycharm运行时&#xff0c;出现报错&#xff0c;importerror…