Distributed Database System —— Multi-raft协议介绍

2023-10-27


Raft协议已经详细介绍过,不做赘述,在Crdb中使用了Multi-Raft协议,那么Multi-Raft协议是如何工作的呢?

Multi-Raft协议

下面是Crdb里对于Multi-Raft的介绍,说明了在分布式环境下,为什么要开始使用Multi-Raft协议。

In CockroachDB, we use the Raft consensus algorithm to ensure that your data remains consistent even when machines fail. In most systems that use Raft, such as etcd and Consul, the entire system is one Raft consensus group. In CockroachDB, however, the data is divided into ranges, each with its own consensus group. This means that each node may be participating in hundreds of thousands of consensus groups. This presents some unique challenges, which we have addressed by introducing a layer on top of Raft that we call MultiRaft.

简单来说,在分布式系统中由于数据被按照一定的方式做了切片,每一个切片的数据都有多个自己的副本,这些副本之间的数据使用Raft协议来保证数据的一致性。而在每一个存储的节点上,也会存储着多个切片的数据信息,所以对于节点和切片,存在着一个多对多的关系。而如果单独只使用Raft协议,虽然也是可以的,但是很显然效率是很慢的。

Multi-Raft需要解决的问题

单个Raft-Group在KV的场景下存在一些弊端:

  • 系统的存储容量受制于单机的存储容量(使用分布式存储除外)
  • 系统的性能受制于单机的性能(读写请求都由Leader节点处理)

Multi-Raft需要解决的一些核心问题:

  • 数据何如分片。分片中的数据越来越大,需要分裂产生更多的分片,组成更多Raft-Group。分片的调度,让负载在系统中更平均(分片副本的迁移,补全,Leader切换等等)。
  • 一个节点上,所有的Raft-Group复用链接(否则Raft副本之间两两建链,链接爆炸了)
  • 如何处理stale的请求(例如Proposal和Apply的时候,当前的副本不是Leader、分裂了、被销毁了等等)
  • Snapshot如何管理(限制Snapshot,避免带宽、CPU、IO资源被过度占用)

Multi-Raft实现细节

要使用Multi-Raft,首先就是需要对集群的数据进行切片,让每个 Raft 单独负责一部分数据。通常的数据分片算法就是 Hash 和 Range,一般会使用的 Range 来对数据进行数据分片。为什么使用 Range,主要原因是能更好的将相同前缀的 key 聚合在一起,便于 scan 等操作,另外,当某一块分片数据量较大时,在做分片分裂的时候也是非常方便的,这个 Hash 是没法支持的。

通过分片,一个单节点单RaftServer实例一把会存储下面三个数据,这些数据会存储在底层的存储层中,比如RocksDB等嵌入式数据库中(其中RaftLog和Snapshot的数据落在本地节点盘之上的)。

  • StateMachine,内部状态机。
  • RaftLog,持久化在本年底的transaction log。
  • Snapshot数据

Single-Raft协议(也就是传统的Raft协议)工作示意图如下:
在这里插入图片描述

而Multi-Raft协议结构大致如下:
在这里插入图片描述
Multi-Raft会分离出RaftServerProxy和RaftServer服务,一个节点可以启动多个RaftServer实例,按照raft group id区别开,RaftServer有其独立的StateMachine以及其对应存储RaftLog的位置。这样,在RaftClient进行请求通信时需要带上raft group id,以此让server Proxy知道请求应定向到哪个具体的RaftServer中去。

Cockroach Multi-Raft

出自Cockroach Design

Raft - Consistency of Range Replicas

Raft 选举一个相对长寿的leader来提交指令 ,leader会与follower会保持周期性心跳,并让follower保存log的副本. 如果心跳消失,在经过随机的election timeouts时间,follower成为候选人(candidates) , 并且继续发起新的leader选举过程。Cockroach使用随机时间,这样通信往返时间短的会更易第一个发起选举。只有leader才能提交指令,followers只简单地传递命令到最后一个已知的领导者。

