横向切分是为了解决单点失效问题 因此我们对表进行按列切分。
而这样切分的话会造成一个问题:
拓展的时候迁移数据会十分困难。假设我们之前有10台机器 现在多加一台,但是数据不变 我们这时候就要对表进行重新切分 大量数据需要进行不必要的迁移。而过多的数据迁移会造成问题:速度慢,服务器压力过大,可能造成数据的不一致性(cache and db)
为了解决大量数据不必要的迁移问题 我们提出了一致性哈希算法。
下面详细解释一下:
为什么叫一致性哈希算法?
首先 我们能想到的最简单的一种hash算法就是%n,但是当这种方法在n变成n+1的时候 %n和%n+1的结果就会出现很大差别 所以这种哈希算法叫不一致哈希。
那么怎么样才能叫一致性哈希算法呢?
1。 将key摸上一个很大的数 比如说360,将0-360分给n个机器 每个机器负责一段区间
2. 将这个区间分配信息表存在web server上
3. 新加入一台机器的时候 在表中选择一个位置插入 匀走两台机器的一部分数据,这样的话 每台机器就只有一部分被匀走。就像下图所示:
但是这种简单的一致性哈希算法有明显的缺陷,正如在图中看到的一样 数据分布会很不均匀,然后迁移压力过大(因为新的机器只从两台老机器中获取 导致这两台老机器负载过大)
那么优化版本的如下图所示: