前戏
在大型项目中,由于如下场景的存在,导致了一致性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
等待你的评论。。。