想象你站在一座城市的环城公交线路图前:站台沿着圆环一字排开,公交车永远顺时针行驶。每个乘客手里都有一张写着编号的车票,规则只有一条——上车后,在顺时针方向遇到的第一个站台下车。某天市政部门决定在两个站台之间新增一个站台,或者撤掉一个旧站台,神奇的事情发生了:整条线路上绝大多数乘客的行程完全不变,只有紧挨着变动位置的那一小段乘客需要改换下车地点。这正是分布式系统中“一致性哈希”(Consistent Hashing)解决的核心难题:如何把海量数据映射到一组服务器上,使得增删服务器时数据迁移量最小、集群服务不中断。本文沿着环城公交这条主线,从哈希环的基本原理、数据迁移、虚拟节点,讲到性能特性、常见问题与工程实践,带你用最直观的方式吃透这个分布式存储的基石。

岗位关联

一致性哈希是分布式缓存、数据库分片与 AI 训练数据存储的标配路由算法。掌握它,你就掌握了“扩容不惊魂、宕机不崩盘”的系统设计能力——这是后端工程师与 AI 基础设施开发者面试和实战的高频考点。

目录
  1. 可视化演示
  2. 核心原理:环形站台与顺时针寻址
  3. 数据迁移:加减站点只惊动邻居
  4. 虚拟节点:给站台造分身
  5. 性能特性:二分查找与扩展性
  6. 常见问题:堵车、雪崩与交警
  7. 工程实践:把线路图变成运营手册
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示一致性哈希环节点分布与顺时针路由、节点增减时数据迁移量对比及虚拟节点负载均衡效果。

本节配有交互动效(进入视口后自动加载,约 3KB)。

哈希环节点分布与路由 物理节点N1-N4分布在哈希环上 键顺时针路由到最近节点 route(key)→CW(next) 键从环上位置顺时针找到下一个节点

核心原理:环形站台与顺时针寻址

环城公交线路图就是我们理解一致性哈希的最佳模型。每个站台有一个固定编号,这个编号由“站台命名规则”算出;乘客车票上的编号则由“乘客编号规则”得出。站台和乘客被画在同一条环形线上,位置完全由编号决定。只要命名规则统一,任何人拿到一张车票,都能在图上一眼看出该在哪个站下车。

在分布式存储里,这把画位置的“尺子”就是哈希函数。任意一个数据键(如用户 ID、文件名)经过哈希函数,都会映射为 $[0, 2^{32})$ 这个大整数环上的一个位置;服务器节点同样用哈希函数映射到这个环上。于是数据与服务器被统一到了同一条“环线”上,剩下的问题只有一个:数据到底交给哪个节点?

规则就是“顺时针寻址”:从数据的位置出发,沿顺时针方向走,遇到的第一个服务器节点就是它的家。等价地说,每个节点负责管理环上从它逆时针方向开始的一段弧区。这个简单规则写成一个数学表达式:

就像乘客在顺时针方向遇到的第一个站台下车,数据也在顺时针遇到的第一个节点安家。站台编号与乘客编号来自同一把尺子,这是整个哈希环能够运转的前提:同一个哈希函数,既是站台的编号器,也是乘客的编号器。

Server(k)=arg⁡min⁡n∈N((h(n)−h(k)) mod 232)\text{Server}(k)=\underset{n\in N}{\arg\min}\Big((h(n)-h(k))\bmod 2^{32}\Big)
  1. h(k) 与 h(n)先对数据键和节点名分别做哈希,算出它们在环上的位置。
    h(k), h(n)∈[0, 232−1]h(k),\, h(n)\in[0,\,2^{32}-1]
  2. 顺时针距离$(h(n)-h(k))\bmod 2^{32}$ 表示从数据位置顺时针走到节点位置的弧长,模运算保证了绕回环起点也能正确计算。
    d(n,k)=(h(n)−h(k)) mod 232d(n,k)=\big(h(n)-h(k)\big)\bmod 2^{32}
  3. argmin 取最小在所有节点中选出顺时针距离最短的那一个。
    arg⁡min⁡n∈Nd(n,k)\arg\min_{n\in N}d(n,k)
  4. 最终归属选出的节点 n 就是数据键 k 的存储位置,数据从此在它那里“下车”。

数据迁移:加减站点只惊动邻居

