基于Raft算法的分布式KV数据库:一、开篇

news2024/11/13 9:15:29

项目描述:本项目是基于Raft算法的分布式KV数据库,保证了分布式系统的数据一致性和分区容错性,在少于半数节点发生故障时仍可对外提供服务。使用个人实现的分布式通信框架mpRPC和跳表数据库skipList提供RPC服务和KV存储服务。

github地址:https://github.com/1412771048/Raft

项目背景与简单介绍

项目背景相关

背景

在当今大规模分布式系统的背景下,需要可靠、高可用性的分布式数据存储系统。

传统的集中式数据库在面对大规模数据和高并发访问时可能面临单点故障和性能瓶颈的问题。

为了解决这些问题,本项目致力于构建一种基于Raft一致性算法的分布式键值存储数据库,以确保数据的一致性、可用性和分区容错性。

目的

学习了Raft算法之后手动实现,并基于此搭建了一个k-v存储的分布式数据库

解决的问题

  1. 一致性: 通过Raft算法确保数据的强一致性,使得系统在正常和异常情况下都能够提供一致的数据视图。
  2. 可用性: 通过分布式节点的复制和自动故障转移,实现高可用性,即使在部分节点故障的情况下,系统依然能够提供服务。
  3. 分区容错: 处理网络分区的情况,确保系统在分区恢复后能够自动合并数据一致性。

技术栈

  1. Raft一致性算法: 作为核心算法,确保数据的一致性和容错性。
  2. 存储引擎: 使用适当的存储引擎作为底层存储引擎,提供高效的键值对操作。目前选择的是跳表,但是可以替换为任意k-v数据库。

项目范围

项目的初始版本将实现基本的Raft协议和键值存储功能。

后续版本可能包括性能优化、安全性增强、监控和管理工具的开发等。

前置知识储备

在学习该项目之前,必须知道的内容有:

  1. 语言基础,比如:mutex ,什么是序列化和反序列化
  2. RPC相关,至少要知道什么是RPC

最好知道的内容有:

  1. c11的部分新特性:auto RAII
  2. 分布式的基础概念:容错、复制等

你的收获

  1. Raft共识算法的快速理解
  2. 基于共识算法怎么搭建一个分布式的k-v数据库

需要注意的是,分布式式的共识算法实现本身是一个比较严谨的过程,因为其本身的存在是为了多个服务器之间通过共识算法达成一致性的状态,从而避免单个节点不可用而导致整个集群不可用,因此在学习过程中必须要考虑不同情况下节点宕机、断网情况下的影响。

许多情况需要仔细思考并实验以验证算法正确性,其中的思考别人无法代替,本项目的内容只能作为分布式共识算法Raft的一个入门的实现,方便大家快速理解Raft算法,从而写到简历上,如果想全部理解分布式算法的精髓只能多思考多看多总结。

基于此,本项目中的一些实现或者结论可能有一些不严谨甚至错误的地方,欢迎指正。

mit6.824课程,如果你已经学习过该课程,那么已经不需要本项目了,本项目的难度和内容小于该课程。

下面推荐一些相关的学习资料,甚至本项目部分内容都是源于下面内容:

  1. 卡哥的跳表
  2. mit6.824课程的汉化book
  3. raft算法的可视化
  4. 分布式系统之CAP理论
  5. 分布式简单入门知识集合
  6. Raft的介绍
  7. 大佬的知乎
  8. mit6.824的讲义
  9. raft论文

最佳食用指南

关注Raft算法本身:首先整个项目最重点也是最难点的地方就是Raft算法本身的理解与实现,其他的部分都是辅助,因此在学习的过程中也最好关注Raft算法本身的实现与Raft类对外暴露的一些接口。

多思考错误情况下的算法正确性:Raft算法本身并不难理解,代码也并不多,但是简单的代码如何保证在复杂情况下的容错呢?需要在完成代码后多思考在代码不同运行阶段如果发生宕机等错误时的正确性。

项目大纲

项目的大概框图如下:

img

