本文将深入探讨 Apache Cassandra 如何在集群节点间分区和分布数据,并分析其如何通过多节点复制实现高可用性。

2. 节点

Cassandra 的单节点运行在服务器或虚拟机(VM)上。作为 Java 语言开发,其运行实例本质是一个 JVM 进程。节点可部署在云端、本地数据中心或任意磁盘。存储方面,官方推荐使用本地存储或直连存储(DAS),避免使用 SAN。

每个节点以分布式哈希表形式管理自身数据,并提供了 nodetool 工具用于管理和检查节点/集群状态。

3. 令牌环

Cassandra 将集群中的每个节点映射到连续令牌环上的一个或多个令牌。默认令牌是 64 位整数,范围从 -2^63 到 2^63-1。它采用一致性哈希技术实现节点与令牌的映射。

3.1. 单令牌节点

每个节点负责一个令牌范围:小于等于自身令牌且大于前一个节点令牌的值。首尾节点通过环形结构闭合:首节点负责小于等于自身令牌且大于末节点令牌的范围。

写入数据时,Cassandra 用哈希函数计算分区键的令牌值,通过比对节点令牌范围确定目标节点。

以 8 节点集群(复制因子 RF=3)为例:

[图示说明:环形结构中8个节点均匀分布,每个节点负责1/8的令牌范围]

单令牌模式的缺陷:增删节点会导致令牌分布失衡。例如:

  • 原有节点 X 负责 100-200 范围
  • 新增节点 Y 后,X 仅负责 100-150,Y 负责 151-200
  • 需将 X 的部分数据迁移至 Y

3.2. 多令牌节点(虚拟节点)

Cassandra 2.0+ 默认启用虚拟节点(vnode)。系统将令牌范围切分为更小区间,每个节点分配多个子区间。默认 num_tokens=256(在 cassandra.yaml 中配置),即每个节点包含 256 个 vnode。

优势:

  • 可灵活适配不同性能的机器(高性能节点分配更多 vnode)
  • 增删节点时,数据在多个节点间重新分布(而非单点迁移)

4 节点集群(每节点 2 个令牌)示例:

[图示说明:环形结构中每个节点被切分为2个vnode,数据分布更均匀]

4. 分区器

分区器决定数据在集群中的分布方式,本质是根据分区键计算令牌值的哈希函数。Cassandra 支持多种分区器,可通过实现 IPartitioner 接口自定义。

默认分区器

  • Murmur3Partitioner(Cassandra 1.2+):使用 MurmurHash 生成 64 位哈希
  • RandomPartitioner(旧版):使用 MD5 哈希

关键区别:

Murmur3Partitioner:非加密哈希,高性能
RandomPartitioner:加密哈希,性能较低

5. 复制策略

Cassandra 通过跨节点复制实现高可用和容错,复制策略决定副本存储位置。

集群节点不仅拥有自身令牌范围的数据,还存储其他区间的副本。主节点故障时,副本节点可接管请求。

Cassandra 在后台异步复制数据,复制因子(RF)定义数据副本数量(如 RF=3 表示 3 个节点存有相同数据)。

内置策略

  • SimpleStrategy:副本按环形顺序存放在后续节点
  • NetworkTopologyStrategy(生产推荐):可按数据中心设置不同 RF,同数据中心内副本跨机架部署

踩坑提示:生产环境必须用 NetworkTopologyStrategy,即使单数据中心部署也不例外。

6. 一致性级别

Cassandra 在读写操作上提供可调一致性级别,实现可用性与一致性的细粒度权衡。

读写机制

  • 读操作:需指定数量副本响应后返回数据
  • 写操作:需指定数量副本确认后返回成功

高一致性级别要求更多节点响应,提高数据一致性但可能降低可用性。作为最终一致系统,Cassandra 会在后台异步将写入同步至剩余副本。

7. 探测器(Snitch)

探测器提供网络拓扑信息,使 Cassandra 能高效路由读写请求。其功能包括:

  • 识别节点所属数据中心和机架
  • 判断集群中节点的相对网络距离

复制策略依赖这些信息在单/多数据中心集群中合理放置副本。

8. 结语

本文系统解析了 Cassandra 的节点、令牌环、分区器等核心概念,并深入探讨其数据分区与复制机制。这些架构设计使 Cassandra 具备高扩展性、高可用性、强持久性和易管理性,成为分布式数据库的典范实现。


原始标题:Replication Strategies and Partitioning in Cassandra