jraft原理源码分析(一)-架构,启动和初始化

简介

SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁集团(原蚂蚁金服)自主研发的一套金融级分布式中间件技术栈,jraft是sofastack的raft组件,构建高可用、强一致性(CP)的分布式系统,本系列based jraft v1.4.0,系列内容

1 架构,包括逻辑架构,技术架构和开发架构

2 节点(Node)启动和组件初始化

3 主节点选举

4 日志,包括写入日志,复制日志,状态机

5 线性一致性读

6 集群成员管理-联合共识

7 快照

本文是系列第一篇 架构,启动和组件初始化

关键词

蚂蚁金服sofastack

Jraft/raft jraft是 Java 实现的raft 共识算法库

参考资料

In Search of an Understandable Consensus Algorithm raft论文简版

https://blog.csdn.net/szlhj/category_12714458.html 另一个raft实现dledger原理源码分析

逻辑架构

上图是jraft的逻辑架构

Corecore包定义核心组件的接口,包括Node,StateMachine,Closure,client服务等,Node实现也在core包

Node 代表raft集群的节点,包括大部分核心逻辑,组件的初始化都在Node,

选举 主节点选举是jraft的核心功能,主节点是分布式节点协调的关键,日志写入主节点完成

日志 日志是jraft另一个核心功能,包括日志写入,日志复制,状态机的推进

存储 这里存储是jraft保存自身日志的存储,状态机状态的存储由应用提供

状态机状态机是应用的接口,应用实现状态机,接收jraft推送过半数节点写入的日志,按自身逻辑保存

快照 快照存储状态机的数据(StateMachine state),快照有两个作用,删除该快照之前的日志,节省空间;新节点或落后节点直接安装快照,快速追上进度,达到可用状态

read 线性一致性读,官方定义:在 T 时刻执行写入操作,那么在 T 时刻之后一定能够读取到之前写入的值,简单地说,从jraft实现角度,读取状态机最新共识点的数据

rpcrpc组件负责client与集群(节点),节点间的通讯

工具提供如定时器等工具类

技术架构

上图是jraft技术架构图

开发架构

本节介绍开发架构,以jraft自带的Counter示例,介绍jraft应用开发,也是后续分析场景

上图是Counter示例,其中带《counter》是示例的类,Counter在分布式集群中维护计数器

CounterServer Counter的启动主入口,负责rpc组件和Node的构建和初始化

RpcProcessor rpc的处理器,接受rpc请求,调用业务服务(CounterService )实现应用的业务,Counter有两个请求处理器,获取计数值(线性一致性读),写操作

CounterService Counter的业务服务,依赖Node的apply,处理任务/事件

CounterStateMachine Counter的状态机,接收和处理状态机caller推送的日志,维护内置的计数器,这是应用Counter的业务数据; 快照保存和加载

启动和初始化

上节介绍了Counter,CounterServer构建Node,Node负责初始化jraft组件,jraft组件众多,大致分为,定时器,事件处理组件,存储组件,日志组件,线性一致读组件,最后node初始化自身状态。

7.1 定时器

• 初始化延时任务调度器 TimerManager,用于处理内部的延时任务

• 创建计时器,执行周期性任务,包括:预选举计时器(electionTimer)、正式选举计时器(voteTimer)、领导权检查计时器(stepDownTimer),快照周期性生成计时器(snapshotTimer)

7.2 事件处理器

• 初始化 disruptor 组件,用于异步处理业务调用 Node#apply 方法向集群提交的 Task 列表。

7.3 日志存储

• 初始化日志数据存储组件,对日志数据执行一致性校验。

• 初始化元数据存储组件

• 初始化快照数据存储组件

7.4 日志

日志包括写入和复制,状态机,快照

• 初始化状态机调度器 FSMCaller

• 初始化选票箱 BallotBox,名字有点容易混淆,初看以为是选举使用,其实是确定是否到日志提交点

• 初始化复制器管理组 ReplicatorGroup

• 启用快照生成机制,启动快照组件

7.5 rpc客户端

• 创建并初始化 RPC客户端 RaftClientService

客户端用于节点间通讯,还有另一个CliClientService,应用调用jraft的服务

7.6 线性一致性读

• 初始化只读服务 ReadOnlyService,提供线性一致性读

7.7 初始Node状态

组件初始化后,Node初始化自身的状态

• 初始集群节点不为空,尝试执行角色降级(stepdown)

• 集群只有自己一个节点,尝试选举自己为 Leader

总结:node是当之无愧在jraft的C位位置,为其他部门(组件)提供办公场所,核心功能

NEXT

3 主节点选举

4 日志,包括写入日志,复制日志,状态机

5 线性一致性读

6 集群成员管理-联合共识

7 快照

相关推荐
番茄炒鸡蛋加糖5 分钟前
分布式 CAP、BASE 理论 & 中间件 CAP 取舍
分布式·中间件
海上小飞龙14 小时前
Redis 分布式锁原理:从 SET NX EX 到 Redisson 看门狗
数据库·redis·分布式
明达智控技术16 小时前
国产PLC、远程IO模块在食品包装机的应用
分布式·自动化
YOU OU21 小时前
RabbitMQ应用问题
分布式·rabbitmq
YOU OU1 天前
RabbitMQ高级特性
分布式·rabbitmq
珠***格1 天前
双碳目标下:四可装置如何助力光伏消纳与碳数据上报
网络·人工智能·分布式·安全·边缘计算
科力锐品牌君2 天前
行业龙头|科力锐全链路防勒索 + 多中心容灾方案,构筑河南翔宇医疗业务安全闭环!
网络·数据库·分布式·安全·数据安全·备份
WHS-_-20222 天前
基于网络感知自适应树与辅助路由加速地理分布式机器学习
网络·分布式·机器学习
Kripath_Rion2 天前
带你速通计算机经典论文(一):分布式系统篇
分布式·后端·架构
ACP广源盛139246256732 天前
Ling‑3.0‑flash 昇腾 0‑Day 适配落地@ACP#IX9104 在国产高密度算力矩阵中的机遇与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件