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

Nacos数据写入流程

在 3 节点的 Nacos 集群中,数据写入流程和主节点(Leader)的角色基于 Nacos 的分布式一致性协议(通常使用 Raft 协议)来实现。以下以 Markdown 格式详细说明 3 节点 Nacos 集群的数据写入流程以及主节点的角色和确定方式。

3 节点 Nacos 集群数据写入流程

Nacos 集群采用无中心化设计,所有节点理论上对等,但通过 Raft 协议选举出一个 Leader 节点(主节点)来协调数据写入和一致性。以下是数据写入的详细流程:

1. 客户端发起写请求

  • 客户端(例如通过 Nacos 控制台或 API)发起配置变更请求(如添加、修改或删除配置),请求发送到 Nacos 集群中的任意节点。
  • 如果请求发送到的节点不是 Leader,该节点会将请求转发到 Leader 节点(通过 Raft 协议的节点通信机制)。

2. Leader 节点处理写请求

  • Leader 节点接收到写请求后,执行以下步骤:
    1. 日志记录:Leader 将写操作记录到本地日志(Raft 日志),但尚未提交(commit)。
    2. 日志复制:Leader 通过 Raft 协议将日志条目(包含写操作)广播到其他 Follower 节点(即另外两个节点)。
    3. 等待确认:Leader 等待大多数节点(在 3 节点集群中,至少 2 个节点,包括 Leader 自身)确认已接收并记录日志。

3. Follower 节点响应

  • Follower 节点接收到 Leader 的日志条目后:
    • 将日志条目记录到本地日志中。
    • 向 Leader 回复确认消息,表示已成功记录。
  • 如果 Follower 节点无法响应(例如网络分区或节点宕机),只要大多数节点(2/3)确认,Raft 协议仍可继续。

4. 日志提交与数据应用

  • 当 Leader 收到大多数节点的确认后:
    • Leader 提交(commit)日志条目,表示写操作已达成一致。
    • Leader 将写操作应用到本地状态机(例如更新 MySQL 数据库或本地磁盘文件)。
    • Leader 通知 Follower 节点提交日志,Follower 节点随后将日志条目应用到各自的状态机。
  • 数据写入 MySQL 数据库(Nacos 默认使用 MySQL 存储配置数据),所有节点共享同一 MySQL 实例,数据一致性由 Raft 协议和 MySQL 主从复制机制共同保证。

5. 数据同步到本地磁盘

  • Nacos 节点在启动时会将 MySQL 中的全量配置数据同步到本地磁盘(路径通常为 /data/program/nacos/data/config-data/${GROUP})。
  • 写操作完成后,Leader 节点通过 HTTP 请求通知其他节点(Follower),触发它们从 MySQL 拉取最新数据并更新本地磁盘文件。
  • 此外,Nacos 集群会定期(默认每 6 小时)执行全量数据同步任务,确保本地磁盘数据与 MySQL 一致。

6. 返回响应给客户端

  • Leader 节点确认写操作完成后,向客户端返回成功响应。
  • 如果写操作涉及配置变更,Nacos 会通过事件机制(如 notifyConfigChange)通知相关客户端,触发配置动态刷新。

写入流程总结

  • 核心步骤:客户端请求 → Leader 日志记录 → 日志复制到 Follower → 多数节点确认 → 日志提交 → 数据应用(MySQL + 本地磁盘)→ 响应客户端。
  • 一致性保证:Raft 协议确保数据在大多数节点上达成一致,即使少数节点(1/3)宕机,集群仍可正常工作。
  • 数据存储
    • MySQL:中心化存储,保存所有配置数据,节点通过 Raft 协议协调写操作。
    • 本地磁盘:缓存全量数据,提升读取性能,定期或事件触发时与 MySQL 同步。

主节点(Leader)的角色与确定方式

主节点角色

在 Nacos 3 节点集群中,主节点(Leader)由 Raft 协议选举产生,负责以下关键职责:

  • 协调写操作:所有写请求(配置变更、服务注册等)由 Leader 处理,确保数据一致性。
  • 日志管理:Leader 维护 Raft 日志,记录所有写操作,并负责复制到 Follower 节点。
  • 集群状态管理:Leader 跟踪集群节点状态,处理节点加入、退出或故障情况。
  • 数据同步:Leader 触发配置变更事件,通知 Follower 节点更新本地数据。
  • 心跳机制:Leader 定期发送心跳信号给 Follower,维护集群的活跃状态。

主节点确定方式