现在环城公交线上要新增一个站台,哪些乘客会受影响?答案是:只有那些原本计划在新站台附近下车的乘客。住在城市另一头的乘客,出行路线和原来一模一样,连站牌都不用多看一眼。

回到分布式系统:新增一个节点时,会有一个新区间出现——从新节点位置到它顺时针后继节点之间的那段环。只有落在这个区间里的数据需要迁移到新节点,其余数据纹丝不动。删除节点时,该节点负责的数据整体移交给它的顺时针后继节点。这就是一致性哈希与普通取模哈希最本质的分水岭。

普通取模哈希的思路是“按节点总数分队伍”:数据归属 = 哈希值对节点数取余。队伍数量一变,几乎每个数据都要重新排位。而一致性哈希把“节点变动”的影响锁死在相邻区间内。若集群有 N 个节点,随机移除一个节点时,平均只有 1/N 的数据需要搬家:

公交线路改动时只惊动一小段乘客,这就是一致性哈希“最小化迁移”的承诺。相比之下,取模哈希就像一条“按人数编号”的长队——人数一变,整条队伍都要重新编号。这也是为什么真实系统里几乎没人敢用朴素取模做缓存路由。

E[迁移键占比]=1NE[\text{迁移键占比}]=\frac{1}{N}
  1. E 表示期望这是长期平均情况,而非某一次扩容的精确值。
    E[迁移键占比]=平均迁移键数总键数E[\text{迁移键占比}]=\frac{\text{平均迁移键数}}{\text{总键数}}
  2. N 为节点总数集群当前共有 N 个节点,每个节点平均管辖全环的 1/N 段弧。
  3. 1/N 的搬家比例一个节点退出后,只有它管辖的那段弧上的数据需要迁移,平均占全环的 1/N。

虚拟节点:给站台造分身

理想情况下,环城公交的站台应当均匀分布。但现实总是打脸:城东三个站台挤在一起,城西却只有孤零零一个大站台,于是城西的乘客排起长队,城东的站台却空空荡荡。这就是哈希环的“数据倾斜”问题——节点数量少时,哈希值的随机性不足以让节点均匀铺满整个环。

解决办法出乎意料地简单:给每个站台造分身。每个物理节点在环上不只放一个位置,而是放上几百个“虚拟节点”(本质是给同一个节点名拼上不同后缀再哈希)。于是原本孤零零的站台,变成了沿环线散布的几十个分身小站台,任何一段环上都有它们的身影。

虚拟节点让数据分布显著变得更均匀。更进一步,不同物理节点的算力不同,还可以按权重分配分身的数量——算力强的节点多放一些分身,自然承接更多数据:

站台太多会让人眼花缭乱,但虚拟节点这个“分身术”恰好解决了站台稀疏的痛点。每个物理节点通过分身均匀散布在环上,整条公交线从“几站路挤在一起”变成“沿途处处有站可下”。

vi=⌊wi×V⌋v_i=\lfloor w_i\times V\rfloor
  1. w_i 表示权重物理节点 i 在集群中的能力占比,归一化到 [0,1] 区间,权重越大能力越强。
    wi∈[0,1],∑iwi=1w_i\in[0,1],\quad \sum_i w_i=1
  2. V 为虚拟节点总数设计者设定的整个环上虚拟节点总个数,V 越大分布越细。
  3. 乘积与取整按权重切分 V,再用向下取整得到每个物理节点分到的整数个虚拟节点。
    vi=⌊wi×V⌋v_i=\lfloor w_i\times V\rfloor

性能特性:二分查找与扩展性

公交公司在评估线路时最关心两件事:站台再多,乘客找站台的速度会不会变慢?线路扩建时,改造成本高不高?一致性哈希在这两件事上交出了漂亮的答卷。

查找效率上,环上所有的虚拟节点位置可以保存在一个有序数组中,查找时用二分定位第一个大于等于目标哈希的位置。假设每个物理节点有 V 个虚拟分身、共 N 个物理节点,环上就有 m = V × N 个位置,一次寻址只需比较 O(log m) 次,与集群里存了多少数据完全无关。

扩展性上,新增或删除节点只需更新那个节点的所有虚拟位点,其余节点毫无感知;而且由于迁移比例只有约 1/N,扩容对线上服务的影响极小。平衡性上,虚拟节点让负载方差随 V 增大而下降。这些特性共同决定了它的适用场景:节点频繁扩缩容、数据量巨大、但对单次查找延迟要求严格的缓存与分片系统:

