基于本文回答
0
评论

对于临时实例,Nacos 集群节点之间是如何同步数据的?

知识点图片

对于 Nacos 的临时实例(Ephemeral Instance),集群节点之间的数据同步使用的是 Distro 协议

临时实例主要用于 AP(可用性 + 分区容错性)场景,因此 Nacos 在设计上优先保证服务的可用性和写入的高性能,采用的是最终一致性策略,而非强一致性(如持久化实例使用的 Raft 协议)。

以下是 Nacos 临时实例数据同步的核心机制和详细流程:

1. 核心协议:Distro 协议

Distro 是 Nacos 自研的一种点对点(Peer-to-Peer)的最终一致性协议。它的特点是:

  • 去中心化:每个节点都是平等的,没有主从之分(Leaderless)。
  • AP 模型:保证高可用,数据同步会有短暂延迟,但最终会一致。
  • 内存存储:数据主要存储在内存中,不强制落盘(因为临时实例本身就是易变的,重启后由客户端心跳重建)。

2. 数据同步流程

当一个客户端向 Nacos 集群注册一个临时实例时,同步过程如下:

A. 写入与路由 (Request Handling)

  1. 请求接收:客户端向集群中的任意一个节点发送注册请求(或心跳)。
  2. 责任节点路由(Distro Filter)
    • Nacos 会根据 Service Name 进行 Hash 计算,将服务映射到集群中的某一个节点,该节点被称为责任节点(Responsible Node)
    • 如果请求打到了非责任节点,该节点会将请求转发给责任节点(在 Nacos 1.x 中常见;在 Nacos 2.x 中,由于长连接机制,连接所在的节点通常直接处理并同步,逻辑稍有不同但原理一致:即谁持有连接/数据,谁负责同步)。
  3. 本地更新:责任节点收到请求后,直接更新本地内存中的服务注册表。
  4. 快速响应:更新完本地内存后,立即向客户端返回成功。这保证了极高的写入性能(不需要等待其他节点确认)。

B. 异步复制 (Asynchronous Replication)

在向客户端返回成功后,责任节点会启动异步任务进行数据同步:

  1. 任务创建:责任节点将数据变更包装成一个同步任务(Sync Task)。
  2. 延迟/批量发送:为了减少网络开销,Nacos 可能会对任务进行微小的延迟或批量合并。
  3. 广播:责任节点通过 UDP(Nacos 1.x)或 gRPC(Nacos 2.x)将数据变更推送到集群中的所有其他节点
  4. 从节点更新:其他节点收到同步数据后,更新各自的本地内存注册表。

3. 反熵机制(Anti-Entropy):保证最终一致性

由于网络抖动或节点故障,异步复制可能会失败。为了防止数据长时间不一致,Distro 协议引入了定期校验机制:

  1. 全量快照校验
    • 每个节点会定期(默认 5秒)向其他节点发送自己负责的服务数据的校验和(Checksum)
  2. 对比与修复
    • 接收端收到 Checksum 后,与本地数据进行比对。
    • 如果发现 Checksum 不一致,接收端会主动向责任节点发起请求,获取该服务的全量数据进行覆盖更新。

4. 新节点加入 (Load Data)

当一个新的 Nacos 节点加入集群时:

  1. 它会通过轮询的方式,向集群中的现有节点拉取全量数据。
  2. 拉取完成后,它开始承担部分服务的“责任节点”角色,并参与后续的同步流程。

总结

对于临时实例,Nacos 集群同步可以概括为:
“客户端写入 -> 责任节点内存更新 -> 立即响应客户端 -> 异步广播给其他节点 -> 定期 Checksum 校验兜底”

这种机制完美契合了服务发现场景的需求:注册速度快、查询高可用、允许短暂的数据不一致。

右滑查看面试常问