zoukankan      html  css  js  c++  java
  • 十分钟了解什么是一致性哈希

    一致性哈希解决什么问题?
    传统哈希算法在桶位数量变更时,需要对所有桶位的数据重新计算哈希,绝大部分数据都要迁移,在分布式环境中,这个扩容和缩容的代价是非常大的,需要有一种算法尽可能减少这个迁移的数据量。

    为了解决这个问题,一致性hash它来了

    什么是一致性哈希
    一致性哈希和传统哈希一样使用取模运算,区别在于传统哈希是对节点数量进行取模,一致性哈希是对2 ^ 32进行取模,将0 - 2 ^ 32这个范围的值组成了一个虚拟圆环。一共可容纳2 ^ 32个节点。

    将主机名进行一致性哈希函数c-hash()计算,就可以确定主机在圆环上的位置。

    一致性哈希对于key的读写寻址有两步
    1.将key进行c-hash(key)计算,确定在圆环上的位置。
    2.然后顺时针方向找到这个位置后的第一个主机节点,从这个节点进行put或get

    缩容/故障,导致节点数减少时,一致性hash是怎么处理的呢?

    扩容的时候是如何处理的?

    一致性哈希的圆环节点越多,分布越均衡,就越不容易出现负载不均。当节点较少时出现数据不均衡的问题怎么办?

    如图

    可以将物理节点映射成多个虚拟节点,均匀分布到圆环,指向NodeA开头虚拟节点的数据,最终都会访问物理节点NodeA。

    总结:

    1.传统哈希算法在新增桶位/节点时,节点越多,需要迁移的数据量就越大。

    2.一致性哈希算法解决了传统哈希算法扩容缩容时需要迁移大量数据的问题。

    3.一致性哈希算法中的哈希环,节点数越多,扩容缩容时需要迁移的数据量就越少,而且负载越均衡。

  • 相关阅读:
    [软件工程基础]第 1 次个人作业
    [软件工程基础]个人项目 数独
    [2017BUAA软件工程]第0次个人作业
    [2017BUAA软工]第零次作业
    NoSQL-流式数据处理与Spark
    C、JAVA存储管理不同点
    数据库之一窥数据库系统
    Java单元测试-覆盖率分析报告自动生成
    Java单元测试-快速上手Junit(进阶)
    Java单元测试-快速上手Junit
  • 原文地址:https://www.cnblogs.com/powerjiajun/p/13910825.html
Copyright © 2011-2022 走看看