数据量太大,不可能做被一个数据包进行计算,所以对数据进行分片
1.分片在不同机器上
2.为了高可用性需要多副本
所以需要机器以及数据路由
一致性哈希(chord是一其中种方式)
chord
每个节点使用拉链的方法(路由表),存储接下来的第2^i个节点。使得每个节点的查询复杂度均为O(lg n)。
是一个双向拉链
新增节点:
(1)找到新节点的位置
(2)将新节点插入,并且更改前驱后继
(3)将后继节点部分数据转移到新节点
但是对于高并发应用,2,3均可能出现问题,引入稳定性检测
(1)找到新节点的位置,更新新插入节点的后继
稳定性检测
(2)若Ns是Nn的后继,则直接插入并转5
(3)若Ns不是Nn的后继,Nn记Ns的pre,Nx为自己的后继
(4)若Nx的pre为空或Nc在Nx及其pre之间则Nx的前驱记为Nc。否则Nx的pre记为Nc的next,继续4。
(5)Nx转移数据到Nc
离开节点
若是正常离开则通知前驱(?)以及后继进行稳定性检测
异常离开使用副本形式保证一致性
虚拟节点
由于
1.节点随机可能导致负载不均
2.机器性能不同,负载在逻辑上却是相同的
引入虚拟节点,将一个物理节点虚拟化为多(不同)个逻辑节点
总结
引入哈希空间作为解耦合层,使得资源与机器解耦合