基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

Nacos 使用了哪些一致性协议?

知识点图片

Nacos 为了满足不同场景下的需求(CAP 理论中的 AP 和 CP),主要使用了两种一致性协议:Distro 协议Raft 协议

Nacos 的独特之处在于它同时支持这两种协议,允许用户根据业务场景选择强一致性还是最终一致性。

以下是详细的解析:

1. Distro 协议 (AP 模式 - 最终一致性)

Distro 是阿里巴巴(Nacos 团队)自研的一种点对点(Peer-to-Peer)的一致性协议。

  • 应用场景: 主要用于服务发现(Naming Service)中的非持久化(临时)实例
    • 在微服务架构中,绝大多数服务实例(如 K8s 中的 Pod)都是临时的,随时可能销毁和重建。对于服务发现来说,可用性(Availability)通常比强一致性更重要(宁可读到旧数据,也不能读不到数据)。
  • 核心机制:
    • 数据分片: Nacos Server 集群将数据分片,每个节点负责一部分数据的写入。
    • 对等同步: 当一个节点收到注册请求后,它会处理该请求,并异步地将数据同步给集群中的其他节点。
    • 最终一致性: 它是弱一致性的,不保证所有节点在同一时刻数据完全一致,但保证在一段时间后数据最终一致。
    • 抗网络分区: 如果发生网络分区,各分区的节点依然可以对外提供服务。
  • 新节点加入: 当新节点加入集群时,会轮询其他节点获取全量数据。

2. Raft 协议 (CP 模式 - 强一致性)

Raft 是目前业界最通用的分布式共识协议(Etcd、Consul 等都在用)。Nacos 采用了基于 Java 实现的 JRaft 库。

  • 应用场景:
    1. 配置中心(Config Service): 配置数据必须保证强一致性,不能出现不同节点读到不同配置的情况。
    2. 服务发现(Naming Service)中的持久化实例:例如传统的数据库节点,IP 基本不变,需要保证强一致性。
  • 核心机制:
    • Leader 选举: 集群中必须选举出一个 Leader,所有的写请求都必须由 Leader 处理。
    • 日志复制: Leader 将变更以日志的形式复制给 Follower 节点。
    • 过半提交: 只有当超过半数(N/2 + 1)的节点确认收到日志后,该变更才会被提交并生效。
  • 特点: 保证了数据的强一致性,但在 Leader 选举期间或发生网络分区导致无法选主时,集群可能暂时不可用(牺牲可用性)。

总结与对比

Nacos 通过一个智能的架构将这两种协议结合在一起:

特性 Distro 协议 Raft 协议
一致性模型 AP (可用性 + 分区容错性) CP (一致性 + 分区容错性)
一致性级别 最终一致性 强一致性
主要用途 服务发现(临时实例,默认模式) 配置中心服务发现(持久化实例)
写操作 每个节点都可以处理写请求(分片机制) 只有 Leader 节点处理写请求
性能 高(无须等待大多数节点确认) 中(需等待过半节点确认)
适用场景 高并发、高吞吐、对实时性要求不极端的服务注册 核心配置管理、对数据准确性要求极高的元数据

如何切换?
在 Nacos 的服务注册中,你可以通过请求参数 ephemeral 来控制:

  • ephemeral=true(默认):使用 Distro 协议(AP)。
  • ephemeral=false:使用 Raft 协议(CP)。

这种设计使得 Nacos 既能像 Eureka 一样提供高可用的服务发现(AP),又能像 ZooKeeper/Consul 一样提供强一致性的配置管理和服务治理(CP)。

00:00
00:00