Raft 思想在架构中实践

news2024/10/6 20:39:44

Raft 诞生背景:

分布式存储系统通常通过维护多个副本来进行容错,提高系统的可用性。要实现此目标,就必须要解决分布式存储系统的最核心问题:维护多个副本的一致性。

首先需要解释一下什么是一致性(consensus),它是构建具有容错性(fault-tolerant)的分布式系统的基础。 在一个具有一致性的性质的集群里面,同一时刻所有的结点对存储在其中的某个值都有相同的结果,即对其共享的存储保持一致。集群具有自动恢复的性质,当少数结点失效的时候不影响集群的正常工作,当大多数集群中的结点失效的时候,集群则会停止服务(不会返回一个错误的结果)

高可用:

多副本架构是云原生的基础,也是高可用、分布式架构场景中常见的一种架构解决方案。对于应用服务、数据库、中间件服务来说高可用是一种共识追求的目标,很多公司也会有很多高可用衡量指标:

衡量指标:

  1. PRO。Recovery Point Objective (RPO),是灾难(或中断)可能导致的数据(事务)丢失的最长目标时间,与数据恢复点设置有关,主要指的是业务系统所能容忍的数据丢失量,由业 务连续性规划定义。RPO不宜过长,以免数据丢失过多。

  2. RTORecovery Time Objective (RTO) ,是灾难(或中断)后必须恢复业务流程的目标持续时间和服务级别, 主要指的是所能容忍的业务停止服务的最长时间,也就是从灾难发生到业务系统恢复服务功能所需要的最短时间周期。RTO不宜过长,以避免与业务连续性中断相关的不可接受的后果

  3. SLAService Level Agreements (SLA)指的是与用户协商好的可容忍数据修复时长,一般以“几个9”来衡量:

  4. 99%或2个9:相当于每年3天15小时36分钟的停机时间。

  5. 99.9%或3个9:相当于每年8小时45分36秒的停机时间。

  6. 99.99%或4个9:相当于每年52分34秒的停机时间。

  7. 99.999%或5个9:相当于每年约5分钟的停机时间。

热门组件使用 Raft案例:

TIDB

简介:

TiDB 是 NewSql 一款很火的数据库,解决了 Mysql 对于海量数据的处理缺陷以及横向扩展能力(分布式),在此基础上还同时拥有 ACID 的事务特性,如果之前使用过Mysql 那么学习使用 TiDB 基本没有什么学习成本

我们重点来说说 TiDB中的 TiKV,TiDB 也是采用了存算分离架构,TiKV 就是存储层。

TiKV架构

Placement Driver : Placement Driver (PD) 负责整个集群的管理调度。

Node : Node 可以认为是一个实际的物理机器,每个 Node 负责一个或者多个 Store。

Store : Store 使用 RocksDB 进行实际的数据存储,通常一个 Store 对应一块硬盘。

Region : Region 是数据移动的最小单元,对应的是 Store 里面一块实际的数据区间。每个 Region会有多个副本(replica),每个副本位于不同的 Store ,而这些副本组成了一个 Raft group。

Leader 节点的视角 Raft 副本同步
一阶段

在第一个阶段里,一份 Data 数据会被 RAFT 状态机转换为两份数据,一份数据转换为 Entries,然后落盘存储到 Disk,另一份数据转换为 Message,发送给其他 Follower 节点。

  1. 应用接受到请求 Data 信息

  2. 应用通过调用 RAFT 的 propose 接口将 Data 数据传递到 RAFT 状态机中去

  3. 应用调用 Ready 函数等待 从 RAFT 中获取 Ready 结构体,从 Ready 结构体中拿出 Entries 和 Message,分别进行落盘和转化为 MsgAppend 信息传递给 Follower。

  4. 应用还需要调用 advance 接口,来更新 RAFT 的内部状态,例如 Log index 信息,代表 Log Entries 已落盘。

二阶段

  1. Follower 收到 Message 进行处理后 (例如落盘) 会将 Entries 的确认信息 MsgAppend Response 发送回给 Leader,值得注意的是这个 Message 中含有 Follower 已接收的最新的 Log Entries Index。

  2. 当 Leader 收到 Follower 节点的 Message 确认信息后,将会调用 step 函数将 Message 传递到 RAFT,RAFT 就会更新 Follower 的状态信息,尤其重要的是各个 Follower 的 Log Index 信息。

  3. 应用调用 Ready 接口后,就会将大多数 Follower 确认的 Log Entries 放到 Ready 结构体,应用就会收到已确认的 Committed Entries,可以对其进行 Apply。

  4. 之后依然还要调用 advance 接口,更新 RAFT 模块的状态,例如更新 Apply Index 信息,代表已提交。

  5. 最后,Leader 在给 Follower 发送 HeartBeat Msg 的时候,会带着 Leader 的 Committed Index,以此来告知 Follower 对应的 Log Entries 已经被提交,Follower 可以进行对应的 Apply 流程了。