就像乘客在站牌密集的环线上,不需要挨个站台问询,看一眼“站牌索引”就能迅速定位目标。站点再多、线路再长,找到下车站的时间也只是对数增长——这就是环城公交能从小城扩张到大都市的底气。

Tlookup=O(log⁡m),m=V×NT_{\text{lookup}}=O(\log m),\quad m=V\times N
  1. m 为环上总位置数每个物理节点有 V 个虚拟分身,环上共有 m = V×N 个虚拟节点参与寻址。
    m=V×Nm=V\times N
  2. 有序数组存储所有虚拟节点哈希值按从小到大排序后放入数组。
  3. 二分查找在有序数组中定位目标位置,每次比较排除一半区间,复杂度为对数级。
    O(log⁡2m)O(\log_2 m)

常见问题:堵车、雪崩与交警

环线再先进,也架不住站台扎堆造成的拥堵。当节点数量很少,或者哈希函数对某些数据模式不够均匀时,节点在环上的位置可能挤成一团:一小段弧上挤着好几个节点,而大半个环无人接管。结果就是部分节点负载爆表,另一些节点闲置吃灰,这就是“环偏斜”。

更危险的是“雪崩效应”。环城线上某个大站突然关闭,原本在该站下车的乘客全部涌向顺时针的下一站;下一站骤然超载,也不得不关闭;乘客再涌向更下一站……最终整条线路瘫痪。分布式系统完全同理:一个缓存节点宕机,压力瞬间转移到它的后继节点,后继节点可能被击穿,引发连锁故障。

热点数据是另一个隐形杀手:某个明星商品的 key 被海量请求打在同一节点上,即使环分布均匀也扛不住单点放大。工程上的规避方案包括:用虚拟节点摊平偏斜、为热点 key 增加副本或本地缓存、在节点故障入口加限流熔断、依靠监控快速摘除濒危节点。衡量偏斜程度可以用一个简单指标:

环城线路再先进,也需要交警与应急预案。虚拟节点是“分散客流”的站台规划,监控与限流是“疏导拥堵”的交通管制,两者缺一不可。

Skew=max⁡iLiLˉ,Lˉ=1N∑i=1NLi\text{Skew}=\frac{\max_{i}L_i}{\bar{L}},\quad \bar{L}=\frac{1}{N}\sum_{i=1}^{N}L_i
  1. L_i 表示负载节点 i 当前承载的数据键数量,是衡量压力的直接指标。
    Lˉ=1N∑i=1NLi\bar{L}=\frac{1}{N}\sum_{i=1}^{N}L_i
  2. 取最大值所有节点中负载最高的那一个,决定集群的短板。
    max⁡iLi\max_{i}L_i
  3. 读数字Skew 越接近 1 说明负载越均衡,越大说明偏斜越严重,需要及时干预。

工程实践:把线路图变成运营手册

把环城公交的线路图真正投入运营,还要面对真实城市的复杂路况。在分布式世界,一致性哈希最经典的应用是缓存集群的路由:Memcached 客户端(如 ketama)就是用一致性哈希把 key 映射到缓存节点,扩容时只有少量 key 失效回源,数据库不会被击穿。

分布式数据库的分片同样大量采用环式设计:类似 Cassandra 的架构里,数据按一致性哈希落在环上,新增存储节点时自动 rebalance;每个节点按算力配置虚拟节点权重,老旧节点还能优雅缩容。Redis Cluster 虽然用了固定 16384 个哈希槽而非纯一致性哈希,但其“槽位均匀分布、迁移最小化”的设计思想一脉相承。

工程实现上有几个关键要点:哈希函数要选均匀性好的(如 md5、murmur),虚拟节点数通常取 100 到 200;节点列表变更时要保证“单调性”——旧节点之间绝不互相抢数据,新增节点只从邻接区间“接客”:

这份“运营手册”同时提醒我们:一致性哈希负责“数据放哪”,却不负责“数据一不一致”。副本同步、故障恢复、强一致性保障仍需要 Raft、Quorum 等协议来兜底。把路由做对,再把一致性做好,环城公交才能真正成为一座城市的大动脉。

f(k,S∪{nnew})∈{f(k,S), nnew}f(k,S\cup\{n_{\text{new}}\})\in\{f(k,S),\,n_{\text{new}}\}
  1. f(k,S) 表示归属在旧节点集合 S 中,键 k 的归属节点是 f(k,S)。
    S⊆S′S\subseteq S'
  2. 加入新节点节点集合从 S 变为 S ∪ {n_new},重新执行顺时针寻址。
    S∪{nnew}S\cup\{n_{\text{new}}\}
  3. 单调性重新寻址后,键 k 的归属要么保持不变,要么就是新节点 n_new,旧节点之间不会发生数据互抢。
    f(k,S∪{nnew})∈{f(k,S), nnew}f(k,S\cup\{n_{\text{new}}\})\in\{f(k,S),\,n_{\text{new}}\}

AI 应用场景

AI 训练样本缓存集群扩容

阶段:AI 基础设施容量规划与缓存路由

解决的问题:大模型训练需要海量图片、文本样本,缓存集群常因数据暴涨需要从 4 台扩到 8 台。传统取模哈希会让约 7/8 的缓存键失效,所有请求瞬间回源到对象存储,训练数据管道被打满、GPU 空等数据。采用一致性哈希后,扩容只迁移约 1/8 的 key,绝大多数缓存继续命中。

具体案例:某大模型团队用 Memcached + 一致性哈希缓存训练样本,大促前新增 2 台缓存节点。监控显示缓存命中率仅下降 3%,训练任务全程无感知,回源流量平稳,扩容在 10 分钟内完成。

分布式特征数据库分片

阶段:特征存储与在线推理服务

解决的问题:推荐系统的特征数据规模达百亿级,分片扩容时全量迁移几乎不可接受。一致性哈希 + 虚拟节点让每个分片只迁移相邻数据,并按节点算力分配权重,新节点自动分担负载。

具体案例:基于 Cassandra 风格的环式分区架构存储用户特征,新增 3 台存储节点后,集群后台自动 rebalance,特征读写延迟稳定,无需停服即可完成扩缩容。

有状态服务请求路由

阶段:在线推理服务的负载均衡与会话保持

解决的问题:AI 问答服务的 WebSocket 长连接需要稳定落在同一后端节点,后端扩缩容时希望尽量少的会话迁移。按 userId 做一致性哈希路由,扩容只影响少量连接,用户几乎无感知。

具体案例:某 LLM 对话应用在网关层用一致性哈希把会话路由到推理节点,灰度扩容一台机器时,只有约 1/N 的连接发生重连,对话上下文完整保留,线上零投诉。

Python 演示

python59 行
import hashlibimport bisect  class ConsistentHashRing:    def __init__(self, nodes=None, replicas=150):        self.replicas = replicas        self.ring = {}        self.sorted_keys = []        if nodes:            for node in nodes:                self.add_node(node)     def _hash(self, text):        return int(hashlib.md5(text.encode('utf-8')).hexdigest()[:8], 16)     def add_node(self, node_id):        for i in range(self.replicas):            h = self._hash('%s-%d' % (node_id, i))            self.ring[h] = node_id            bisect.insort(self.sorted_keys, h)     def remove_node(self, node_id):        for i in range(self.replicas):            h = self._hash('%s-%d' % (node_id, i))            del self.ring[h]            pos = bisect.bisect_left(self.sorted_keys, h)            self.sorted_keys.pop(pos)     def get_node(self, key):        if not self.sorted_keys:            return None        h = self._hash(key)        pos = bisect.bisect_right(self.sorted_keys, h)        if pos == len(self.sorted_keys):            pos = 0        return self.ring[self.sorted_keys[pos]]  def simulate(key_count=100000):    nodes = ['n1', 'n2', 'n3', 'n4']    ring = ConsistentHashRing(nodes, replicas=150)    before = {n: 0 for n in nodes}    for k in range(key_count):        before[ring.get_node('user:%d' % k)] += 1    print('扩容前各节点负载:', before)     ring.add_node('n5')    after = {n: 0 for n in nodes + ['n5']}    for k in range(key_count):        after[ring.get_node('user:%d' % k)] += 1    migrated = sum(before[n] - after[n] for n in nodes)    print('扩容后新节点n5负载:', after['n5'])    print('从旧节点迁出的键数:', migrated)    print('迁移比例: %.2f%%' % (100.0 * migrated / key_count))  if __name__ == '__main__':    simulate(key_count=100000)
目的:用约 70 行代码实现带 150 个虚拟节点的一致性哈希环,并模拟向 4 节点集群扩容 1 个节点时,实际只有约 1/5 的数据发生迁移,直观验证“最小迁移”特性。
  1. h = int(hashlib.md5(text.encode('utf-8')).hexdigest()[:8], 16)把任意字符串映射成 0 到 2^32 环上的整数位置。
  2. self.ring[h] = node_id记录每个虚拟节点位置与其所属物理节点的映射关系。
  3. bisect.insort(self.sorted_keys, h)维护一个始终有序的虚拟节点位置数组,为二分查找做准备。
  4. pos = bisect.bisect_right(self.sorted_keys, h)找到第一个大于等于数据哈希的虚拟节点位置。
  5. if pos == len(self.sorted_keys): pos = 0当数据在环的末尾时绕回起点,形成闭环。
  6. ring = ConsistentHashRing(nodes, replicas=150)每个物理节点创建 150 个虚拟分身,提升负载均衡性。
  7. migrated = sum(before[n] - after[n] for n in nodes)扩容后只有旧节点迁出的键才是真正搬家的数据,其余键映射保持不变。

