一致性hash算法初探

前戏

在大型项目中,由于如下场景的存在,导致了一致性hash算法的迅速崛起

  • 多机器节点定位问题
  • 分库分表后如何查询问题
  • 【其他可能的场景,欢迎补充】

发展历程

在讲述一致性hash算法之前,需要简单了解一下一致性hash的由来:

基于对n取余的Hash算法:【n 一般为机器数】

以负载均衡为例,如果采用 key % n 去定位我们的机器,但是这样会有一个问题, 当我们增加机器1台机器后,就会导致remap 现象发生,伪代码描述一下原因

1. 系统会维护一个key为hash值 value为机器节点的map
2. 正常情况会根据key % n  找到对应机的器节点
3. 如果此时添加一台机器 -> 那么所有原来映射的map 都将作废 而采用新的计算方式 key % n+1 该过程叫remap
4. 如果发生remap 那么原来机器的缓存 会因为这次remap 无法按照原来映射那样访问 造成缓存完全失效

一致性hash算法V1:

v1 :业界并没有这么叫,这是个人为了叙述方便,老粉懂的

考虑到机器数量的变更需求, 有人提出新的hash算法:采用key % 1<< 32 + 1 的方式映射key,这样就能形成一个hash环,机器就是环上的节点
但是有一个问题,大部分情况下我们的机器数量,不会有这么多,因此产生另外一个问题: 分布不均匀【任何一个ITBoy 都不能容忍无法优化的地方】,于是有了新的解决方安:


基于虚拟节点的一致性hash【Nice】

思路和v1大同小异, 只是通过KETAMA_HASH 和 虚拟节点 共同散列 目的就是为了分布均匀: 具体算法实现自行百度研究吧,下面是hash环的构建和查找流程图

以我公司的一个分库分表后的查询为例 讲述一下吧

在这里插入图片描述
在这里插入图片描述

我猜某路人会说: 图都画出来,难道不能把coding整出来吗
当然是可以滴,不过允许我运营一波: 评论数满三条 立刻更新coding

coding

等待你的评论。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值