项目大概可以分为以下几个部分:

  1. raft节点:raft算法实现的核心层,负责与其他机器的raft节点沟通,达到 分布式共识 的目的。
  2. raftServer:负责raft节点与k-v数据库中间的协调服务;负责持久化k-v数据库的数据(可选)。
  3. 上层状态机(k-v数据库):负责数据存储。
  4. 持久层:负责相关数据的落盘,对于raft节点,根据共识算法要求,必须对一些关键数据进行落盘处理,以保证节点宕机后重启程序可以恢复关键数据;对于raftServer,可能会有一些k-v数据库的东西需要落盘持久化。
  5. RPC通信:在 领导者选举、日志复制、数据查询、心跳等多个Raft重要过程中提供多节点快速简单的通信能力。

目前规划中没有实现节点变更功能或对数据库的切片等更进阶的功能,后面考虑学习加入。

在多个机器启动后,各个机器之间通过网络通信,构建成一个集群,对这样的集群,其对外表现的就像一台单机的k-v数据库一样,且少数节点出现故障不会影响整个集群的工作。

因此有了Raft算法的集群k-v数据库相对于单机的k-v数据库:

优势:集群有了容错的能力,可以理解成Raft算法可以保证各个机器上的k-v数据库(也称状态机)以相同的顺序执行外部命令。

劣势:容错能力需要算法提供,因此程序会变得复杂;需要额外对数据进行备份;需要额外的网络通信开销。

也是因此,其实上层的k-v数据库可以替换成其他的组件,毕竟只是一个状态机而已。

目前设计的后续主要内容:

1.Raft算法的一些概念性内容,比如:Raft算法是什么?Raft算法怎么完成公式?完成Raft算法需要哪几个主要函数?需要哪几个主要的变量维护?

2.Raft算法的主要函数实现思路及代码,主要函数包括:AppendEntries sendRequestVotesendAppendEntriesRequestVote

3.其他部分组件,包括:RPC通信组件、k-v数据库、中间沟通数据库和raft节点的raftServer

项目难点

难点就是项目主要的几个功能模块的实现。

  1. Raft算法的理解与实现
  2. RPC通信框架的理解与实现
  3. k-v数据库

简历写法

在简历中应该突出完成功能的主要模块和对其优化的思考,由于时间原因,我在完成这个项目之后没有太多的时间去优化,因此我采用的写法是将主要模块写出来的作用。

在文章书写的过程中,后续我可能会加入一些项目的优化。

综上,下面给出简历写法,需要注意的是该写法并不是最优解,仅供参考,后续需要大家自行修改使用。


基于Raf共识算法的分布式KV存储数据库

项目描述

本项目是基于Raft共识算法的分布式K-V数据库,具备线性一致性和分区容错性,在少于半数节点发生故障仍可正常对外提供服务。使用个人实现的RPC通信框架MprRpc和跳表数据库SKipListPro完成RPC功能和K-V存储功能。

主要工作:

  1. 基于protobuf和自定义协议实现RPC通信框架MprRpc通信框架完成各节点之间的远程调用和数据传递功能:
  2. 基于跳表数据结构实现跳表数据库SkipListPro完成K-V存储功能;
  3. 实现Raft协议的心跳与选举机制,通过定时线程池触发心跳与选举任务,并维护集群的日志提交状态,
  4. 实现日志读写与提交,由领导节点处理客户端的读写请求,并将日志复制至跟随者节点,在超过半数节点复制成功后提交日志,应用命令至状态机并返回响应给客户端:
  5. 实现客户端协议,包括在客户端协议中加入由ip和请求序号组成的“请求id”以保证线性一致性,以及客户端重试等功能。

个人收获:

  1. 深入了解了分布式系统的相关知识
  2. 熟悉了Raft共识算法的原理和实现,并加强了对分布式系统中一致性、容错性等重要概念的理解。
  3. 学习了RPC和K-V数据相关原理和实现。

本项目常见问题

随着文章的进行,后续可能会补充这部分

Raft

包括但不限于下面内容:

1、 Raft算法的基本原理:

  1. 解释Raft算法的基本工作原理,包括领导者选举、日志复制和安全性保障。

2、 领导者选举:

  1. 如何进行Raft中的领导者选举?
  2. 在什么情况下会触发领导者选举?

3、 日志复制:

  1. Raft是如何通过日志复制来保证数据一致性的?
  2. 详细描述Raft中的日志复制过程。

4、 安全性保障:

  1. Raft是如何确保安全性的?讨论一致性、可用性和分区容错性之间的权衡。

