vlambda博客
学习文章列表

余数hash与一致性hash

在分布式系统中,为了将数据均匀的分布到各个节点,保证节点之间的均衡,一般会通过hash的方式将数据分配的到各个节点。今天简单描述两种哈希方式:余数hash和一致性hash。

  • 余数哈希

余数哈希是一般通过对数值取模的方式来获得hash值,比如数据为367,有20个子节点,那么367会根据367%20=7,分配到编号为7的子节点。那么接下来的问题是实际处理的数据基本不是数值,所以需要根据业务场景自定义一个映射关系,将数据(基本)均匀的映射到某个数值空间。

优点:方法简单高效

缺点:容错性和扩展差,即面对节点个数变化(增加节点或者减少节点)时,不能够自适应的调节。

  • 一致性hash

一致性hash是将n个节点从逻辑上连成一个闭环,自定义一个映射f(x),将每个节点都会对应正数区间[0, +∞],同样也会有另外一个映射g(x),将待处理的数据映射到同样的区间。待处理数据被分配到顺时针方向和它最近的节点。如下图,g(待处理数据)会沿顺时针方向,找到和它最近的f(节点2),然后分配到第2个节点处理。

如果节点2出现异常,那么g(待处理数据)会顺延(顺时针防线)到和它最近的节点。

如果在节点2和节点3之间新增一个节点,那么原来落到节点2和3之间的数据,则会被新增节点分担。

这样一致性hash就解决了余数hash的容错性和兼容性差的问题。