一,什么是一致性哈希算法?什么是哈希槽?

什么是一致性哈希算法?

  1. 什么是一致性哈希算法?
  2. 0、一致性哈希算法主要用在分布式缓存中,用来解决请求数据与缓存服务器之间的映射关系;
  3. 1、把232次方的非负整数的值范围做成一个圆环;
  4. 2、对集群中的节点的某个属性求hash值,根据hash值,确定该节点在环上的位置;
  5. 3、对请求数据的keyhash值,确定该数据在环上对应的位置,然后按顺时针方向找离该数据最近的集群节点,则该请求数据就放在这个集群节点上(来进行处理)。
    一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hotspot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。

但现在一致性hash算法在分布式系统中也得到了广泛应用,研究过memcached缓存数据库的人都知道,memcached服务器端本身不提供分布式cache的一致性,而是由客户端来提供,具体在计算一致性hash时采用如下步骤:

    首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。

    然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。

    然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。



    从上图的状态中添加一台memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化而影响缓存的命中率,但ConsistentHashing中,只有在园(continuum)上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响,如下图所示:



    从redis3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。

其结构特点:

1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

2、节点的fail是通过集群中超过半数的节点检测失效时才生效。

3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster负责维护node<->slot<->value。

5、Redis集群预分好16384个桶,当需要在Redis集群中放置一个key-value时,根据CRC16(key)mod16384的值,决定将一个key放到哪个桶中。