5、 选举超时:

  1. 什么是选举超时?它的作用是什么?
  2. 选举超时的时间是如何设置的?

6、 日志条目的提交:

  1. Raft中的日志条目是如何提交的?
  2. 什么条件下才能够提交一个日志条目?

7、 拓扑变更:

  1. Raft如何处理集群拓扑的变更?
  2. 在节点动态加入或退出时,会发生什么?

8、 实际应用:

  1. Raft算法在实际场景中的应用有哪些?
  2. 是否了解一些使用Raft的实际系统案例?

9、 Raft与Paxos的比较:

  1. 与Paxos算法相比,Raft有哪些优势和不同之处?

10、 常见问题与挑战:

  1. Raft算法在分布式系统中有哪些常见的问题和挑战?
  2. 如何处理网络分区的情况?

11、 容错性:

  1. Raft算法如何处理节点故障?
  2. 在集群中的多个节点同时故障时,系统会有什么表现?

RPC

  1. 你的RPC如何设计的?
  2. 负载均衡有没有做?用的什么算法如何考虑的?
  3. 服务治理和发现有没有做?怎么做的?
  4. 你这个RPC框架的序列化和反序列化中protobuf细节有没有了解

测试

  1. 在集群数量变多的时候,Raft性能可能会下降,这方面有没有思考过?
  2. 有没有对性能进行过测试?用的什么工具?怎么测试的?

下一篇

接下来下一篇带大家来进入 raft的世界。

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

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

相关文章

如何在数据埋点中发现和修复数据上报逻辑错误

如何发现和处理数据埋点中的逻辑错误 在大数据分析中,数据埋点是至关重要的一环。然而,当我们遇到数据上报逻辑错误时,该如何应对呢?本文将为你揭示解决这一棘手问题的有效方法。 目录 如何发现和处理数据埋点中的逻辑错误什么是数据上报逻辑错误?如何发现数据上报逻辑错误…

Python酷库之旅-第三方库Pandas(060)

目录 一、用法精讲 231、pandas.Series.reorder_levels方法 231-1、语法 231-2、参数 231-3、功能 231-4、返回值 231-5、说明 231-6、用法 231-6-1、数据准备 231-6-2、代码示例 231-6-3、结果输出 232、pandas.Series.sort_values方法 232-1、语法 232-2、参数…

Flink-StarRocks详解:第三部分StarRocks分区分桶(第53天)

