Skip to content

算法Algorithm

一致性哈希环

Consistent hashing · Consistent hash ring · 一致性散列

用固定环坐标的顺时针后继选择负责节点,证明成员增删的局部迁移,复算虚拟节点、随机期望与热点边界。

形式陈述 ​

成员改变时,先固定不该改变的部分 ​

把每把键放到哪台服务器,可以写成依赖成员集合V的函数f_V(k)。如果简单使用h(k) mod N,N从4改成5时,同一键的余数会整体变化。我们希望加入一个节点时,旧节点之间不要互相交换无关的键;移除一个节点时,只重新安置原本归它的键。

本页采用顺时针后继环构造。固定整数空间0,…,M−1,M≥2;每个逻辑token有固定坐标、唯一身份和物理owner。配置包含至少一个token,坐标互异且不随其它成员加入而重算。键的坐标h(k)也固定。按坐标递增找第一个不小于h(k)的token;若没有,就绕回最小坐标。返回该token的物理owner。[1, §IV.B]

所以坐标t的token负责环区间(pred(t),t]。左端不含、右端包含:键坐标恰等于t时归t。一个token独占全环;空成员集没有可返回owner,应明确拒绝。教学核验器对重复token坐标报错,不能靠输入列表顺序暗中决定碰撞赢家。

键坐标相同不等于键相同。两把不同键可以同落一台机器,仍须保留完整键身份,用旧字典接口区分记录;这里只计算负责位置,没有实施节点内查找或值更新。

直觉

加入只切下一段,离开只交出原来的段 ​

设新token x插在旧相邻token p、s之间。原来(p,s]全部归s;插入后分成(p,x]归x、(x,s]仍归s。其它相邻边界未变,因此其它键的token不变。移除x则是反向操作:原本(p,x]的键交给s,其余不动。

这个证明完全是有序区间事实,不需要先假设散列均匀。均匀性决定各段大致多长、多少键落入;稳定边界决定哪些键有资格改变。两个保证不能相互代替。

“一致性”在这里指放置对成员变化的稳定性,不是复制数据库的线性一致性。Karger等给出了更一般的成员视图与单调映射框架;其原始最近点构造和这里的顺时针首后继是不同具体规则,不能交换端点后仍沿用同一份区间表。[2, §§4.1–4.4]

环上九个位置,不等于九份相同负载 ​

如果一台机器负责9个坐标,另一台负责7个,前者不一定有更多真实键。即使键数相同,键的字节数、访问次数或计算开销也可能不同。放置规则先回答归属,负载报告必须另外说明计量的是坐标长度、键数、字节还是请求服务。

例子与边界

32个位置的加入与删除 ​

令M=32,每个坐标恰放一把不同的键。初始token是A@1、B@8、C@16、D@24。

物理节点 负责键坐标 数量
A 25,…,31、0、1 9
B 2,…,8 7
C 9,…,16 8
D 17,…,24 8

加入E@12,只有9、10、11、12从C转E。新数量A9、B7、E4、C4、D8,改变4/32。随后删除B@8,键2,…,8交给它的新后继E@12;新数量A9、E11、C4、D8。第二次只改变B原来的7把键,没有让C、D的键互换。

如果加入E时还顺手把A/B/C/D重新编号或换散列种子,旧边界也全部改变,刚才的局部迁移证明就不再适用。改变token数、身份编码和空间位宽,同样应作为新的配置变更审计。

虚拟节点是多段归属,不是复制品 ​

一个物理节点可以拥有多个token。独立初始化如下布局:A@1/17、C@5/21、B@9/25、D@13/29。八段各长4,每台两段,所以四台各负责8个位置。这里的“虚拟节点”只是多个逻辑坐标指向同一物理机器,机器坏掉时它的所有token一起不可用。

若从token后继列表中取前三个作为三副本,却有两个token同属A,得到的物理故障冗余最多只有两台。要取r个不同物理owner,就须扫描并跳过已出现owner;若机器数不足r,应报告不足,而不是把重复token计成新副本。机架、供电域等还需要额外约束。

这份均匀布局是可复算例子,不保证任意虚拟坐标都均衡。更不能把现网的四token换成这八个后仍声称只搬新增节点的键,因为多个旧token也被改动了。若某一个键占总请求的90%,增加它所在机器的其它token不会把这把键自动拆给多台机器。

推论与应用

随机模型下的期望,应写清对什么取平均 ​

在理想模型中,让N个命名token坐标独立均匀落在连续圆上,键坐标与它们独立;坐标相等的概率为0。对一把固定键,节点标签交换对称,且恰有一个后继,所以每个节点成为owner的概率为1/N。

再加入一个同分布、独立的新token。新旧N+1个标签仍对称,只有新节点获胜时键才迁移,因此每键迁移概率为1/(N+1)。对K把固定键,用期望的线性性相加,迁移键数期望为K/(N+1);这里不要求不同键的迁移事件独立。

这个平均同时涉及新旧随机坐标。已经固定了某条很不均匀的旧环后,不能只对新位置取平均就无条件套1/(N+1)。主例实际4/32也不必等于1/5。为每台分配v个同分布token时,理想期望份额按其token数占总数的比例相加;一次部署的实际偏差、键大小与热度仍需单独计算。[1, §IV.B;2, §4]

查询和配置更新各有账单 ​

把V个token的坐标存在有序数组,使用二分查找的lower bound求第一个坐标≥h(k),末尾则回0。单次查找O(1+log V)比较,另计读取键和求h的成本;数组占O(V)状态。初始化排序O(V(1+log V)),在普通数组插入/删除一个token需要移动O(V)项,不能把二分定位的对数界当成整个配置更新成本。

为K把已有键出完整迁移清单,简单核验器分别计算旧、新owner,需O(K(1+log V_old+log V_new))查询工作和O(K)输出上界。真实数据搬运还要按字节、网络和持久化收费;如果已有按环区间组织的索引,可以只枚举受影响区间,但索引本身也须维护。

位置已改变,数据可能还没有到达 ​

设C原存键10的值v10。公布含E@12的新配置后,函数立刻把10映到E;若E尚未复制任何记录,读取E仍得不到v10。映射计算完全正确,服务却还没有完成交接。

资源端代际隔离约束旧持有者还能否写,反熵或日志追赶负责补数据,法定人数约束哪些确认足以完成操作。这些协议并不包含在一个环公式中。放置与查找终点因此同时提交新旧映射差集和“新目标仍为空”的反例,不把改配置当成已经迁移成功。

参考资料
  1. Stoica等,Chord: A Scalable Peer-to-peer Lookup Protocol for Internet Applications,2003作者稿,§IV.B,PDF pp.3–4:顺时针后继、成员变化与虚拟节点。本文不沿用该论文的具体SHA-1选择或动态维护保证,只使用放置对象与明确的理想随机模型。
  2. Karger等,Consistent Hashing and Random Trees,STOC1997,§§4.1–4.4,PDF pp.6–8:成员视图、单调性、多个随机位置与稳定排列。原文§4.2为单位区间最近点构造;32位置首后继例、实际计数和配置失败例为本文重算。
关系图谱7 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系