在分布式系统中,一致性哈希是实现数据分片与节点路由的核心技术,但不同系统的实现细节千差万别。Apache Cassandra 和 Redis Cluster 作为分布式存储领域的代表,虽然都基于一致性哈希思想,却因定位不同(分布式数据库 vs 分布式缓存)演化出截然不同的设计。本文将从哈希模型、节点映射、数据分布、扩展性等维度,深入剖析两者的核心差异与设计哲学。
一、哈希空间与分片粒度:从“连续令牌环”到“离散哈希槽”
一致性哈希的核心是定义“数据-节点”的映射规则,而哈希空间的设计直接决定了分片的灵活性与均衡性。
1. Cassandra:64位连续令牌环,范围分片
Cassandra 采用连续的64位整数哈希空间([-2^63, 2^63-1]),形成一个环形结构(令牌环)。数据与节点均通过“令牌(Token)”映射到环上的某一点,节点负责连续的令牌范围。
- 哈希函数:默认使用
MurmurHash3算法对分区键(Partition Key) 计算哈希值,生成64位令牌(如token("user123")=15623456789)。 - 分片逻辑:节点通过“令牌范围”划分数据,例如节点A负责
[1000, 2000],所有令牌落在该区间的数据均由A存储。
图示1:Cassandra 令牌环与范围分片
[环形结构]
令牌范围:-9e18 ←→ ... ←→ 0 ←→ ... ←→ 9e18(环形闭合)
节点映射:
- 节点A → 负责 [1000, 2000]
- 节点B → 负责 [2000, 3000]
数据映射:
- Key1(token=1500)→ 节点A
- Key2(token=2500)→ 节点B
2. Redis Cluster:16384个离散哈希槽,固定分片
Redis Cluster 采用离散的哈希槽(Hash Slot)模型,将哈希空间划分为固定的16384个槽(0-16383)。数据与节点通过“槽”映射,节点负责离散的槽集合。
- 哈希函数:使用
CRC16算法对键名(Key) 计算哈希值,再对16384取模(CRC16(Key) % 16384),得到哈希槽(如槽=5461)。 - 分片逻辑:槽与节点直接绑定,例如节点A负责槽
0-5460,节点B负责5461-10922,键的槽属于哪个节点,数据就存储在该节点。
图示2:Redis Cluster 哈希槽与离散分片
[线性槽集合]
槽范围:0 ←→ 1 ←→ ... ←→ 16383(共16384个)
节点映射:
- 节点A → 负责 0-5460(5461个槽)
- 节点B → 负责 5461-10922(5462个槽)
数据映射:
- Key1(槽=3000)→ 节点A
- Key2(槽=6000)→ 节点B
Cassandra与Redis一致性哈希算法设计差异

最低0.47元/天 解锁文章
1824

被折叠的 条评论
为什么被折叠?