Nacos 使用 Raft 协议进行 Leader 选举,具体过程如下:

  1. 集群启动或 Leader 故障
    • 集群启动时,所有节点初始为 Follower 状态,进入选举阶段。
    • 如果现有 Leader 宕机或失去联系,Follower 节点会触发新一轮选举。
  2. 选举过程
    • 每个节点有一个随机选举超时时间(通常 150-300ms),超时后,节点变为 Candidate 状态并发起选举。
    • Candidate 向其他节点发送投票请求(RequestVote RPC)。
    • 如果某个 Candidate 获得多数节点(3 节点集群中至少 2 票)的支持,它成为 Leader。
  3. 任期(Term)管理
    • 每次选举产生一个新的任期号(Term),Leader 的任期号会记录在日志中。
    • Follower 节点只接受任期号不低于自己的 Leader 的指令。
  4. 持续运行
    • Leader 定期发送心跳信号,防止 Follower 触发新选举。
    • 如果 Leader 故障,Follower 节点会因心跳超时而发起新选举。

查看当前 Leader

可以通过以下方式查看当前 Nacos 集群的 Leader 节点:

  • 命令行:在任一 Nacos 节点执行以下命令,查询 Raft 状态:
    curl -X GET "http://<node-ip>:8848/nacos/v1/ns/raft/state"
    
    返回的 JSON 响应中会包含 leader 字段,显示当前 Leader 节点的 IP 和端口。
  • 控制台:Nacos 控制台(2.x 版本起)提供集群管理页面,可查看节点状态和 Leader 信息。
  • 日志:检查 Nacos 节点日志(nacos/logs/nacos.log),搜索 Raft 相关信息,如选举或心跳日志。

主节点的特点

  • 动态选举:Nacos 集群没有固定的主节点,Leader 由 Raft 协议动态选举产生,可能因故障或网络问题切换。
  • 无主从之分:所有节点在功能上对等,Leader 仅在写操作时承担协调角色,读操作可由任意节点处理(通常直接读取本地磁盘或 MySQL)。
  • 高可用性:3 节点集群可容忍 1 个节点故障(2/3 节点存活即可正常工作),Leader 故障后会快速重新选举。

3 节点集群的注意事项

调试中的注意点

结合您提到的 Kubernetes Operator 本地调试场景:

  • 访问 Nacos 服务:在本地调试 Operator 时,可通过 kubectl port-forward 映射 Nacos 集群的 Service 端口(默认 8848)到本地,例如:
    kubectl port-forward svc/nacos 8848:8848
    
    然后在 Operator 代码中使用 http://localhost:8848 访问 Nacos。
  • 模拟 Leader 行为:调试时可通过 Nacos 控制台或 API 触发配置变更,观察日志确认 Leader 节点的处理流程。
  • Raft 状态检查:在 Kubernetes 环境中,使用 kubectl exec 进入 Nacos Pod,执行 Raft 状态查询命令,验证 Leader 和 Follower 状态:
    kubectl exec nacos-0 -- curl -X GET "http://localhost:8848/nacos/v1/ns/raft/state"
    

总结

  • 数据写入流程:客户端请求 → Leader 日志记录 → 日志复制 → 多数确认 → 提交并应用(MySQL + 本地磁盘)→ 响应客户端。
  • 主节点(Leader):由 Raft 协议选举产生,负责协调写操作、日志管理、数据同步等,动态切换,无固定主节点。
  • 3 节点集群特点:高可用,可容忍 1 节点故障,推荐奇数节点以优化选举效率。
  • 调试建议:使用 port-forward 访问 Nacos 服务,结合 Raft 状态查询和日志分析验证 Leader 行为。
http://www.xdnf.cn/news/7078.html

相关文章:

  • 深入理解EKS 工作节点的网络架构
  • Cadence学习笔记之---PCB器件放置与布局
  • SSM框架整合:从入门到实战
  • 大模型微调步骤整理
  • Flink CEP是什么?
  • 【数据结构与算法】ArrayList 与顺序表的实现
  • C++23 新特性:使某些视图的多参数构造函数显式化(P2711R1)
  • HBM的“暗战”
  • Spring AOP从0到1
  • STM32CubeMX生成UTF-8编码文件的设置方法
  • 第12章 Java多线程机制
  • 阶段四 项目1-苍穹外卖 第一章 Git
  • 基于matlab/simulink锂电池算法学习集合(SOC、SOH、BMS)
  • FloodFill算法:洪水般的图像处理艺术
  • #Redis黑马点评#(六)Redis当中的消息队列
  • 从0到1吃透卷积神经网络(CNN):原理与实战全解析
  • Java基于数组的阻塞队列实现详解
  • Qt音视频开发过程中一个疑难杂症的解决方法/ffmpeg中采集本地音频设备无法触发超时回调
  • 健康生活:养生实用指南
  • 浅谈无服务器WebSocket的优势
  • 什么是open BMC?
  • Spring AI Alibaba集成阿里云百炼大模型
  • 异常日志规范
  • 低功耗模式介绍
  • Java配置文件处理工具全解析
  • 人工智能赋能产业升级:AI在智能制造、智慧城市等领域的应用实践
  • 何首乌基因组-文献精读131
  • 代码上传gitte仓库
  • 【C语言练习】048. 使用递归进行树的遍历
  • 【软考 8T(n / 2)+n^2的时间复杂度如何计算?】