Skip to content

交付键放置与查找的迁移证书 ​

键放置与分布式查找路线最后交付三份可重算记录:环上哪些键改变owner、稳定评分哪些排名改变、局部指表如何找到全局定义的owner。下载标准库核验器,普通和python -O都执行显式检查,只把JSON写到标准输出。

一、先声明配置身份 ​

把空间固定为0,…,31,每个坐标放一把身份不同的键。所有节点使用同一份键坐标、token坐标、owner映射、破同值规则与配置版本。这里的键坐标是测试输入,不用运行一次不可重放的随机散列来代替手算表。

配置改变时,旧token和键坐标保留。跨配置比较的是物理owner:两个不同token可以指向同一机器,不能只因token编号变化就把它记成跨机器搬迁。空配置、重复token坐标、重复成员身份分别明确拒绝。

二、提交环的两个精确差集 ​

初始A@1、B@8、C@16、D@24。每个坐标归顺时针第一个不小于它的token;超末尾绕回1。

配置 A的键 B的键 C的键 D的键 E的键
初始 25,…,31、0、1 2,…,8 9,…,16 17,…,24 无成员E
加入E@12 不变 不变 13,…,16 不变 9,…,12
随后删除B@8 不变 无成员B 不变 不变 2,…,12

数量依次是(9,7,8,8)、(9,7,4,8,4)、(9,0,4,8,11),每行总数32。第一次差集只有9、10、11、12,旧owner全为C,新owner全为E。第二次差集只有2,…,8,旧owner全为B,新owner全为E。

请给出两个范围证明:加入只把旧(8,16]分成(8,12]与(12,16];删除B只把它原(1,8]交给后继E。含右端的约定使键12归E、键16仍归C;环首尾使键31归A。若这些边界对不上,不应靠调整数量总和掩盖错误。

第一份实际迁移率4/32不是1/5。后者来自新旧随机token共同取期望的理想模型,不要求任何固定32位置配置都恰好达到。请再选择一处不同空位加入E,观察移动区间大小变化,同时保持“没有旧节点之间互换键”的确定性性质。

三、虚拟节点与尚未完成的数据交接 ​

另从空系统初始化八个token:A@1/17、C@5/21、B@9/25、D@13/29。八个负责段各含4个坐标,四台机器各8把键。这里没有声称可以把上节现网旧坐标随意改成新表而免搬迁。

把某一把键的请求量设成1000次,其余31把各1次。总计1031次,即使每台仍8把键,热点owner至少承担1000次。报告必须把键数与请求量分列;添加其它token不会自动拆开一把热键。

再执行一个故意未完成的交接:C仍存键10的值v10,公布E@12之后E的存储仍空。放置函数返回E正确,但E没有v10。记录这个反例,说明迁移清单只告诉系统需要搬哪些数据,没有证明数据已落盘、旧写已隔离或新配置已经安全对外生效。

若选三个后继token做候选副本,先投影到物理owner去重;同一机器的两个token不能当作两次独立故障容忍。机架、供电域和实际复制确认留给相应协议合同。

四、按稳定分数重算HRW ​

固定下面评分,分数高者优先,并列节点名A<B<C<D<E。旧成员为A/B/C/D。

键 A B C D 加入E的分数
alpha 90 20 70 40 75
beta 30 80 60 20 81
gamma 10 50 95 40 10
delta 70 60 20 85 90
epsilon 40 30 60 55 59
zeta 65 65 10 50 65

旧owner依次A、B、C、D、C、A。加入E后变A、E、C、E、C、A,所以只有beta、delta迁移。zeta的A/B/E同为65,既定全序仍取A;把输入成员列表倒序,结果必须不变。

独立回到旧四成员,再删除C。owner变A、B、B、D、D、A,只有gamma和epsilon改变。逐键提交完整排名再取top-2,例如alpha原为A/C,删C后A/D:主owner未变不代表候选副本集未变。

迁移性质只要求所有幸存节点的相对评分和破同值次序保持。请制造一个错误版本:加入E后用新成员总数重新计算全部分数,或者用成员列表下标作身份。此时可能出现原A的键转投旧B,已不受HRW稳定性证明保护。

概率报告另外写前提:独立同分布连续分数使新节点成为第一名的概率为1/(N+1),进入top-r概率为r/(N+1)。固定六键表是精确例子,不是验证随机函数独立性的统计证据。容量2:1也不能直接比较2U_A与U_B来实现,因为这会给A获胜概率3/4,而非2/3。

五、从局部指表求同一个后继 ​

换到仍为32位置、成员1/4/8/14/21/28的稳定环。每节点保存自己的严格后继,以及五项finger[i]=successorKey(u+2^i mod32)。完整表见Chord页和JSON的network字段;查找核心不读取全表来代替转交。

提交以下五次执行:

起点 键 实际处理节点 返回owner
4 31 4→21→28 1
1 27 1→21 28
28 0 28 1
14 14 14 14
8 3 8→28→1 4

每次转交都保存当前successor、候选finger、顺时针距离、是否落在开区间(u,k)以及选中者。最终返回还须核key属于(u,successor],或恰等于当前节点。成员1在第一行只是返回的身份,不需要为回答“谁负责”额外处理一次查询;真正取值另发请求。

第一行目标前驱p=28,到p的距离从δ(4,28)=24变δ(21,28)=7,再变0。它说明完整指表的前驱距离减半。另取成员0/1/16,从0查15,第一跳只能去1,到key距离从15变14,没有减半;到前驱1的距离则从1变0。两种距离不能混用。

六、分别验三个失败或降级出口 ​

  1. 成员和successor都正确,只保留每节点一个successor指针。从4查31走4→8→14→21→28,仍返回1。答案正确,但完整指表的O(m)证明不再适用,最坏可能走O(N)成员
  2. 仍有成员1,却把28的successor设为4。从28查0会错误返回4。这个例子违反正确后继前提,说明终止区间错误不能由“每步向前”修复
  3. 完整指表中,从4向21转交时地址不可达,返回UNKNOWN并保存已处理的4;限制预算只有一步也返回UNKNOWN。超时和预算不足都不是“已经查到另一个owner”

静态查找不包含join、stabilize或失效修复。原Chord维护规格的后续纠错说明一般动态保证必须另证;本任务没有实现一套自动修复所有成员变化的协议。

七、核成本与迁移后的新结果 ​

区分三种计数:环全表二分是O(1+log V)查找,但数组配置更新可能O(V);HRW单owner可扫描O(N),本附件为了保存完整排名实际排序O(N(1+log N));Chord完整指表为O(m)转交、每跳扫描m项,因此本地总工作O(m²)。初始化标准指表、故障地址集合、全候选日志和穷举oracle均另计。

核验器为小M枚举每个坐标以报告物理份额,需M次环查找;这不是在大空间中常数时间计算全部真实键数的算法。完整迁移清单也需遍历给定键集,真正网络搬运再按字节收费。

最终保留输入配置版本、旧新owner、迁移差集、HRW完整排名、五份局部查询轨迹、降级轨迹、错误successor及两份UNKNOWN。改变一个token坐标或一个节点分数后,重新计算实际结果;只保留原期望公式,不能替代迁移验收。