Cockroach的Raft实现在CoreOS的基础上,增加额外的优化层,因为考虑到一个节点可能有几百万的一致性组(每个range一个)。少部分优化主要是合并心跳(与数量巨大的range相反,节点数量决定了心跳的数量)和 请求批处理。将来的优化还包括二阶段选举和静态range。

Range Leadership(Leader Leases)

一个range的副本作为一个Raft组来执行共享commit log 里的指令。通过Raft实现一致性是一个昂贵的操作,且有些任务同一时刻只能在一个副本里进行处理

所以,Cockroach提供了叫Range Leadership的概念,它是一个时间片租约,通过Raft算法提交的一个特殊Log来建立(Log包含了LeaderShip活跃时间间隔、Node:RaftID的组合)。

Node:RaftId的组合用来唯一的表示一个正在被请求的副本。

对于读写请求,需要寻址到持有这个租约的副本上;如果无法寻址到,就会被发送到任意其他副本上,并且被发送到请求的副本需要尝试同步的获取租约。

持有租约的副本将处理一些特殊range的维护任务,如:

  • 通报(gossip)第一个range的信息
  • 拆分(splitting),合并(merging),平衡(balancing) range

在单Raft保证了Leader持有最新的Log,而Cockroach的Multi-Raft也要保证持有租约的副本要确定它的缓存的时间戳(使用HLC)大于上一个持有租约的副本。Range Leader和Raft Leader是完全独立的,Raft 和 Range的Leader将不大可能位于同一个副本。

虽然语义上,Range LEADER和Raft LEADER是不同的两种角色,但是他们最好是位于同一个副本上,因为如果一个写请求打到Range Leader上的时候,如果Range Leader和Raft Leader不是同一个Leader的话,那么请求会被转发给Raft Leader,由Raft Leader完成同步(包括同步给Range Leader所在的副本),这样就多此一举了。

实现这一目标的一个相当简单的方法是: 规定每一次延长或开始新的租约期限时,必须由租约持有者来发起raft选举(除非它是已经leader),还要注意要保证Range leader稳定且长期存活,来避免大量Raft leader转换。
失效的时候(也就是请求寻址失败的时候),由于请求会发送到任意一个其他副本上,所以会由这个副本来尝试获取租约了。

Command Execution Flow

这一章详细介绍leader 副本是如何处理读写命令的。

每一个命令都指明一个要处理的key(或者一个key的范围)和包含该key的range的ID。当RoachNode收到一个命令时会根据rangID获取对应的range,并且检查 这个range是否包含相应的keys。如果不包含,RoachNode返回error,客户端收到error后继续重试直到找到正确的range。

