一致性hash
2018-09-18 本文已影响9人
空即是色即是色即是空
问题
- 分布式存储的系统设计中,有一个问题一直困扰着我:
方式1. 集群中所有的机器,都存储完整的数据,然后所有的机器都可以提供完整服务;
方式2. 集群中的所有机器,都只存储数据的一部分,然后根据实际情况选择合适的机器进行服务。
- 问题1. 方式1中所有的机器中存储的数据如何保证一致性,意味着一台机器的数据被写入,其它机器也需要同步;
- 问题2. 方式2中有什么方式可以保证数据的一部分被分配到合适的机器,同时新增或者减少机器的话应当如何处理。
回答
- 今天的思考暂时回避问题1,这是一个庞大的题目。
- 问题2隐藏有两个基本的需求:a. 平衡性:数据被均匀地分配到不同的机器;b. 单调性:机器的增减应该对数据的分布影响较小。
首先,均匀分配这个需求,很容易联想到hash算法取模的方式:
pos = hash(obj) % N
由于hash算法的独特性,保证了取模的随机性;
然而又引出另一个问题,如果新增一台机器或者宕机一台,pos已经固定的obj,会因为N的变动受到影响
pos = hash(obj) % (N + 1)
pos = hash(obj) % (N - 1)
此时,一致性hash粉墨登场。
一致性哈希,使用一致性哈希环的数据结构,将obj于pos都分布在这个环上。
如果obj没有命中任何一个pos,则在环上顺时针寻找最近的一个pos。
这样做的效果,就会让新增或者减少机器时,只会影响到一台机器。
而如果算法中甚至做一些冗余的做法,会让影响降低到更小。