当前位置: 首页 > news >正文

jraft原理源码应用系列-nacos

简介

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

nacos jraft

seata jraft

rocketmq jraft

本文分析nacos jraft应用,based nacos 2.3.2

关键词

nacos

配置中心

服务注册中心

参考资料

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

《jraft原理源码分析(一)》,分析了jraft的架构,组件和启动》 分析了jraft技术架构,组件架构,是本文的基础

jraft技术架构

上图是jraft的技术架构

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

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

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

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

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

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

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

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

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

jraft@nacos

本文不深入分析nacos整体原理源码,重点分析nacos使用jraft,包括分布式存储和集群节点管理分

布式存储

本节分析nacos jraft分布式存储

上图是nacos jraft的类图,从两个维度分析,数据类型和类结构

数据类型

  1. 第一类,NamingMetadataOperateService负责,服务注册数据,包括服务元素据和实例元素据,这两类数据通常是AP,但也可以配置使用CP,因此也用到jraft
  2. 第二类,PersistentClientOperationServiceImpl负责,注册持久化数据,例如,数据库信息,redis服务信息
  3. 第三类,DistributedDatabaseOperateImpl负责配置中心数据

其中后两类一定走CP,需要分布式存储,线性一致性读;第一类后面2.1.2详细分析,存储可以配置为走CP,但读不是线性一致性读,对于微服务实例这个合理,线性一致性读性能太差,当数据不一致,读到已经失效的服务实例,通过重试选择另一个有效实例。

类结构

大致可分为3层,从左到右,前置服务层,raft层,应用

前置服务

前置处理client的读写数据,即,上面介绍的三个服务,

NamingMetadataOperateService/PersistentClientOperationServiceImpl/DistributedDatabaseOperateImpl

Raft写入是需要leader处理

raft层

raft层CP协议jraft实现

CPProtocol/JRaftProtocolCPProtocol定义CP协议的接口,实现是JRaftProtocol

JRaftServer/RaftGroupTuple前者负责配置和启动jraft组件, Node和RpcServer;后者持有jraft两件套,node和状态机,注意到,针对每个group,即每种类型创建一套node和状态机,不要跟jraft的group混淆,jraft支持多组,nacos的group对应不同的事件类型

状态机层

状态机是分布式存储共识数据推到应用处理

RequestProcessor4CP 日志数据应用侧的处理器,状态机交给该处理器处理提交的共识数据

PersistentClientOperationServiceImpl/DistributedDatabaseOperateImpl/InstanceMetadataProcessor/ServiceMetadataProcessor 这4个RequestProcessor4CP的实现,分别对应处理4种数据类型,其中前两个同时也是前置处理类

源码分析

应用写入

写入流程,CPProtocol(JRaftProtocol)的write--》JraftServer的commit

上图是JraftServer的commit方法,写入是leader负责,如果当前节点不是leader转交给leader

应用处理数据

DistributedDatabaseOperateImpl 配置中心最终是写入数据库,即,jraft+数据库实现分布式数据库

InstanceMetadataProcessor/ServiceMetadataProcessor 写入NamingMetadataManager的Map,即,jraft+Map实现分布式Map

应用读取
1. 配置中心的读取,最终是JraftServer的get方法处理

线性一致性读,线性一致性读失败,降级到raftlog读

2. 服务和实例元数据

服务和实例没有走线性一致读,两数据写入NamingMetadataManager的Map,client通过rest/rpc直接读取

集群管理

本节分析nacos的集群成员变更

上图是nacos集群jraft的类图

MemmberLookupnacos集群管理有自身机制,没有依赖jraft的集群管理,MemmberLookup同步nacos集群节点后,推送成员变更事件(MemberChangeEvent)到订阅者;另外,nacos支持api方式,rpc或者rest增加或移除peer

MemberChangeListener/ProtocolManager ProtocolManager负责构建和持有CProtocol,“兼职”成员变更事件的订阅者

Node最后,还是jraft Node承受了一切,注意到,只有移除peer(REMOVE_PEERS),并不是CHANGE_PEERS,原因是,nacos节点增加时,启动jraft,jraft node自动加入集群,nacos节点移除,jraft集群只是认为node下线,需要显式删除,因此只有删除需要调用node处理

系列文章

  1. Jraft应用分析-nacos,服务元数据,服务实例元数据,配置分布式存储
  2. Jraft应用分析-seata,session分布式存储
  3. Jraft应用分析-rocketmq控制器raft模式
http://www.cnnetsun.cn/news/175413.html

相关文章:

  • STM32学习——AD单通道AD多通道
  • 基于Spring Boot的农产品销售系统的设计与实现毕设源码
  • 基于Spring Boot的流浪动物救助平台的设计与实现毕业设计
  • 备份恢复-Cordovaopenharmony本地安全方案
  • 创建目标模块 Cordova 与 OpenHarmony 混合开发实战
  • 解决MQ消息丢失问题的5种方案
  • 芜湖,千兆网络下载速率只有10MB秒,过的什么苦日子
  • AI一周大事盘点(2025年12月14日~2025年12月20日)
  • K3s + Sysbox:让容器拥有“虚拟机的灵魂”
  • 8 个降AI率工具推荐,继续教育学生必备
  • 从开发一个AI美女聊天群组开始
  • 12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换
  • Java毕设项目:基于springboot的养宠物指南服务平台系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 10 个降AI率工具,继续教育学生高效避坑指南
  • Java毕设项目推荐-基于SpringBoot的演唱会门票在线预定系统的设计与实现基于springboot的演唱会购票系统的设计与实现【附源码+文档,调试定制服务】
  • 升压芯片很简单(一),快速选择升压芯片+利用升压芯片设计LED电源
  • 基于web的人才招聘网站设计 nodejs vue
  • 测试20个降AI率工具后,我找到了2个去ai痕迹效果好的网站,还有免费降AI额度。
  • Thinkphp和Laravel在线点餐系统的设计与实现vue
  • 现代cpp在传统内存分配上的改进
  • Java毕设项目:基于springboot的物业报修系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 【计算机毕业设计案例】基于springboot的物业报修系统的设计与实现线上化的报修管理平台(程序+文档+讲解+定制)
  • Java毕设选题推荐:基于springboot的社区团购系统的设计与实现、拼团下单、配送调度、资金结算【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java计算机毕设之基于springboot的幼儿园管理系统的设计与实现为幼儿园(含普惠园、民办园、连锁园)设计的 “家园共育 + 日常运营 + 安全监管(完整前后端代码+说明文档+LW,调试定制等)
  • I/O多路复用
  • 视频播放器PotPlayer下载安装教程:超详细图文步骤(PC+安卓)
  • Semantic Kernel 实战系列(六) - Memory与向量存储
  • 一个基于 .NET MAUI 的开箱即用的 UI 组件库,可快速搭建面向业务的应用程序界面!
  • Semantic Kernel 实战系列(七) - 高级主题 - Agents 与多代理系统
  • LeetCode每日一题——K个一组翻转链表