当命令中的所有keys都包含在range中,RoachNode就开始执行命令。如果命令是一个非一致性的只读命令,会立即处理。如果是要求一致性的读写命令,只要满足以下两个条件,命令才被执行:

  • 该range必须是leader。(如果不是Leader,副本尝试获取leader 租约(leader lease),如未获取租约则给客户端返回error)
  • 当前要读写的keys与正在处理的命令的keys不能有重叠(保证对一个key的一致性读写命令被串行执行)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Distributed Database System —— Multi-raft协议介绍 的相关文章

  • 【redis】Redis cluster是AP架构还是CP架构?

    最近刚好在看CAP理论 加上之前分析的redis cluster 就在想redis的cluster是什么模式的 AP还是CP 首先还是简单讲下CAP 具体的可见 CAP分别是 强一致性 Consistency 可用性 Availabilit
  • k8s-多节点部署efk-dial tcp 172.20.2.134:5601: getsockopt: connection refused

    异常信息 Error dial tcp 172 20 0 145 5601 getsockopt connection refused Trying to reach http 172 20 0 145 5601 分析 部署好efk后 通过
  • Dubbo——快速启动(2)

    快速启动 Dubbo 采用全 Spring 配置方式 透明化接入应用 对应用没有任何 API 侵入 只需用 Spring 加载 Dubbo 的配置即可 Dubbo 基于 Spring 的 Schema 扩展 进行加载 mvn
  • Distributed Database System —— Multi-raft协议介绍

    文章目录 Multi Raft协议 Multi Raft需要解决的问题 Multi Raft实现细节 Cockroach Multi Raft Raft Consistency of Range Replicas Range Leaders
  • Dubbo——Dubbo初识(1)

    背景 随着互联网的发展 网站应用的规模不断扩大 常规的垂直应用架构已无法应对 分布式服务架构以及流动计算架构势在必行 亟需一个治理系统确保架构有条不紊的演进 单一应用架构 当网站流量很小时 只需一个应用 将所有功能都部署在一起 以减少部署节
  • windows安装docker desktop

    windows安装docker desktop 前言 一 docker desktop 是什么 二 安装步骤 1 下载 2 安装 总结 前言 这里针对windows 10 家庭中文版 其他版本部分步骤可跳过 一 docker desktop
  • Hadoop是小象——YARN / Split&Block

    了解Hadoop架构 Hadoop可运行于一般的商用服务器上 具有高容错 高可靠性 高扩展性等特点 特别适合写一次 读多次的场景 其架构如下 HDFS 分布式文件存储 可靠性由心跳机制和冗余提供 YARN 分布式资源管理 MapReduce
  • MQ相关问题

    ActiveMQ 功能完善 性能相对差 社区文档很久不更新了 丢失可能低 万级QBS 毫秒延迟 主从高可用 RabbitMQ 基于erlang 扩展性差 社区活跃 中小企业用 万级QBS 微妙延迟 主从高可用 RocketMQ 阿里开源 定
  • 深入ZooKeeper——ZooKeeper原语和架构

    ZooKeeper基础 设计一个用于协作需求的服务的方法往往是 提供原语列表 暴露出每个原语的实例化调用方法 并直接控制这些实例 这种设计存在一些重大的缺陷 首先 我们要么预先提出一份详尽的原语列表 要么提供API的扩展 以便引入新的原语
  • 从分层架构到微服务架构(五)之服务化架构

    从分层架构到微服务架构 是一系列介绍 Fundamentals of Software Architecture 中提到的8种架构模式的文章 这里不会事无巨细地介绍所有的细节 而是会挑选其中关键内容 更多详情请阅读原书 往期精彩 从分层架构
  • Springcloud五大组件

    1 什么是springcloud springcloud是一系列框架的有序集合 它利用springboot的开发便利性巧妙地简化了分布式系统基础设施的开发 如服务发现注册 配置中心 消息总线 负载均衡 断路器 数据监控等 都可以用sprin
  • Apache架构师都遵循的30条设计原则

    Srinath 通过不懈的努力最终总结出了 30 条架构原则 他主张架构师的角色应该由开发团队本身去扮演 而不是专门有个架构师团队或部门 Srinath 认为架构师应该扮演的角色是一个引导者 讨论发起者 花草修建者 而不是定义者和构建者 S
  • 伸缩自如的ElasticSearch——文档CRUD操作

    文章目录 文档 文档元数据 index type id 取文档 更新文档 创建文档 删除文档 处理冲突 文档 在大多数应用中 多数实体或对象可以被序列化为包含键值对的 JSON 对象 一个 键 可以是一个字段或字段的名称 一个 值 可以是一
  • Zookeeper——zookeeper基础

    在深入了解ZooKeeper的运作之前 让我们来看看ZooKeeper的基本概念 我们将在本章中讨论以下主题 Architecture 架构 Hierarchical namespace 层次命名空间 Session 会话 Watches
  • Elasticsearch使用教程

    下载ES elasticsearch的下载地址 https www elastic co cn downloads elasticsearch ik分词器的下载地址 https github com medcl elasticsearch
  • 应用使用Druid连接池经常性断链问题分析

    前段时间有应用使用Druid连接池经常的提示断链报错 整个问题排查分析过程很有意思 这里将Druid连接池 数据库层以及负载均衡层的配置分析下 记录整个问题的分析过程 同时梳理下Druid连接池的配置和连接保活及回收机制 1 问题背景 应用
  • docker 安装 mysql (windows版本)

    docker 安装 mysql windows版本 1 下载 MySQL 社区版映像 运行以下命令 docker pull mysql mysql server 5 7 2 启动Docker容器 请使用以下命令 docker run nam
  • Distributed System Transaction —— 2PL

    文章目录 2PL 并发控制常见的方式有2PL MVCC等方式 2PL 两阶段锁 two phase locking 是用来解决多线程之间的竞态条件的 其算法非常简单 数据库中的每一个数据对象都有两种锁 S hared lock 和 e X
  • 什么是分布式架构

    一 分布式架构定义 什么是分布式架构 分布式系统 distributed system 是建立在网络之上的软件系统 内聚性 是指每一个数据库分布节点高度自治 有本地的数据库管理系统 透明性 是指每一个数据库分布节点对用户的应用来说都是透明的
  • Dubbo远程传输协议详解

    前言 上次小编为大家带来了Dubbo调用及容错机制详解 不知道大家有没有去看小编最后留下的问题 欢迎对文章进行评论也希望大家和小编多多交流 今天接着为大家带来Dubbo的内容 传输协议 上次调用机制中并没有涉及Dubbo传输的协议 这次容小