常见误区

误区我以为一致性哈希就是把数据哈希之后取模,只不过用了 MD5 这种更均匀的哈希函数,所以比普通取余效果好。

正解一致性哈希的关键根本不在哈希函数,而在“环 + 顺时针寻址”这个拓扑结构。取模哈希的问题是“节点数一变,几乎所有键重新映射”;一致性哈希则把节点放到环上,增删节点只影响相邻区间。哪怕改用 MD5 后仍然取模,节点数一变照样全量重排。好比换了更好的发号员,但“按总人数分队伍”的规则不变,队伍重排依旧。

为何常见:两者名字里都带“哈希”,初学者容易把“哈希函数的均匀性”和“哈希拓扑的扩展性”混为一谈。

误区既然虚拟节点能让负载更均衡,那就给每个物理节点配几千个虚拟节点,绝对均匀、绝无倾斜。

正解虚拟节点数量的增加会带来两个成本:一是内存开销,环上每多一个虚拟节点就要在有序数组中占一个位置;二是查找常数,二分查找的 log m 虽然增长缓慢,但 m 过大时缓存失效和比较成本都会上升。工程实践表明,超过 200 个之后均衡收益急剧递减,常用 100~200 个即可。好比站台分身太多,站牌挂满整条街,反而难以维护。

为何常见:直觉上“越多越均匀”是对的,但忽略了成本与边际收益,没有工程权衡意识。

误区只要用了一致性哈希,集群就不会有热点,节点宕机也不会出问题。

正解节点少或哈希不均时仍会发生环偏斜;更危险的是雪崩——一个节点宕机,它的负载整体转移给顺时针后继节点,后继可能超载继而宕机,形成级联。虚拟节点只能降低概率,不能消除风险。工程上需要配合监控、限流、熔断和副本策略。好比修了环城线不等于不堵车,还需要交警和应急预案。

为何常见:把“减少迁移”这个优点错误放大为“免疫一切故障”。

误区从名字看,“一致性哈希”应该能保证多个副本之间数据一致,选它就够了。

正解一致性哈希只解决“数据放哪、迁移多少”的寻址与路由问题,不负责数据同步、副本一致性和冲突解决。副本间的强一致需要 Raft、Paxos、Quorum 等协议来保证,两者是不同层面的问题。好比公交线路只决定你在哪个站下车,并不保证站台上的信息牌内容在所有站点完全同步。

为何常见:名称中的“一致性”与分布式理论中的“一致性协议”共享同一个词,极易造成概念混淆。

面试题

Q1. 在一致性哈希环上,一个数据键最终存储在哪台服务器?

单选题 · easy

  • A.顺时针遇到的第一个节点← 正确答案
  • B.逆时针遇到的第一个节点
  • C.哈希值最小的那个节点
  • D.负载最轻的那一个节点

答案:A。一致性哈希的寻址规则是从数据位置出发顺时针走,遇到的第一个节点就是它的“下车站”。逆时针寻址是错误方向;“哈希值最小”和“负载最轻”都不是环上寻址规则。

Q2. 某个一致性哈希集群当前有 6 个节点,移除 1 个节点后,期望迁移的数据比例约为多少?

