本文将深入探讨 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 具备高扩展性、高可用性、强持久性和易管理性,成为分布式数据库的典范实现。