“这些稳定性结论不要求分数随机。随机性用于分析每个节点赢多少次,确定的全序则足以证明增删不会扰乱幸存者的名次。这也是它与环后继放置的共同目标:一个靠固定圆上顺序,一个为每把键保存隐含的节点排名。”
形式陈述
成员改变时,先固定不该改变的部分
把每把键放到哪台服务器,可以写成依赖成员集合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。映射计算完全正确,服务却还没有完成交接。
资源端代际隔离约束旧持有者还能否写,反熵或日志追赶负责补数据,法定人数约束哪些确认足以完成操作。这些协议并不包含在一个环公式中。放置与查找终点因此同时提交新旧映射差集和“新目标仍为空”的反例,不把改配置当成已经迁移成功。
参考资料
- Stoica等,Chord: A Scalable Peer-to-peer Lookup Protocol for Internet Applications,2003作者稿,§IV.B,PDF pp.3–4:顺时针后继、成员变化与虚拟节点。本文不沿用该论文的具体SHA-1选择或动态维护保证,只使用放置对象与明确的理想随机模型。
- Karger等,Consistent Hashing and Random Trees,STOC1997,§§4.1–4.4,PDF pp.6–8:成员视图、单调性、多个随机位置与稳定排列。原文§4.2为单位区间最近点构造;32位置首后继例、实际计数和配置失败例为本文重算。