一致性hash分片计算(一致性hash原理、hash环)

1.概述

hash环是1997年麻省理工创建的一种数学模型,基础是hash散列.可以将任意的内存对象(二进制)转化映射到0-2^32-1整数区间.称这个区间为hash环. 0-1=最大环整数, 最大环整数+1=0(通过加一和减一在可以到最大和最小,理解上感觉是一个环)

映射:利用某种计算关系,将两边的数据对应起来

一致性hash分片计算(一致性hash原理、hash环)

2. 一致性hash原理

2.1数据映射

读取的节点信息,和数据的key值都会在这个环找到对应的整数映射,而且节点信息不变,key值不变情况下整数映射结果不变

一致性hash分片计算(一致性hash原理、hash环)

2.2 数据key与节点对应关系

key值要找到对应处理这个key的节点,只需要在hash环上计算:顺时针寻找最近的节点整数

如下图,key1 顺时针寻找最近的节点就是10.9.160.137.6379(因为是顺时针寻找,所以一个key只能找到一个节点,保证了单调性)

一致性hash分片计算(一致性hash原理、hash环)

上述计算逻辑,确实可以保证key对应节点node后有单调性.他是算法的基础

节点信息和key值做映射---(给定一个key,可以指定要找那个节点处理)

2.3 扩容

当集群发生节点变化时,一致性hash能够尽可能的减小对单调性破坏范围

因为顺时针找,所以插入节点后,影响的部分是插入节点逆时针到下一个节点间的部分,如下图,当插入节点

10.9.160.137:9000 时受影响的部分是下图标记绿色的部分

一致性hash分片计算(一致性hash原理、hash环)

2.4数据的平衡性

一致性hash的计算,只使用真实节点信息,由于真实节点有限的,所以不能保证平衡性,引入了虚拟节点的概念

一致性hash分片计算(一致性hash原理、hash环)

当节点相互映射的整数挨的比较近,必定会有某些节点对应key值远远大于其他节点,造成严重的数据倾斜,所以需要解决这个问题,一致性hash计算逻辑中可以引入虚拟节点.

一致性hash分片计算(一致性hash原理、hash环)

 

jedis实现的一致性hash,通过计算一个节点的虚拟节点 160*weight, 调整权重值,实现比例的分配,默认weight=1