一致性哈希算法的理解

从一个应用场景出发

  1. 众所周知,redis集群采用一致性哈希的方案实现对redis缓存服务器的组织和调用。
  2. 一致性哈希的核心概念就是哈希环,哈希环是通过许多节点串连起围成一个环。在这里哈希环上的节点是一个个的redis服务器,这些redis节点负责对请求进行处理,缓存数据或者查询数据。
  3. 为什么要使用一致性哈希?
    1. 传统的哈希算法,是需要通过对节点数目进行映射,确保请求一定会被映射到某一个节点上。当总节点数发生变化时,通过哈希函数时,哈希出来的值会发生变化,导致同一个请求被映射到不同的节点。在查询缓存的情节下,请求会被映射到一个新的redis服务器上,而不是之前已经缓存过数据的redis服务器上。
    2. 一致性HASH是通过固定节点数,和节点查找的方式实现的。首先设置节点数为232个(4294967296,42亿个节点),然后将redis服务器放在这些节点位置上来提供服务器(redis服务器远小于节点数,所以能确保redis集群的扩容有足够的空间放置)。这样redis服务器的增减都不会影响哈希函数值的变化。
    3. 因为redis服务器肯定不会把哈希轮中的节点位置填满,则被隐射到空节点位置的请求就需要在哈希环上顺时针查找不为空的节点,该节点处理请求。
    4. 当节点发生变化时,就需要重新映射数据。传统的哈希算法需要将所有的数据重新缓存,而一致性哈希只需要调整该节点前,到上一个非空节点之间的请求数据。

基本概念

  1. 哈希环: 虚拟出232 个节点位置,并串成的一个圆。
  2. 节点: 将节点的标识符哈希到环形空间上的一个位置,每个节点在环上占据一个位置。
  3. 数据分布: 将数据的键值哈希到环形空间上的一个位置,然后按照顺时针方向找到第一个节点,将数据存储在该节点上。
  4. 节点动态变化: 当节点动态变化时,只需要对受影响的数据进行重新哈希,将其映射到新的节点上即可,无需对整个数据集进行重新分配。
  5. 负载均衡: 由于节点在环上均匀分布,因此可以实现负载均衡,将数据均匀地分布在不同的节点上,避免单个节点的负载过高。
  6. 容错性: 由于节点在环上均匀分布,当某个节点发生故障时,只会影响其前一个节点到故障节点之间的数据,其他数据不会受到影响。
  7. 虚拟节点:使用虚拟节点可以增加节点数量,从而使得每个节点在哈希环上占据更多的位置。这样可以减少数据的倾斜程度,从而提高负载均衡性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝多芬也爱敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值