随机推荐

  • 解决引入新的项目右边栏没有maven的问题

    解决IntejIdea引入新的项目时右侧边栏不显示maven项目的问题 导入新的idea项目的时候需要导入maven依赖 但是很多时候导入项目发现找不到maven 如图 应该怎么办呢 在help下找到find action 然后输入mave
  • <通信接口篇> I2C介绍

    目录 01 I2C总线介绍 总线物理连接 通信模式 I2C协议整体时序 02 I2C读写时序介绍 I2C写时序 主机 I2C读时序 主机 03 文章总结 大家好 这里是程序员杰克 一名平平无奇的嵌入式软件工程师 作为嵌入式开发人员 无论是硬
  • Java计算下一次提醒时间的简单算法

    Java计算下一次提醒时间的简单算法 需求分析 算法分析 代码清单 核心算法 计数器对象 工具类 代码下载地址 需求分析 在生产实践过程中 我们接到了一个这样的需求 客户接到系统做工作单后 按照要求客服人员要定时进行回访 回访提醒必须在工作
  • 2.2.2新版Banner轮播图实现

    随着Android弃用了jcenter库以后 Banner的使用也大大的和以前不同 下面就来介绍一下2 2 2版本banner的使用和Demo 文章目录 一 改进内容 二 Demo效果图 二 步骤 1 引入库 依赖banner 2 xml文
  • OSS对象存储

    文章目录 OSS 1 存储分类 2 对象存储OSS 2 1 概念组成 2 2 存储优势 2 3 与自建服务器的优势 2 4 Bucket存储空间 2 5 存储类型 2 6 对象 2 6 1 命名规范 2 6 2 存储空间与对象关系 2 7
  • Android编译系统-envsetup和lunch代码篇

    Android系统启动篇 1 android系统启动流程简介 2 android init进程启动流程 3 android zygote进程启动流程 4 Android SystemServer进程启动流程 5 android launch
  • mysql组成部分

    一 mysql组成部分 组成部分 1 连接池组件 2 管理服务和工具组件 3 SQL接口组件 4 查询分析器组件 5 优化器组件 6 缓存 cache 组件 7 插件式存储引擎 8 物理文件 1 mysql存储引擎 1 1 InnoDB存储
  • KMP算法原理详解_论文解读版

    1 KMP算法 KMP算法是一种保证线性时间的字符串查找算法 由Knuth Morris和Pratt三位大神发明 而算法取自这三人名字的首字母 因而得名KMP算法 那发明这样的字符串查找算法又有什么用 在当时计算机本身非常昂贵 计算资源更是
  • 531-C++迭代器失效问题及解决方法

    初步在自定义vector类中实现迭代器 迭代器示意图 为什么方式都是一样 因为迭代器遍历完当前元素跳到下一个元素 底层数据结构的具体的遍历方式都封装在这个迭代器的 运算符函数了 所以 作为使用方 我们不需要知道底层的数据结构原理 我们只知道
  • 寄存器堆计算机组成实验,杭电计算机组成原理寄存器堆设计实验4

    杭电计算机组成原理寄存器堆设计实验4 5页 本资源提供全文预览 点击全文预览即可全文预览 如果喜欢文档就下载吧 查找使用更方便哦 9 9 积分 杭州电子科技大学计算机学院实验报告课程名称 计算机组成原理 实验项目 寄存器堆设计实验姓班级 指
  • C语言实现斐波那契数列

    先来说说啥是斐波那契数列 它是一个前两位都为1 从第三位开始 后一位为前两位之和的递增数列 也就是 1 1 2 3 5 8 13 21 34 55 89 我们可以发现 如果你要找第n位的数 其实它就等于第 n 1 位和第 n 2 位之和 那
  • IOS 关于 NSUserDefault

    转载 并不是所有的东西都能往里放的 NSUserDefaults只支持 NSString NSNumber NSDate NSArray NSDictionary NSUserDefaults的方法中用来记录一下永久保留的数据非常方便 不需
  • 大数据手册(Spark)--Spark机器学习(PySpark版)

    文章目录 MLlib ML 常见的特征转换 模型拟合和描述 超参调优 Spark安装配置 Spark基本概念 Spark基础知识 PySpark版 Spark机器学习 PySpark版 Spark流数据处理 PySpark版 MLlib A
  • java创建任意长度空格字符串_输入任意长的一个字符串,统计其字母、数字、空格及其他字符的数量。...

    标签 思路 简单的利用一个多重 if 结构就可以解决 CODE import java util Scanner public class Character public static void main String args Syst
  • 经纬度正则表达式

    经度 180 0 180 0 整数部分为0 180 输入1到8位小数 0 d 1 8 1 9 d d 1 8 1 0 7 d 1 d 1 8 180 0 1 8 纬度 90 0 90 0 整数部分为0 90 输入1到8位小数 0 1 8 d
  • ant上传组件upload,前端读取文件、创建文件

    业务需求是用户上传文件后 还能修改文件内容 最后保存修改后的文件 实现方式 1 前端读取文件内容后显示在代码编辑器中 方便用户修改 2 点保存按钮时 拿到改变的文件内容后 创建新的文件流 提交给后端 这里演示的是JSON文件数据 选择文件
  • 图显系统DRM CRTC完全解析

    目录 CRTC 工作原理和意义 CRTC 模块的初始化和功能 0 引言 DRM 下的 CRTC 代表 RGB 数据管道 从 drm plane 接收像素数据并将其混合到一起 传输给下级显示设备 drm encoder 由 drm displ
  • 原址删除有序数组重复整数

    给定一个有序数组 原址删除重复超过两次的整数 本笔记适合熟悉Python列表list的 coder 翻阅 学习的细节是欢悦的历程 Python 官网 https www python org Free 大咖免费 圣经 教程 python 完
  • Spring中bean创建的生命周期

    1 推断构造方法 2 实例化 3 依赖注入 4 处理Award回调beanFatoryAware 5 初始化前 处理 postConstruct注解 6 初始化 处理iniyializingBean接口 7 初始化前 进行aop
  • Distributed Database System —— Multi-raft协议介绍

    文章目录 Multi Raft协议 Multi Raft需要解决的问题 Multi Raft实现细节 Cockroach Multi Raft Raft Consistency of Range Replicas Range Leaders