文章目录

  • 前言
  • 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实现原理相关推荐

  1. python flink_如何在 Apache Flink 中使用 Python API?

    原标题:如何在 Apache Flink 中使用 Python API? 导读:本文重点为大家介绍 Flink Python API 的现状及未来规划,主要内容包括:Apache Flink Pyth ...

  2. 命令模式及其在Apache IoTDB中的应用

    Motivation 在介绍命令模式的原理之前,我们先来一起考虑两个编程中经常遇到的现象. 实现一个功能 回想我们刚开始编程的时候,我们为了实现一个函数,于是根据这个函数开始设计它的输入输出,输入在写 ...

  3. Nacos如何实现Raft算法与Raft协议原理详解

    前言 大名鼎鼎的Paxos算法可能不少人都听说过,几乎垄断了一致性算法领域,在Raft协议诞生之前,Paxos几乎成了一致性协议的代名词.但是对于大多数人来说,Paxos算法太难以理解了,而且难以实现 ...

  4. 分布式一致性协议三部曲-从paxos幽灵复现看Raft实现原理

    幽灵复现 Mutlti-Paxos下存在Leader切换情况,因而可能出现下面的场景 第一轮中A被选为 Leader,写下了 1-10 号日志,其中 1-5 号日志形成了多数派,并且已给客户端应答,而 ...

  5. Raft 协议原理详解,10 分钟带你掌握

    之前写了一篇文章<肝了一个月的ETCD,从Raft原理到实践>,干货真的很多,但是无人转载,同事说文章太长了,不方便阅读.那这篇文章,我只选取里面的 Raft 协议,精华提炼,可读性更强! ...

  6. Apache Pulsar中的地域复制,第1篇:概念和功能

    灾难恢复规划,甚至更理想情况下使用的防灾规划,它们的重要性怎么强调都不为过,每周都会有相关的头条新闻报道证明这个结论的正确性.无论什么行业,如果遭遇无法预见的事件并影响到日常运维,组织都需要尽可能快速 ...

  7. OpenGL中摄像机矩阵的计算原理

    OpenGL中摄像机矩阵的计算原理 熟悉OpenGL|ES的朋友,可能会经常设置摄像机的view矩阵,iOS中相对较好,已经封装了方向,只需要设置摄像机位置,目标点位置以及UP向量即可.下面先介绍下摄 ...

  8. JAVA中堆栈和内存分配原理

    JAVA中堆栈和内存分配原理 1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在 ...

  9. php new对象 调用函数,关于JS中new调用函数的原理介绍

    这篇文章主要介绍了关于JS中new调用函数的原理介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数) ...

最新文章

  1. 第三课.使用简单的NN模拟fizzbuzz
  2. 如何解决并发的问题(SQL锁的使用)
  3. java程序并行机制_Java语言具有多种优点和特点,下列选项中,______反映了Java程序并行执行机制的特点。A.多线程B.健...
  4. 06 | 哨兵机制: 主库挂了, 如何不间断服务
  5. 剑网服务器维护,12月31日服务器例行维护公告
  6. html css考试题选择题,html_JavaScript_css试题
  7. 【openMV】openMV4之sensor模块
  8. python动态类型的坑_在Python中避免动态类型错误的策略是什么(NoneType没有属性x)?...
  9. e3mall商城的归纳总结10之freemarker的使用和sso单点登录系统的简介
  10. 蓝桥杯c语言本科试题,蓝桥杯c语言试题2015(3)
  11. 生不出孩子怪天气?驳《我国工业软件失去的30年》一文 | 凌云时刻
  12. Capsule-LPI:基于胶囊网络的LncRNA-蛋白质相互作用预测工具
  13. UVA 10131 Is Bigger Smarter? (DP,最长条件子序列)
  14. Python学习足迹
  15. Windows实现微信双(多)开—微信分身
  16. java实现发送qq邮箱验证码
  17. Linux/Unix设计思想
  18. 计算机有哪些值得参加的比赛
  19. 基于Hi3861的听话的狗子
  20. EVE-NG环境搭建

热门文章

  1. 优锘科技:企业架构管理平台荣获2021年度创新产品奖
  2. maven 打包排除指定文件
  3. 自然语言处理(NLP)之命名实体识别
  4. 999句最常用英语口语
  5. cheer ,on the way to linux
  6. 解决adb几秒自动退出
  7. JavaScript-空位补零
  8. 循环神经网络:LSTM
  9. 5款开源网站流量统计应用程序
  10. 【博学谷学习记录】超强总结,用心分享|大数据之数仓分层