Apache Ratis中的multi-raft实现原理
文章目录
- 前言
- Single-Raft模式
- Multi-raft改进
- 引用
前言
在之前笔者写过一篇关于Ozone利用Apache Ratis multi-raft功能来提升其系统的throughput的文章(Ozone Multi-Raft机制对于更大throughput处理量的支持),不过那篇博文只是简单介绍了下在multi-raft的支持下,一个Ozone Datanode节点可以允许成为多个Pipeline的一员,从而达到加大Ozone请求处理量的目的。本文笔者来聊聊Apache Ratis multi-raft的具体实现原理,聊聊从multi-raft的应用到本质。
Single-Raft模式
既然我们有multi-raft模式,那也就是说还有对应的single-raft模式。这里说的Single-raft模式其实是最早RaftServer实现的模式,一个节点上面只启动一个RaftServer实例,它的正常server state无非两种Leader或者Follower(假设不考虑投票选举阶段)。
对应一个单节点单RaftServer实例而言,它在本地节点上以及服务自身会存有以下一些必要的信息:
- StateMachine,内部状态机。
- RaftLog,持久化在本年底的transaction log。
- 还有Snapshot数据
其中RaftLog和Snapshot的数据是落在本地节点盘之上的。
下图是RaftServer内部服务的一个简要模型图:
上面括号中的F为Follower,SM为StateMachine的意思。对Lead/Follower RaftServer之间交互通信感兴趣的同学可阅读笔者之前写的相关文章:Apache Ratis的Ratis Server主从同步机制。
那么问题来了,在multi-raft模式下,上图中这个结构会变成什么样呢?
Multi-raft改进
Apache Ratis社区在JIRA RATIS-91: Add multi-raft support实现了这个功能。在这个功能下,它主要做了这么几个事情:
- 新增接口允许client端向service端添加新的raft group,一个新的raft group可理解为一组新的Leader/Follower RaftServer服务。
- 分离出RaftServerProxy和RaftServer服务,一个节点可以启动多个RaftServer实例,按照raft group id区别开,RaftServer有其独立的StateMachine以及其对应存储RaftLog的位置。
- RaftClient进行请求通信时需要带上raft group id,以此让server Proxy知道请求应定向到哪个具体的RaftServer中去。
新的mult-raft RaftServer结构类似如下:
对比上图和上上图,同样是3个节点,single-raft模式只能构造出1组RaftServer服务,而multi-raft可以构造出多组以上,这取决于用户实际使用场景怎么使用设置,也不是越多越好。因为一个节点所包含的RaftServer多了,自然它所能允许处理的最大的请求量上限也自然提高了。
OK,以上就是本文对Apache Ratis multi-raft功能的简单阐述了。
引用
[1].https://issues.apache.org/jira/browse/RATIS-91
Apache Ratis中的multi-raft实现原理相关推荐
- python flink_如何在 Apache Flink 中使用 Python API?
原标题:如何在 Apache Flink 中使用 Python API? 导读:本文重点为大家介绍 Flink Python API 的现状及未来规划,主要内容包括:Apache Flink Pyth ...
- 命令模式及其在Apache IoTDB中的应用
Motivation 在介绍命令模式的原理之前,我们先来一起考虑两个编程中经常遇到的现象. 实现一个功能 回想我们刚开始编程的时候,我们为了实现一个函数,于是根据这个函数开始设计它的输入输出,输入在写 ...
- Nacos如何实现Raft算法与Raft协议原理详解
前言 大名鼎鼎的Paxos算法可能不少人都听说过,几乎垄断了一致性算法领域,在Raft协议诞生之前,Paxos几乎成了一致性协议的代名词.但是对于大多数人来说,Paxos算法太难以理解了,而且难以实现 ...
- 分布式一致性协议三部曲-从paxos幽灵复现看Raft实现原理
幽灵复现 Mutlti-Paxos下存在Leader切换情况,因而可能出现下面的场景 第一轮中A被选为 Leader,写下了 1-10 号日志,其中 1-5 号日志形成了多数派,并且已给客户端应答,而 ...
- Raft 协议原理详解,10 分钟带你掌握
之前写了一篇文章<肝了一个月的ETCD,从Raft原理到实践>,干货真的很多,但是无人转载,同事说文章太长了,不方便阅读.那这篇文章,我只选取里面的 Raft 协议,精华提炼,可读性更强! ...
- Apache Pulsar中的地域复制,第1篇:概念和功能
灾难恢复规划,甚至更理想情况下使用的防灾规划,它们的重要性怎么强调都不为过,每周都会有相关的头条新闻报道证明这个结论的正确性.无论什么行业,如果遭遇无法预见的事件并影响到日常运维,组织都需要尽可能快速 ...
- OpenGL中摄像机矩阵的计算原理
OpenGL中摄像机矩阵的计算原理 熟悉OpenGL|ES的朋友,可能会经常设置摄像机的view矩阵,iOS中相对较好,已经封装了方向,只需要设置摄像机位置,目标点位置以及UP向量即可.下面先介绍下摄 ...
- JAVA中堆栈和内存分配原理
JAVA中堆栈和内存分配原理 1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在 ...
- php new对象 调用函数,关于JS中new调用函数的原理介绍
这篇文章主要介绍了关于JS中new调用函数的原理介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数) ...
最新文章
- 第三课.使用简单的NN模拟fizzbuzz
- 如何解决并发的问题(SQL锁的使用)
- java程序并行机制_Java语言具有多种优点和特点,下列选项中,______反映了Java程序并行执行机制的特点。A.多线程B.健...
- 06 | 哨兵机制: 主库挂了, 如何不间断服务
- 剑网服务器维护,12月31日服务器例行维护公告
- html css考试题选择题,html_JavaScript_css试题
- 【openMV】openMV4之sensor模块
- python动态类型的坑_在Python中避免动态类型错误的策略是什么(NoneType没有属性x)?...
- e3mall商城的归纳总结10之freemarker的使用和sso单点登录系统的简介
- 蓝桥杯c语言本科试题,蓝桥杯c语言试题2015(3)
- 生不出孩子怪天气?驳《我国工业软件失去的30年》一文 | 凌云时刻
- Capsule-LPI:基于胶囊网络的LncRNA-蛋白质相互作用预测工具
- UVA 10131 Is Bigger Smarter? (DP,最长条件子序列)
- Python学习足迹
- Windows实现微信双(多)开—微信分身
- java实现发送qq邮箱验证码
- Linux/Unix设计思想
- 计算机有哪些值得参加的比赛
- 基于Hi3861的听话的狗子
- EVE-NG环境搭建