基于Raft算法的分布式KV数据库:一、开篇
项目描述:本项目是基于Raft算法的分布式KV数据库,保证了分布式系统的数据一致性和分区容错性,在少于半数节点发生故障时仍可对外提供服务。使用个人实现的分布式通信框架mpRPC和跳表数据库skipList提供RPC服务和KV存储服务。
github地址:https://github.com/1412771048/Raft
项目背景与简单介绍
项目背景相关
背景
在当今大规模分布式系统的背景下,需要可靠、高可用性的分布式数据存储系统。
传统的集中式数据库在面对大规模数据和高并发访问时可能面临单点故障和性能瓶颈的问题。
为了解决这些问题,本项目致力于构建一种基于Raft一致性算法的分布式键值存储数据库,以确保数据的一致性、可用性和分区容错性。
目的
学习了Raft算法之后手动实现,并基于此搭建了一个k-v存储的分布式数据库。
解决的问题
- 一致性: 通过Raft算法确保数据的强一致性,使得系统在正常和异常情况下都能够提供一致的数据视图。
- 可用性: 通过分布式节点的复制和自动故障转移,实现高可用性,即使在部分节点故障的情况下,系统依然能够提供服务。
- 分区容错: 处理网络分区的情况,确保系统在分区恢复后能够自动合并数据一致性。
技术栈
- Raft一致性算法: 作为核心算法,确保数据的一致性和容错性。
- 存储引擎: 使用适当的存储引擎作为底层存储引擎,提供高效的键值对操作。目前选择的是跳表,但是可以替换为任意k-v数据库。
项目范围
项目的初始版本将实现基本的Raft协议和键值存储功能。
后续版本可能包括性能优化、安全性增强、监控和管理工具的开发等。
前置知识储备
在学习该项目之前,必须知道的内容有:
- 语言基础,比如:
mutex
,什么是序列化和反序列化 - RPC相关,至少要知道什么是RPC
最好知道的内容有:
- c11的部分新特性:
auto
、RAII
等 - 分布式的基础概念:容错、复制等
你的收获
- Raft共识算法的快速理解
- 基于共识算法怎么搭建一个分布式的k-v数据库
需要注意的是,分布式式的共识算法实现本身是一个比较严谨的过程,因为其本身的存在是为了多个服务器之间通过共识算法达成一致性的状态,从而避免单个节点不可用而导致整个集群不可用,因此在学习过程中必须要考虑不同情况下节点宕机、断网情况下的影响。
许多情况需要仔细思考并实验以验证算法正确性,其中的思考别人无法代替,本项目的内容只能作为分布式共识算法Raft的一个入门的实现,方便大家快速理解Raft算法,从而写到简历上,如果想全部理解分布式算法的精髓只能多思考多看多总结。
基于此,本项目中的一些实现或者结论可能有一些不严谨甚至错误的地方,欢迎指正。
mit6.824课程,如果你已经学习过该课程,那么已经不需要本项目了,本项目的难度和内容小于该课程。
下面推荐一些相关的学习资料,甚至本项目部分内容都是源于下面内容:
- 卡哥的跳表
- mit6.824课程的汉化book
- raft算法的可视化
- 分布式系统之CAP理论
- 分布式简单入门知识集合
- Raft的介绍
- 大佬的知乎
- mit6.824的讲义
- raft论文
最佳食用指南
关注Raft算法本身:首先整个项目最重点也是最难点的地方就是Raft算法本身的理解与实现,其他的部分都是辅助,因此在学习的过程中也最好关注Raft算法本身的实现与Raft类对外暴露的一些接口。
多思考错误情况下的算法正确性:Raft算法本身并不难理解,代码也并不多,但是简单的代码如何保证在复杂情况下的容错呢?需要在完成代码后多思考在代码不同运行阶段如果发生宕机等错误时的正确性。
项目大纲
项目的大概框图如下:
项目大概可以分为以下几个部分:
- raft节点:raft算法实现的核心层,负责与其他机器的raft节点沟通,达到 分布式共识 的目的。
- raftServer:负责raft节点与k-v数据库中间的协调服务;负责持久化k-v数据库的数据(可选)。
- 上层状态机(k-v数据库):负责数据存储。
- 持久层:负责相关数据的落盘,对于raft节点,根据共识算法要求,必须对一些关键数据进行落盘处理,以保证节点宕机后重启程序可以恢复关键数据;对于raftServer,可能会有一些k-v数据库的东西需要落盘持久化。
- RPC通信:在 领导者选举、日志复制、数据查询、心跳等多个Raft重要过程中提供多节点快速简单的通信能力。
目前规划中没有实现节点变更功能或对数据库的切片等更进阶的功能,后面考虑学习加入。
在多个机器启动后,各个机器之间通过网络通信,构建成一个集群,对这样的集群,其对外表现的就像一台单机的k-v数据库一样,且少数节点出现故障不会影响整个集群的工作。
因此有了Raft算法的集群k-v数据库相对于单机的k-v数据库:
优势:集群有了容错的能力,可以理解成Raft算法可以保证各个机器上的k-v数据库(也称状态机)以相同的顺序执行外部命令。
劣势:容错能力需要算法提供,因此程序会变得复杂;需要额外对数据进行备份;需要额外的网络通信开销。
也是因此,其实上层的k-v数据库可以替换成其他的组件,毕竟只是一个状态机而已。
目前设计的后续主要内容:
1.Raft算法的一些概念性内容,比如:Raft算法是什么?Raft算法怎么完成公式?完成Raft算法需要哪几个主要函数?需要哪几个主要的变量维护?
2.Raft算法的主要函数实现思路及代码,主要函数包括:AppendEntries
、 sendRequestVote
、 sendAppendEntries
、 RequestVote
等
3.其他部分组件,包括:RPC通信组件、k-v数据库、中间沟通数据库和raft节点的raftServer
项目难点
难点就是项目主要的几个功能模块的实现。
- Raft算法的理解与实现
- RPC通信框架的理解与实现
- k-v数据库
简历写法
在简历中应该突出完成功能的主要模块和对其优化的思考,由于时间原因,我在完成这个项目之后没有太多的时间去优化,因此我采用的写法是将主要模块写出来的作用。
在文章书写的过程中,后续我可能会加入一些项目的优化。
综上,下面给出简历写法,需要注意的是该写法并不是最优解,仅供参考,后续需要大家自行修改使用。
基于Raf共识算法的分布式KV存储数据库
项目描述
本项目是基于Raft共识算法的分布式K-V数据库,具备线性一致性和分区容错性,在少于半数节点发生故障仍可正常对外提供服务。使用个人实现的RPC通信框架MprRpc和跳表数据库SKipListPro完成RPC功能和K-V存储功能。
主要工作:
- 基于protobuf和自定义协议实现RPC通信框架MprRpc通信框架完成各节点之间的远程调用和数据传递功能:
- 基于跳表数据结构实现跳表数据库SkipListPro完成K-V存储功能;
- 实现Raft协议的心跳与选举机制,通过定时线程池触发心跳与选举任务,并维护集群的日志提交状态,
- 实现日志读写与提交,由领导节点处理客户端的读写请求,并将日志复制至跟随者节点,在超过半数节点复制成功后提交日志,应用命令至状态机并返回响应给客户端:
- 实现客户端协议,包括在客户端协议中加入由ip和请求序号组成的“请求id”以保证线性一致性,以及客户端重试等功能。
个人收获:
- 深入了解了分布式系统的相关知识
- 熟悉了Raft共识算法的原理和实现,并加强了对分布式系统中一致性、容错性等重要概念的理解。
- 学习了RPC和K-V数据相关原理和实现。
本项目常见问题
随着文章的进行,后续可能会补充这部分
Raft
包括但不限于下面内容:
1、 Raft算法的基本原理:
- 解释Raft算法的基本工作原理,包括领导者选举、日志复制和安全性保障。
2、 领导者选举:
- 如何进行Raft中的领导者选举?
- 在什么情况下会触发领导者选举?
3、 日志复制:
- Raft是如何通过日志复制来保证数据一致性的?
- 详细描述Raft中的日志复制过程。
4、 安全性保障:
- Raft是如何确保安全性的?讨论一致性、可用性和分区容错性之间的权衡。
5、 选举超时:
- 什么是选举超时?它的作用是什么?
- 选举超时的时间是如何设置的?
6、 日志条目的提交:
- Raft中的日志条目是如何提交的?
- 什么条件下才能够提交一个日志条目?
7、 拓扑变更:
- Raft如何处理集群拓扑的变更?
- 在节点动态加入或退出时,会发生什么?
8、 实际应用:
- Raft算法在实际场景中的应用有哪些?
- 是否了解一些使用Raft的实际系统案例?
9、 Raft与Paxos的比较:
- 与Paxos算法相比,Raft有哪些优势和不同之处?
10、 常见问题与挑战:
- Raft算法在分布式系统中有哪些常见的问题和挑战?
- 如何处理网络分区的情况?
11、 容错性:
- Raft算法如何处理节点故障?
- 在集群中的多个节点同时故障时,系统会有什么表现?
RPC
- 你的RPC如何设计的?
- 负载均衡有没有做?用的什么算法如何考虑的?
- 服务治理和发现有没有做?怎么做的?
- 你这个RPC框架的序列化和反序列化中protobuf细节有没有了解
测试
- 在集群数量变多的时候,Raft性能可能会下降,这方面有没有思考过?
- 有没有对性能进行过测试?用的什么工具?怎么测试的?
下一篇
接下来下一篇带大家来进入 raft的世界。
相关文章:
基于Raft算法的分布式KV数据库:一、开篇
项目描述:本项目是基于Raft算法的分布式KV数据库,保证了分布式系统的数据一致性和分区容错性,在少于半数节点发生故障时仍可对外提供服务。使用个人实现的分布式通信框架mpRPC和跳表数据库skipList提供RPC服务和KV存储服务。 github地址&…...
react-日期选择器封装
文件 import { useMemo, useState, useEffect } from "react" import dayjs, { Dayjs } from "dayjs" import "dayjs/locale/zh-cn" import "./App.css" dayjs.locale("zh-cn")function SimpleCalendar() {// 当前时间对象…...
【C++题解】1022. 百钱百鸡问题
欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1022. 百钱百鸡问题 类型:嵌套穷举 题目描述: 用 100 元钱买 100 只鸡,公鸡,母鸡,小鸡都要有。 公鸡 5 元 1 只&#x…...
计算机毕业设计选题推荐-二手闲置交易系统-Java/Python项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
AI Agents(智能代理)教程:如何创建信息检索聊天机器人
AI 代理教程:如何创建信息检索聊天机器人 介绍 在本教程中,我们将指导您使用 AI 代理创建用于信息检索的复杂聊天机器人的过程。探索如何利用 AI 的强大功能构建能够高效地从各种来源检索数据的聊天机器人。 设置环境 我们的计划是使用 AI 代理&…...
Linux——管理本地用户和组(详细介绍了Linux中用户和组的概念及用法)
目录 一、用户和组概念 (一)、用户的概念 (二)、组的概念 补充组 主要组 二、获取超级用户访问权限 (一)、su 命令和su -命令 ( 二)、sudo命令 三、管理本地用户账户 &…...
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&…...
8G内存的Mac够用吗 ?苹果电脑内存满了怎么清理?可以有效地管理和优化你的Mac电脑内存,确保设备运行流畅
嘿,朋友们,让咱们聊聊怎么让我们的Mac小伙伴时刻保持巅峰状态吧!想象一下,每一次点击、每一次滑动,都如同初见时那般丝滑顺畅,是不是超级心动?为了这份持久的畅快体验,我强烈推荐大家…...
【LabVIEW学习篇 - 10】:属性、调用节点
文章目录 属性节点调用节点使用方法一使用方法二案例 练习 属性节点 LabVIEW中的对象(包括控件、VI、应用程序等)都有自己的属性和方法。属性就是对象与生俱来的一些特性,可以理解成它是静态的,如控件的背景颜色,坐标…...
如何在数据埋点中发现和修复数据上报逻辑错误
如何发现和处理数据埋点中的逻辑错误 在大数据分析中,数据埋点是至关重要的一环。然而,当我们遇到数据上报逻辑错误时,该如何应对呢?本文将为你揭示解决这一棘手问题的有效方法。 目录 如何发现和处理数据埋点中的逻辑错误什么是数据上报逻辑错误?如何发现数据上报逻辑错误…...
程序员面试“八股文”:助力成长还是应试枷锁?
程序员面试“八股文”:助力成长还是应试枷锁? 引言 在当今快速迭代的IT行业中,程序员面试作为选拔人才的关键环节,其内容与形式一直备受关注。其中,“八股文”式面试题,作为一类标准化、模式化的问题集合…...
强化学习-alphazero 算法理论
一、算法简介 简单地说,AlphazeroMCTS SL(策略网络价值网络) Selfplay resnet。 其中MCTS指的是蒙特卡洛树搜索,主要用于记录所有访问过的棋盘状态的各种属性,包括该状态访问次数,对该状平均评价分数等。 SL指监督学习算法&…...
使用 Rough.js 创建动态水平条形图
本文由ScriptEcho平台提供技术支持 项目地址:传送门 使用 Rough.js 创建动态可视化网络图 应用场景 Rough.js 是一个 JavaScript 库,它允许开发人员使用毛边风格创建可视化效果。该库适用于各种应用程序,例如: 数据可视化地图…...
Python教程(十):面向对象编程(OOP)
目录 专栏列表前言一、面向对象编程概述1.1 类和对象1.2 继承1.3 多态1.4 封装 二、Python 中的类和对象2.1 定义类2.2 __init__ 函数解释2.3 创建对象 三、继承3.1 基本继承3.2 创建子类对象 四、多态五、封装六. 访问限制七、综合实例结语 专栏列表 Python教程(一…...
CTFHUB-文件上传-文件头检查
开启题目 1.php内容: <?php eval($_POST[cmd]);?> 截屏截一个很小很小的图片,保存为 png 格式,把 1.png 和 1.php 放在同一文件夹,在此目录打开 cmd, 使用以下命令把 1.png 和 1.php 合成为图片马 copy 1.pn…...
c语言数组与指针,字符串与指针,指向函数的指针,malloca动态内存分配
数组与指针 数组: - 数组是一种数据结构,可以存储固定大小的一组相同类型的元素。在内存中,数组的元素是连续存储的。 指针: - 指针是一个变量,用于存储内存地址。指针本身占用内存,用来指向某个数据的地址。 数组与指针的关系…...
代码随想录算法训练营day30 | 452. 用最少数量的箭引爆气球 、435. 无重叠区间、763.划分字母区间
碎碎念:加油 参考:代码随想录 452. 用最少数量的箭引爆气球 题目链接 452. 用最少数量的箭引爆气球 思想 局部最优: 让重叠的气球尽量在一起,用一支弓箭射。 全局最优: 用最少数量的箭引爆气球。 首先对气球进行排…...
如何手动修复DLL丢失?2种手动修复dll文件方法
DLL(动态链接库)文件是Windows操作系统中非常重要的组成部分,它们包含了程序运行所需的代码和数据。然而,由于各种原因,如系统更新、软件卸载不当或病毒感染,DLL文件有时会丢失或损坏,导致程序无…...
Node.js(2)——压缩前端html
需求:把回车符(\r)和换行符(\n)去掉后,写入到新的html文件中 步骤: 读取源html文件内容正则替换字符串写入到新的html文件中 示例: 获取html文件中的内容并检查(同时…...
堆的实现-向上调整算法-向下调整算法-堆排序-TopK问题 C语言
堆的实现与堆排序及TopK问题的C语言代码 下面是详细的堆实现,包括向上调整、向下调整算法,以及堆排序和解决TopK问题的完整C语言示例代码。 1. 堆的实现 首先,定义堆的数据结构: #include <stdio.h> #include <stdli…...
【C++BFS】1466. 重新规划路线
本文涉及知识点 CBFS算法 LeetCode1466. 重新规划路线 n 座城市,从 0 到 n-1 编号,其间共有 n-1 条路线。因此,要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗树)。去年,交通运输部…...
服务器并发模型
服务器: 单循环服务器:服务器在同一时刻只能响应一个客户端的请求 并发服务器模型:服务器在同一时刻可以响应多个客户端的请求 UDP:无连接 TCP:有连接 1.多进程 资源空间消耗大 效率低 2.多线程 相…...
Chapter 23 数据可视化——地图
欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、基础绘图二、视觉映射三、案例分析 前言 随着地理信息系统(GIS)技术的迅猛发展和大数据时代的到来,数据可视化已经成为分析和理…...
Linux笔记 --- 组合数据类型
结构体 简单的定义结构体的方法 struct student {char name;int age;float score; };//使用student模板创建两个结构体变量 struct student Jack,Rose; 结构体中可以存放除了函数以外的任何数据类型的数据,在创建结构体时student被称为结构体模板名称,…...
DaoCloud-Dockfile文件NGINX文件
Dockfile文件 安装依赖,打包,配置NGINX代理,最后把打完的包复制到服务器相应的文件夹下,构建镜像成功。 # syntax docker/dockerfile:experimental FROM xx.xx.xx.xx/public/node:16.14.2 as builder# LABEL maintainer"e…...
耳机行业中MIC ENC
0 Preface/Foreword ENC: Environment Noise Cancellation,环境降噪,主要指在通话过程中,戴着ENC通话降噪耳机的使用者,即使在嘈杂的环境,比如在嘈杂的街区,开着窗运行的汽车上,说话…...
python-自动化办公-Excel-Openpyxl
Python处理Excel数据之Openpyxl 1.1 Openpyxl库的安装使用 openpyxl模块是一个读写Excel 2010文档的 Python 库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl是一个比较综合的工具,能够同时读取和修改Excel文档。其…...
图形编辑器基于Paper.js教程10:导入导出svg,导入导出json数据
深入了解Paper.js:实现SVG和JSON的导入导出功能 Paper.js是一款强大的矢量绘图JavaScript库,非常适合用于复杂的图形处理和交互式网页应用。本文将详细介绍如何在Paper.js项目中实现SVG和JSON格式的导入导出功能,这对于开发动态图形编辑器等…...
[STM32][Bootloader][教程]STM32 HAL库 Bootloader开发和测试教程
0. 项目移植 对于不想知道其执行过程的朋友来说,可以直接移植,我的板子是STM32F411CER6, 512K M4内核 项目地址: Bootloader(可以自己写标志位用于自测,项目中这部分代码已经被注释,可以打开自行测试&…...
如何手写一个SpringBoot框架
你好,我是柳岸花开。 在这篇文章中,我们将手写模拟SpringBoot的核心流程,让大家能够以一种简单的方式了解SpringBoot的大概工作原理。 项目结构 我们创建一个工程,包含两个模块: springboot模块,表示Spring…...
川沙网站建设/最新新闻热点事件
导 读:server.htmlencode 和 server.urlencode 是asp中很常用的函数,在asp.net中也有类似的函数:htmlencode 和 urlencode (注意大小写)以下用实例来进行介绍。server.htmlencode and server.urlencode are very common functions used by as…...
网站做qq链接代码/什么是网络整合营销
之前有一篇写过pycharm远程访问服务器,这里还写vscode的一个类似功能理由有两个。vscode相比于pycharm占用的内存要小。vscode远程访问不要钱!!!而pycharm必须要付费的专业版才拥有这个功能。但是vscode也有不好的地方,…...
农安县建设局官方网站/开发一个app软件多少钱
决策树算法ID3和C4.5实现鸾尾花分类预测ID3和C4.5算法原理简单介绍1、这两个算法差别不是特别大,一个是用信息增益来判断,一个是用信息增益率来判断,在sklearn库中指定 criterion“entropy” 即可,只是准确度不一样。2、这两个算法…...
网站广告推送怎么做/官方正版清理优化工具
一、八大排序 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。 排序分类 总体对比 1 冒泡排序 基本思想 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后&…...
my eclipse网站开发/友情链接价格
大家好,我是表哥Harker,表妹我来咯~ 从今天起是 Web前端开发基础入门的正式第一篇,早起的鸟儿有虫吃,开饭咯! 顺便说下整个系列有一篇学习导图方便表妹们查找 第一篇讲什么呢? 山不在高,有仙则灵,楼不在高,地基稳才行哟!我们可以观察房地产公司开发一片住宅区楼房时…...
做网站一定要公司备案吗/北京做网站推广
epoll学习:思考一种高性能的服务器处理框架 终于开始学习epoll了,虽然不明白的地方还是很多,但从理论到实践,相信自己动手去写一个具体的框架后,一切会清晰很多。 1、首先需要一个内存池,目的在于ÿ…...