这是我参与【第五届青训营】伴学笔记创作活动的第十天
1.一致性哈希
- 平衡性:哈希的结果能够尽可能分步到所有的缓冲中
- 单调性:新的缓冲加入系统中时,哈希的结果应该保证原有已分配的内容能够映射到原有的或者新的缓冲中。x->(ax+b)mod P不能满足单调性的要求,当P发生变化时,原本所有的哈希结果都会发生变化。
- 分散性:在不同终端上,缓冲范围可能不一样,从而导致哈希的结果不一致,导致了相同内容被映射到不同缓冲中去。分散性就是该情况发生的严重程度。
- 负载:对于一个特定的缓冲区,可能会被不同的用户映射为不同的内容,这种情况也是应该避免的,好的哈希算法应该能够尽量降低缓冲的负荷。
举例说明:
假设有一个分布式Web缓存系统,那么其数据缓存的算法有2种:
- hash模余算法:此方法简单,数据的分散性也很好。但是当添加或者移除服务器时,缓存重组的代价很大。
- 一致性哈希: 1)首先求出每个服务节点的hash,并将其配置到一个0~232的圆环(continuum)区间上。 2)其次使用同样的方法求出所需要存储的key的hash,也将其配置到这个圆环(continuum)上。 3)然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务节点上。如果超过232仍然找不到服务节点,就会保存到第一个服务节点上。
2.分布式哈希表思想(DHT)
- 将内容索引抽象为<K,V>对:K是内容关键字的Hash摘要,V是存放内容的实际位置
- 把所有的<K,V>对组成一个大的Hash表
- 每个节点随机生成一个表示ID,把Hash表分割成为很多小块,按特定规则(即K和节点ID之间的映射关系)分步到网络中去。
- 给定查询内容的K值,可以根据K和节点ID之间的映射关系在重叠网络找到相应的V值。
3.Chord
如何在P2P网络中找到存有特定数据的节点???
1. 哈希算法:Chord使用一致性哈希作为哈希算法。在一致性哈希协议中没有规定具体的算法,在Chord协议中将其规定为SHA-1
2. 路由算法:经过Chord的优化后,查询需要的跳数由O(n)减少到O(log N)。
基本原理:
- 采用环形拓扑(Chord环)
- 应用程序接口: Insert(K, V):将<K, V>对存放到节点ID为Successor(K)上 Lookup(K):根据K查询相应的V Update(K, new_V):根据K更新相应的V Join(NID):节点加入 Leave():节点主动退出
Hash表分布规则
- Hash节点IP地址->m位节点ID(表示为NID)
- Hash内容关键字->m位K(表示为KID)
- 节点按ID从小到大顺序排列在一个逻辑环上
- <K, V>存储在后继节点上
- Successor (K):从K开始顺时针方向距离K最近的节点
Chord:简单查询过程
- 每个节点仅维护其后继节点ID、IP地址等信息
- 查询消息通过后继节点指针在圆环上传递
- 直到查询消息中包含的K落在某节点ID和它的后继节点ID之间
- 速度太慢 O(N),N为网络中节点数