文章目录 前言2.3 数据分布2.3.1 数据分布概览2.3.1.1 常见的数据分布方式2.3.1.2 StarRocks的数据分布方式2.3.1.3 分区2.3.1.4 分桶 2.3.2 创建分区2.3.2.1 表达式分区2.3.2.1.1 时间函数表达式分区(自v3.1)2.3.2.1.2 列表达式分区(自v3.1&…

EAK水冷电阻60kW负载制动电阻器

描述 EAK制动电阻器 液冷电阻器将多余的制动能量转化为有用的热量,因此非常适合电动或混合动力驱动。与传统的风冷制动电阻器相比,水冷可节省高达 88% 的额外空间。作为一个额外的功能,电阻器可以很容易地与无滴漏的快速紧固件连接。由于即使…

注意力特征融合

摘要 https://arxiv.org/pdf/2009.14082 特征融合,即来自不同层或分支的特征的组合,是现代网络架构中无处不在的一部分。它通常通过简单的操作来实现,如求和或拼接,但这可能不是最佳选择。在这项工作中,我们提出了一种…

【Mybatis】浅谈Mybatis的缓存机制,一级缓存和二级缓存

目录 1. 缓存机制介绍 2. 一级缓存 3. 二级缓存 4. mybatis缓存执行流程 1. 缓存机制介绍 MyBatis 的缓存机制是为了提高应用程序的性能而设计的,通过缓存策略来减少数据库的查询次数。MyBatis 提供了两种类型的缓存:一级缓存和二级缓存。 默认情况下…

web框架:Django进阶(二)

文章目录 Django进阶(二)1.orm1.1 基本操作1.2 连接数据库1.3 连接池1.4 多数据库1.4.1 读写分离1.4.2 分库(多个app ->多数据库)1.4.3 分库(单app)1.4.4 注意事项 1.5 表关系1.6 数据操作单表一对多正向…

IIS解析漏洞~ IIS7.漏洞分析

IIS解析漏洞 文件解析漏洞是由于中间件错误的将特殊格式的文件解析成可执行网页文件(脚本),配合文件上传漏洞进行GetShell的漏洞! 1.2:IIS7.X 在IIS7.0和IIS7.5版本下也存在解析漏洞,在默认Fast-CGI开启状况下,在一个文…

Modbus通讯协议

Modbus通讯协议 Modbus协议是一种用于电子控制器之间的通信协议,‌它允许不同类型的设备之间进行通信,‌以便进行数据交换和控制。‌Modbus协议最初为可编程逻辑控制器(‌PLC)‌通信开发,‌现已广泛应用于工业自动化领…

Error: No module factory available for dependency type: CssDependency

本篇主要用来记录VUE打包的问题点,今天使用npm run build:prod 打包VUE出现如下问题: Error: No module factory available for dependency type: CssDependency 因为测试和预发布都挺正常的,正式环境竟然出问题,废话不多说&…

用 Python 编写的井字游戏

一.介绍 在本文中,我将向您展示如何使用 Python 创建一个非常简单的井字游戏。 井字游戏是一种非常简单的双人游戏。因此每次只能有两个玩家玩。该游戏也称为井字游戏或 Xs 和 Os 游戏。一个玩家玩 X,另一个玩家玩 O。在这个游戏中,我们有一…

java+springboot+mysql疾病查询网站01548-计算机毕业设计项目选题推荐(附源码)

摘 要 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的疾病查询网站,会使疾病查询工作系统化、规范化,也会提高医院形象,提高管理效率。 本疾病查…

最强开源模型 Llama 3.1 部署推理微调实战大全

目录 引言一、Llama 3.1简介二、Llama 3.1性能评估三、Llama 3.1模型推理实战1、环境准备2、安装依赖3、模型下载4、模型推理 四、Llama 3.1模型微调实战1、数据集准备2、导入依赖包3、读取数据集4、处理数据集5、定义模型6、Lora配置7、配置训练参数8、开始Trainer训练9、合并…

Effective Java 学习笔记--第18、19条继承与复合

目录 继承的设计 对用于继承的类可覆盖方法的说明 被继承类还需要遵循的约束 如何对继承类进行测试 如何禁止继承 复合的设计 什么是复合 复合的缺点 这两条的关系较强,核心都是继承,但是更强调继承的脆弱性,而且给出了继承的一个更优…

【云原生】Helm来管理Kubernetes集群的详细使用方法与综合应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

香港电讯亮相2024算网融合产业发展大会,荣获“SD-WAN优秀产品奖”

秉承“开放、创新、融合、共赢”的发展战略,中国通信标准化协会算网融合产业及标准推进委员会(CCSATC621)联合中国信息通信研究院,于2024年7月10日共同召开“2024年算网融合产业发展大会”。本次大会发布了多项算网融合领域最新研…

SpringBoot 日志:从基础到高级的全面指南

📚 SpringBoot 日志:从基础到高级的全面指南 🔍 📚 SpringBoot 日志:从基础到高级的全面指南 🔍摘要引言正文内容一、日志概述 📜二、日志使用 📝2.1 打印日志 📣2.2 日志…

主文件表遗失:数据恢复策略与实战指南

深入解析:无法恢复主文件表的困境 在数字化时代,数据不仅是信息的载体,更是企业运营和个人生活的核心。然而,当遭遇“无法恢复主文件表”的困境时,整个数据系统仿佛被按下了暂停键,让人措手不及。主文件表…

数据集成是什么意思?方法有哪些?数据集成三种方法介绍

1 数据集成是什么 数据集成(Data Intergration),也称为数据整合,是通过将分布式环境中的异构数据集成起来,为用户提供统一透明的数据访问方式。该定义中的集成是指从整体层面上维护数据的一致性,并提高对数据的利用和共享&#x…

智能语音转Markdown的神器

嘿,技术大咖们,今天我要给你们安利一个超酷炫的智能语音转Markdown笔记系统,它融合了前沿的语音识别技术和强大的AI大模型,绝对是记录和整理信息的神器! 打造了一个语音转Markdown的神器 智能语音生成Markdown笔记 这…