RocketMQ

简介:

在 RocketMQ 4.5 版本之前,RocketMQ 只有 Master/Slave 一种部署方式,一组 Broker 中有一个 Master,有零到多个 Slave,Slave 通过同步复制或异步复制方式去同步 Master 的数据。Master/Slave 部署模式,提供了一定的高可用性。

但这样的部署模式有一定缺陷。比如故障转移方面,如果主节点挂了还需要人为手动的进行重启或者切换,无法自动将一个从节点转换为主节点。因此,我们希望能有一个新的多副本架构,去解决这个问题。

新的多副本架构首先需要解决自动故障转移的问题,本质上来说是自动选主的问题。这个问题的解决方案基本可以分为两种:

  1. 利用第三方协调服务集群完成选主,比如 zookeeper 或者 etcd。这种方案会引入了重量级外部组件,加重部署,运维和故障诊断成本,比如在维护 RocketMQ 集群还需要维护 zookeeper 集群,并且 zookeeper 集群故障会影响到 RocketMQ 集群。

  2. 利用 raft 协议来完成一个自动选主,raft 协议相比前者的优点,是它不需要引入外部组件,自动选主逻辑集成到各个节点的进程中,节点之间通过通信就可以完成选主。

多副本同步架构:

 

raft 协议是复制状态机的实现,这种模型应用到消息系统中就会存在问题。对于消息系统来说,它本身是一个中间代理,commitlog 的状态是系统最终的状态,并不需要状态机再去完成一次状态的构建。因此 DLedger 去掉了 raft 协议中状态机的部分,但基于 raft 协议保证 commitlog 是一致的,并且是高可用的。

副本复制流程:

在 DLedger 中,leader 向所有 follower 发送日志也是完全相互独立和并发的,leader 为每个 follower 分配一个线程去复制日志,并记录相应的复制的位点,然后再由一个单独的异步线程根据位点情况检测日志是否被复制到了多数节点上,返回给客户端响应。

短暂分区避免多主&频繁选主逻辑:

如果出现上图的网络分区,n2 与集群中的其他节点发生了网络隔离,按照 raft 论文实现,n2 会一直请求投票,但得不到多数的投票,term 一直增大。一旦网络恢复后,n2 就会去打断正在正常复制的 n1 和 n3,进行重新选举。

为了解决这种情况,DLedger 的实现改进了 raft 协议,请求投票的过程分成了多个阶段,其中有两个重要阶段:WAIT_TO_REVOTE 和 WAIT_TO_VOTE_NEXT。

WAIT_TO_REVOTE 是初始状态,这个状态请求投票时不会增加 term。

WAIT_TO_VOTE_NEXT 则会在下一轮请求投票开始前增加 term。

对于图中 n2 情况,当有效的投票数量没有达到多数量时。可以将节点状态设置 WAIT_TO_REVOTE,term 不会增加。通过这个方法,提高了 Dledger 对网络分区的容忍性。

 

 

 

 

 

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

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

相关文章

ABAP 为N的一个数,在原来基础上浮动在-30~30

需求:为N的一个数,在原来基础上浮动在-30~30 *&---------------------------------------------------------------------* *& Report ZZZZ111 *&---------------------------------------------------------------------* *& 需求&…

揉捻Map-疯狂Java

理论概述 定义 图(Graph)是由节点(Vertex)和连接节点的边(Edge)组成的一种非线性数 据结构。它用于描述事物之间的关系、连接或依赖。图是一种非线性的数据结构, 它广泛应用于计算机科学、数学…

Day_71-76 BP 神经网络

目录 一. 基础概念理解 1. 一点个人理解 2. 神经网络 二. bp神经网络的局部概念 1. 神经元 2. 激活函数 三. bp神经网络的过程 1. 算法流程图 2. 神经网络基础架构 2.1 正向传播过程 2.2 反向传播过程(算法核心) 四. 基本bp神经网络的代码实现 1. 抽象…

一文了解 MySQL 全新版本模型

MySQL 8.1 已经发布了,也宣布 MySQL 开始使用新的版本模型。 作者:Kenny Gryp / Airton Lastori MySQL 产品团队。 原文:https://blogs.oracle.com/mysql/post/introducing-mysql-innovation-and-longterm-support-lts-versions 引子 在 Ora…

边缘提取总结

边缘提取:什么是边缘? 图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以 看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相 差较大的灰度值。 边缘有正负之分,就像…

React AntDesign表批量操作时的selectedRowKeys回显选中

