“跨服务器选择负责位置时,一致性哈希环固定token边界,使加入只切分一段、删除只移交原负责段;Rendezvous哈希则为每把键给节点稳定排名,成员变化不改变幸存节点之间的相对次序。两者解决…”
形式陈述
每把键有自己的节点排名
给定非空有限节点集合V、键k和固定评分函数s(k,v)。函数只使用键、稳定节点身份和固定参数,不读取当前成员总数或当前节点在列表中的下标。Rendezvous hashing又称HRW:选择评分最大的节点作为owner。[1, §IV.A]
评分相等时,用所有参与者都认可的稳定节点全序破同值。本页约定节点名较小者优先,即比较(-score,节点名)的最小值。这样每把键对所有候选节点都有唯一排名;给定成员V,就取排名中第一个属于V的节点。
若要r个候选位置,可以取前r个不同节点,0≤r≤|V|;主owner是r≥1时的第一个。r超过节点数是输入错误。这里的节点身份必须指实际需要区分的故障单位,不把同一机器的多个别名默认为独立副本。
直觉
新节点只能自己赢,不能替两个旧节点换名次
从V加入x时,所有旧节点的分数与破同值键都不变,所以旧节点的相对顺序不变。若x排在旧赢家之后,赢家保持;若x排在之前,赢家改成x。不存在“加入x,却让原来A的键改投旧节点B”的第三种情况。
删除x时,原赢家不是x的键保持原赢家;原赢家是x的键改投排名中下一个仍在集合的节点。对top-r列表,同样是删除旧排名中的缺席者、补入下一名;加入者进入前r时,只会挤掉此前前r中的末位。
这些稳定性结论不要求分数随机。随机性用于分析每个节点赢多少次,确定的全序则足以证明增删不会扰乱幸存者的名次。这也是它与环后继放置的共同目标:一个靠固定圆上顺序,一个为每把键保存隐含的节点排名。
排名可重算,不一定要存全表
只求一个owner时,扫描全部N个节点、保存目前最佳者即可,无需完整排序。只有要输出整份候选次序时,才必须生成长度N的排名。
两个客户端只要成员、编码、参数、分数与破同值规则相同,就能各自在本地算出同一结果。这里没有交换投票消息,也没有让不一致的成员视图自行达成共识。
例子与边界
六把键与一个并列
下面是供复算的固定评分表,不假装它来自随机实验。
| 键 | A | B | C | D | 旧owner | 新节点E的分数 |
|---|---|---|---|---|---|---|
| alpha | 90 | 20 | 70 | 40 | A | 75 |
| beta | 30 | 80 | 60 | 20 | B | 81 |
| gamma | 10 | 50 | 95 | 40 | C | 10 |
| delta | 70 | 60 | 20 | 85 | D | 90 |
| epsilon | 40 | 30 | 60 | 55 | C | 59 |
| zeta | 65 | 65 | 10 | 50 | A | 65 |
加入E后,只有beta从B移E、delta从D移E,迁移2/6;其余四把不动。zeta有A、B、E三方65,固定A<B<E使它仍归A。若各客户端用“输入列表里先出现者”破同值,把相同集合按不同次序传入就会算出不同owner。
独立从旧四成员删除C,gamma转B、epsilon转D,其余不动。alpha原前两名是A/C,删除C后变A/D;它的主owner不变,但候选副本列表确实改变。
编码和成员都是输入合同
若直接拼接键与节点字符串,("ab","c")和("a","bc")都会变成"abc",评分输入已无法区分。实际编码应保留字段边界,例如明确长度或无歧义元组编码;相同字节规则必须由所有参与者共享。
对zeta,即使评分表相同,客户端一侧认为成员为{A,B,D},另一侧认为是{B,D},前者返回A、后者返回B。两次本地计算都符合自己的输入。网络分区可能让成员知识分歧,哈希排名不能把这种分歧变成新的独占授权。
把分数乘容量,不自动按容量分流
令U_A、U_B独立且均匀分布于(0,1)。如果容量2:1就比较2U_A与U_B,A获胜概率是
并非目标2/3。可以设计有严格比例证明的加权排名,但那需要另一个评分分布合同;不能只因为原始方法叫“weight”就把任意分数倍乘当成容量份额定理。本页实现等容量稳定评分,不承担一个未经定义的加权变体。
推论与应用
期望搬迁比例与实际表不同
对一把固定键,若N个节点分数独立、同分布且连续,则每个节点以1/N概率成为唯一最大者。更一般地,只要联合分布在节点身份置换下对称且没有并列,赢家对称性就已足够;独立同分布是一个容易检查的充分模型。
加入第N+1个同分布独立分数后,它成为最大者概率1/(N+1)。固定K把键,借期望线性性得到迁移键数期望K/(N+1)。若问候选top-r集合会否变化,条件是新节点进入前r,概率为r/(N+1);主owner改变与副本候选集合改变不能共用同一比例。
固定有限散列分数会有并列;确定的节点名破同值保证重放和单调性,却可能带来小概率的身份偏向。独立连续模型的精确1/N不能不加说明地称为任意有限评分函数的精确性质。键热度若极不均匀,均衡键数也不保证均衡请求服务。[1, §§V.B–V.D]
明确实现保存多少排名
若评分求值和节点名比较为单位成本,单owner扫描需O(N)时间、O(1)额外工作空间;成员列表本身占O(N)。输出全排名需O(N(1+log N))比较和O(N)输出空间。下载器为展示top-r与删除后的后继,采用完整排序;不能把它整段报告成单owner的线性扫描界。
对K把键对照一次成员变更,若旧赢家及其分数已经缓存,加入一个新节点只需每键计算一次新分数并比较。但删除恰为赢家的节点时,若未保存后续排名,就仍需扫描剩余成员;缓存省的是已经保有的证据,不是让所需信息自动出现。[1, §V.A]
候选副本尚未构成读写协议
top-r只列出r个位置,不保证它们已经存有相同版本,也没有指定写入等几个确认、读取如何防倒退。还要分别定义放置配置的有效代际、复制/修复规则以及读写确认集合。
放置与查找终点要求同时交全排名和变化原因:哪把键的新赢家是新增者、哪把键的旧赢家已删除,以及哪些只有候选列表改变。只比较最终各节点键数,会漏掉不必要的旧节点之间搬迁。
参考资料
- David G. Thaler、Chinya V. Ravishankar,Using Name-Based Mappings to Increase Hit Rates,IEEE/ACM Transactions on Networking6(1),1998,§IV.A与§V.A/D,pp.6–7:稳定评分排名、加入/删除和缓存排名;§V.B另有负载假设。本文的有限分数并列、六键表与2U的概率反例自行展开,不把简单分数倍乘当作严格容量比例结论。