单选题 · easy

  • A.六分之一← 正确答案
  • B.五分之一
  • C.三分之一
  • D.二分之一

答案:A。每个节点平均管辖全环的 1/N 段弧,N=6 时移除一个节点只有它管辖的那段数据需要搬家,期望迁移比例约 1/6。这正是“最小化迁移”的价值所在。

Q3. 引入虚拟节点的主要目的是什么?

单选题 · easy

  • A.加快数据的哈希速度
  • B.让各节点负载更均衡← 正确答案
  • C.减少哈希环的空间
  • D.提升数据加密强度

答案:B。虚拟节点是每个物理节点在环上的“分身”,能让节点位置铺满整个环,显著降低数据倾斜。它与哈希速度、环空间大小、加密强度没有关系。

Q4. 一致性哈希相比直接取模哈希的最大优势是什么?

单选题 · mid

  • A.计算哈希的速度更快
  • B.数据存储更加安全
  • C.节点变动时迁移最少← 正确答案
  • D.不需要维护节点列表

答案:C。取模哈希在节点数变化时几乎全部键重新映射,而一致性哈希只影响相邻区间,平均只迁移 1/N 的数据。速度、安全性和节点列表维护都不是它的核心优势。

Q5. 属于一致性哈希“单调性”的正确表述是?

单选题 · mid

  • A.新增节点后所有键全部重排
  • B.新增节点后旧映射不变或换新← 正确答案
  • C.移除节点后所有键保持不变
  • D.节点权重越大位置越靠前

答案:B。单调性指新增节点后,旧键要么留在原节点,要么只迁移到新节点,旧节点之间绝不互抢数据。选项 A 是取模哈希的行为,C 与“移除节点会导致数据移交”矛盾,D 与单调性无关。

Q6. 物理节点数为 N、每节点虚拟副本数为 V 时,一致性哈希环上查找的时间复杂度是?

单选题 · mid

  • A.随虚拟节点总数对数增长← 正确答案
  • B.随虚拟节点总数线性增长
  • C.随物理节点数量线性增长
  • D.固定常数不随节点变化

答案:A。环上共有 m = V×N 个虚拟节点,位置存于有序数组,用二分查找定位目标,复杂度为 O(log m),即随虚拟节点总数对数增长。线性或常数描述均不对。

Q7. 关于“雪崩效应”,下列说法正确的是?

单选题 · hard

  • A.一致性哈希可以彻底杜绝雪崩
  • B.雪崩只会发生在取模哈希中
  • C.虚拟节点无法缓解任何雪崩
  • D.节点故障后压力转移给后继可能级联← 正确答案

答案:D。一个节点宕机后,其数据整体交给顺时针后继节点,后继可能超载继而宕机,形成级联,这就是雪崩。一致性哈希和虚拟节点只能降低概率,不能彻底杜绝。

Q8. 一致性哈希希望满足的性质包括?

多选题 · easy

  • A.单调性← 正确答案
  • B.分散性← 正确答案
  • C.平衡性← 正确答案
  • D.强一致性

答案:ABC。单调性指节点变化时映射稳定;分散性指相同数据在不同视角下尽量落在一处;平衡性指数据尽量均匀分布。强一致性属于副本同步协议范畴,不是一致性哈希的性质。

Q9. 缓解哈希环偏斜的常用手段包括?

多选题 · mid

  • A.引入大量虚拟节点← 正确答案
  • B.按机器权重分配副本← 正确答案
  • C.适当增加物理节点← 正确答案
  • D.固定使用一个节点

答案:ABC。虚拟节点让节点沿环均匀铺开,权重分配让算力强的节点承担更多数据,增加物理节点也能降低单位节点的管辖区间。固定单节点会直接放大偏斜,显然是错误选项。

Q10. 关于一致性哈希的工程实践,下列说法正确的有?

多选题 · hard

  • A.缓存扩容时只迁移少量数据← 正确答案
  • B.有状态路由需要结合监控← 正确答案
  • C.分布式分片可按权重配置← 正确答案
  • D.强一致性由哈希环保证

答案:ABC。一致性哈希让缓存扩容只迁移约 1/N 数据;有状态路由仍需监控与限流防范雪崩;分片系统支持按节点算力配置虚拟节点权重。但强一致性必须靠 Raft、Quorum 等协议保证,哈希环不负责数据同步。