1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| 同样来自Google 要求映射均匀,尽量将节点变化时的映射变化降到最小,也就是避免全局重新映射
思路: 建立一个长度为M的节点查找表entry(Lookup Table),对k哈希取余,映射到表中的一个节点 i=hash(k)%M,节点为entry[i]
过程: 新建一张大小为M的空表entry作为查找表,再为每个节点生成一个偏好序列 每个节点轮流填充查找表,将偏好序列中的数字当做查找表的位置,将节点编号填充到目标位置 填充位置被占用,顺延到该序列编号的下一个填 后面我们会了解到偏好序列怎么产生 如,3个节点,查找表大小为7: 偏好序列 N0: 3,0,4,1,5,2,6 N1: 0,2,4,6,1,3,5 N2: 3,4,5,6,0,1,2 怎么填查找表entry呢 1.N0偏好序列为3,entry[3] = N0 2.N1偏好序列为0,entry[0] = N1 3.N2偏好序列为3,位置被占用,下一个偏好为4,entry[4] = N2 ---下面开始简写 4.N0,0->4->1,entry[1] = N0 5.N1,2,entry[2] = N1 6.N2,4->5,entry[5] = N2 7.N0,5->2->6,entry[6] = N0 8.查找表填充满了 entry: N1,N0,N1,N0,N2,N2,N0
偏好序列如何产生 使用两个无关的哈希函数h1,h2,对节点IP/主机名b做哈希 offset=h1(b)%M skip=h2(b)%(M-1)+1 依次计算出偏好序列permutation中的所有数字 permutation[j]=(offset + j*skip)%M
ps:(=-=学到这里我突然亿点点懵逼) 上面的论文提供的偏好序列已知的公式,怎么推出x,y 3 = x % 7 0 = (x +y) % 7 4 = (x + 2y) % 7 1 = (x + 3y) % 7 5 = (x + 4y) % 7 2 = (x + 5y) % 7 6 = (x + 6y) % 7
根据上面的知识,衍生出的问题,假如你生成的偏好序列,填充完了之后发现查找表还没填充满 有一个为空,咋办?填充一个占比小的,如果已经均匀分配则随机分配一个
增加删除节点 一样对应上面的偏好序列,然后重新分配一下,可以发现发生干扰的填充 增删操作必然会导致填充干扰,目的是将干扰降到最低 干扰: 查找表发生重新填充 联动干扰: 未删除或者原有节点之间产生的重新填充 如: N0,N1,N2删除N1,原先entry[0]是N0的被N2替换,则是联动干扰
|