不知道大家是不是在AntDesign的某一个列表想要做一个批量导出或者操作的时候,发现只要选择下一页,即使选中的ids 都有记录下面,但是就是不回显 后来问了chatGPT,对方的回答是: 在Ant Design的DataTable组件中&#xf…

java必学必会之static关键字

java必学必会之static关键字 一、static关键字 原来一个类里面的成员变量,每new一个对象,这个对象就有一份自己的成员变量,因为这些成员变量都不是静态成员变量。对于static成员变量来说,这个成员变量只有一份,而且这…

Tiny Player (js) - 轻量好用、免费开源的 web 视频播放开发组件,内置硬解、软解视频功能

一款简单好用的 JS 视频播放器,完美解决我遇到的移动端播放视频的需求,安利给各位。 关于 Tiny Player Tiny Player 是一个极简的视频播放器 JS 库,内置硬解、软解视频功能,支持原生控件样式以及自定义控件样式,小巧…

一种代码逻辑表达“新范式”:保留编程逻辑,去掉编程语法

逻辑是一个非常古老的话题,很难看到有什么新的东西,特别是新的表达方式。最近被惊艳到了,在分析iVX产品的时候,发现了一种全新的可视化的“逻辑表达范式(或者说新方法)”。看下面有GIF动图演示。 理论上包括…

macbook 软件iMovie for Mac(专业视频剪辑工具)中文版

iMovie mac中文版是一款针对Mac平台量身定做的视频编辑工具,软件凭借流线型设计和直观的编辑功能,可以让您感受前所未有的方式制作好莱坞风格的预告片和精美电影,并且还可以浏览视频资料库,快速共享挚爱瞬间,创建精美的…

手机缺流量?切记,不要买这种卡!

近日,小编在后台看到很多朋友的私信,都在控诉买的流量卡有套路,通过大家的描述,小编发现,很多朋友都是“病急乱投医,犯了一个最大的错误”,只看价格,不看正规性。 ​ 现在网上可能上…

DDL\DML

查询字段 1、查询指定字段 select 字段1, 字段2 ,...] from 表名; select ename, sal from emp; select ename from emp; 2、查询全部字段 select * from 表名; select * from emp; 条件查询 使用 where 语句,放在 from 后 select * from emp where 条件…

UI 自动化稳定性用例实战经验分享!

目录 前言: 大家常说 UI 自动化不稳定,那又如何提高稳定性呢? 操作界面非预期的弹框、广告、浮层 测试系统的 A/B 策略 总结: 前言: 稳定性测试是软件测试的一个重要方面,它旨在评估软件在不同负载和…

[BSidesCF 2020]Had a bad day1

进入环境,一上来就是一段激励的话,没有啥特别的,源码中也没有看见啥有用的提示 但主要是有,参数的传递,加上前面的index.php,想到了PHP伪协议,或许我们可以直接查看一下隐藏源码 报错了&#xf…

nfs服务器的描述,搭建和使用

前言 这是我在这个网站整理的笔记,关注我,接下来还会持续更新。 作者:RodmaChen nfs服务器的描述,搭建和使用 NFS概述工作原理优缺点 nfs服务器搭建服务端客户端 NFS概述 NFS(Network File System)是一种基…

GPT-3.5:ChatGPT的奇妙之处和革命性进步

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

【Koa】[NoSQL] Koa中相关介绍和使用Redis MongoDB增删改查

目录 NoSQL非关系型数据库关系型数据库(RMDB)介绍非关系型数据库(NoSQL)介绍Redis & MongoDB 在 Koa 中使用 Redis (了解)Redis 的安装和使用在 Koa 中连接 和 调用 Redis 在 Koa 中使用 MongoDBMongoDB 的安装MongoShell 操作…

day35KMP算法

1.什么是KMP算法 解决字符串匹配问题;看文本串是否出现过模式串; 文本串:aabaabaaf; 模式串:aabaaf; 暴力解法:两层for循环,时间复杂度:O(m*n) m n分别是长度; kmp解决&a…

HTML中的焦点管理

前言 焦点作为页面交互中的重要一环,涉及到的知识点也比较多,有必要做一个统一的总结。 HTML 中的可获取焦点的元素 具有 href 属性的 HTMLAnchorElement/HTMLAreaElement非禁用态的 HTMLInputElement/HTMLSelectElement/HTMLTextAreaElement/HTMLBut…

C++实现简单内存池

/写一个简单的内存池class Cgirl { public:int bh;//编号int xw;//胸围static char* m_pool; //内存池的初始地址//内存池初始化函数、static bool initpool() {cout << "调用初始化函数\n\n";m_pool (char*)malloc(18);//向堆内存空间申请18字节if (m_pool …