Redis之集群原理及一致Hash算法
一、如何设计系统,能够从Redis服务器的海量数据中快速找到所需?
我们可以采用分片,按照Hash算法划分数据,分散存储在多个节点上。
但是会涉及到一个问题,如果某个节点失效,那么存储在节点上面的数据也将失效,并且新增定位到该节点的数据将无法存储,容错性很低,利用一致性Hash算法可以解决这个问题。
二、利用一致Hash算法来解决分片的问题
其原理模于某个数(例如2的32次方),将哈希值空间变成虚拟的圆环(哈希环):
选择节点的某些关键字(如主机名、主机IP)用哈希函数计算出哈希值,确定节点在哈希环上的位置:
将数据的Key进行相同Hash函数计算出哈希值,得到数据在环上的位置,然后沿环顺时针行走,遇到的第一个节点就是存储该数据的目标节点:
根据上面的运算,可以使数据分散存储到不同的节点上,一但某个节点宕机,虽然该节点上的数据仍会失效,但是新增的数据仍然可以沿顺时针保存在下一个节点上,实现最小化有损的提供服务。
(很多分布式系统都用到了一致性Hash算法,将请求经过哈希运算后,沿环顺时针交给不同的机器去处理)
三、Hash环的数据倾斜问题
当环上的节点很少时,容易因为节点分配不均匀,导致数据被集中缓存在同一个节点上:
为了解决这个问题,一致性Hash算法引入是虚拟节点,即为每一节点计算多个哈希值,都作为虚拟节点放置在环上:
我们需要做的只是将虚拟节点的数据映射到对应的真实节点上。
(该种做法是负载均衡算法中的一种,也可以实现将请求均衡的分布在服务器上)