Consistent Hash
一致性 Hash
传统 hash 取模
实现分布式系统的负载均衡, e.g. idx := ihash(kv.Key) % nReduce
node_number = hash(key) % N # 其中 N 为节点数。
问题在于,当系统出现故障或是扩容导致集群节点数量N变化,映射规则的变化将造成分布式缓存系统之前的缓存失效,引发缓存雪崩
一致性 hash 算法
优点
- 可扩展:新增或删除节点,数据存储改动很小,不会影响系统
- 负载均衡:hash值平均分配到nodes
- 当部分虚拟节点含大量数据时,通过虚拟节点分裂,而不是重新hash,从而避免数据在虚拟节点分布不均衡
流程
- 将对象和虚拟服务器放到hash环
- 顺时针查找对象hash值距离最近的服务器,并让服务器缓存该对象
- 节点变化时,只有少部分对象需要重新分配服务器缓存
- 引入虚拟节点映射实际服务器,解决负载不均衡问题
缓存映射
增加节点
减少节点
引入虚拟节点
一致性hash实现
1 |
|
分布式系统数据分布算法
指标
- 均匀性:负载均衡
- 稳定性:在集群节点变化的情况下,算法结果依然稳定
- 性能可扩展性:集群规模扩大后,算法运行时间不会显著增加
- 节点异构:算法需要应对不同节点的性能/容量差异
- 隔离故障区域
演变
Hash
- 无稳定性
一致性Hash
- 解决了稳定性。但是集群节点数变化时,会负载不均匀
有负载上限的一致性Hash
- 实现了负载均衡,但是无法处理节点异构
有虚拟节点的一致性Hash
- 当实际节点变动时,会影响多个虚拟节点重新分配
分片
- 分片将Hash环切割成均匀分片,分配给不同节点。将分片作为最小的数据迁移单位,这样当有实际节点变动时,可以将分片交给任意节点
- BigTable就是将数据切割为分片,将分片信息存在Chubby中
Crush算法
- 分片算法,优化了分片映射的信息量,支持故障区域划分
cover
画师: ASK
id: 81648738
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 夏霞 🌸!