`
约巴拿
  • 浏览: 19028 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

对一致性哈希的理解

阅读更多

前提准备

什么是哈希算法?

       以我自己的理解,哈希算法就是运用哈希函数(即反映变量关系的数学公式)来解决事物之间对应关系的方法。

 

哈希算法产生的背景原因?

         举个例子来说。想象一下我们现在有100亿本书(分别标记为book0~book10^10-1),却只有1亿个柜子(分别标记为cupboard0~cupboard10^8-1)。现在要将这些书摆放到这些柜子上,很显然的是,如果每个柜子上只放一本书的话,就会有剩下的99亿本书还没摆放。因此,必然有一些柜子上摆放的书超过了一本,即一个柜子上有多本书,这就产生了在哈希算法中称为“冲突”的现象。显然,在这种书多柜少的情况下,冲突是不可避免的。我们要做的就是,将这些书合理的分配到各个柜子上,即规划好书本和柜子的对应关系(哪本书对应哪个柜子)。而这种规划就是所谓的哈希算法,找出书本和柜子的对应关系(用哈希函数来表示)。在这个例子中,我们比较容易想到的哈希算法就是:每个柜子放100本书,将book0~book99放到cupboard0中,将book100~book199放到cupboard1中,依次类推,刚好这100亿本书可以放到这1亿个柜子中。而这种对应关系用哈希函数来表示就是:柜子序号=书本序号/100 (求整运算),运用这种关系,我们很容易就能知道哪本书放在哪个柜子中,方便快速。

 

评价哈希算法的好坏

       当然上面这个例子的哈希函数看起来还是挺不错的,因为书本能比较均衡地放在各个柜子上。但将这个哈希函数改为:柜子序号=书本序号/10000,这样的话1个柜子上就摆放了10000本书,这样就只需要10^6个柜子就够了,还有10^8-10^6个柜子没有用到(相当于只用到了柜子资源的10^6/10^8=1%),这大大的浪费了柜子资源,使得书本资源过于集中在少数柜子资源上,增加了单个柜子的负载。因此一个良好的哈希函数要做到负载均衡。

 

一致性哈希

      经过上面的准备,下面就可以进入正题了。

什么是一致性哈希?

      其实也就是一种哈希算法,只是它着重考虑到了容错性和扩展性的一些问题。下面从它产生的背景来分析就会容易理解了。

 

一致性哈希产生的背景原因?

     就如上面举的关于书本和柜子的例子。互联网世界也存在类似的现象。只需将书本换为客户端(可以看作是我们的电脑或手机打开的网页浏览器),将柜子换为服务器(可以看作是web服务器)。数量和上面的例子一样,客户端是100亿,服务器端是1亿。实际上,客户端和服务器也是有标记的,那就是带有唯一性的IP号(类似于我们的身份证号码)。同样的,由于客户端多、服务器少,有的单个服务器肯定要服务于多个客户端。那么我们就需要一个哈希函数来分配他们之间的对应关系(哪个客户端去访问哪个服务器)。如果按照像上面例子一样的哈希函数(当然IPV4协议的IP号是由4个字节组成的,最多表示2^32个IP地址,对IP地址的使用也有相应的限制,不同于上面的例子,但这里只是用来帮助理解,所以也无妨),IP号为0的服务器对应于IP号为0~99的客户端,IP号为1的服务器对应于IP号为100~199的客户端,依次类推。

    现在容错性的问题来了。那么多服务器,总会有部分服务器由于各种原因崩溃掉,假设崩溃的是IP号为1的服务器,那么IP号为100~199的客户端将无法访问该服务器。更何况一亿台服务器,挂掉的肯定不止这么一两个,那么将会有许多用户将不能通过客户端访问到服务器。因此,怎样处理这些挂掉的服务器,怎样让这些不能连接上服务器的客户端能重新连上服务器就成了要解决的问题。这也就一致性哈希所强调的单调性。网上很多资料提到同一种方法,我也就简单的介绍一下这种方法。通过将客户端的IP号和服务器的IP号映射到同一个环形hash空间中,然后顺时针将客户端对应到相邻的服务器,如图所示:

                                      

                                 

客户端5将连接到顺时针与其相邻的服务器0,客户端155连接到服务器1,客户端370,350连接到服务器4。如果此时服务器0挂掉了,那么客户端将连接到下一个存活的服务器1。这样保证了整个系统的容错性。

     同样的,为了减轻单个服务器的负载或为了服务更多的客户端,需要添加服务器,假如添加一个服务器X,那么如图所示:

 

 

由于服务器的key值在服务器1和服务器4的key值之间,因此客户端350将连接到服务器X,其他的连接将保持不变。这保证了系统的扩展性。

推荐几个链接,写得图文并茂,容易理解:

http://blog.csdn.net/sparkliang/article/details/5279393

http://hi.baidu.com/ysuhy/item/84d095f198b06508d99e72cb

  • 大小: 20.2 KB
  • 大小: 20.9 KB
2
0
分享到:
评论

相关推荐

    算法, 数据结构, 多线程, 缓存, 分布式事务, 一致性协议, RPC等实现.zip

    算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序...

    nosql 入门教程

    4.5.1 一致性哈希 81 4.5.2 对象版本 82 4.5.3 闲话协议和提示移交 83 4.6 小结 83 第5章 执行CRUD操作 84 5.1 创建记录 84 5.1.1 在以文档为中心的数据库中创建记录 85 5.1.2 面向列数据库的创建操作 91 ...

    2023年Redis缓存面试题目汇总

    包括以下是常见的一些Redis...在分布式环境下,如何解决Redis的节点一致性问题? Redis的内存管理是如何进行的? 你如何监控Redis的性能? 在Redis中,如何进行大量的写操作? Redis的将来版本可能会增加什么样的功能?

    MySQL面试题含答案经典sql面试题

    可以保持数据的一致性。 数据更新的开销比较小。 支持复杂查询(带 where 子句的查询) 为什么选择 B+ 树: 哈希索引虽然能提供O(1)复杂度查询,但对范围查询和排序却无法很好的支持,最终会导致全表扫描。 B 树...

    leetcode详解-system-design-resources:包含系统设计材料,为系统设计面试做准备:triangular_flag::man_technologist::man_technologist::man_technologist:

    leetcode 详解面试准备的系统设计资源 动机:为什么我要制作这个存储库? As a beginner I wanted ...一致性哈希 - gitbooks 设计问题 设计微小的 URL 邮政 - 微小的 URL 和 Instagram 设计 讨论 由nlog

    Redis面试题50道(含答案)_.pdf

    39、支持一致性哈希的客户端有哪些? 40、Redis 与其他 key-value 存储有什么不同? 41、Redis 的内存占用情况怎么样? 42、都有哪些办法可以降低 Redis 的内存使用情况呢? 43、查看 Redis 使用情况及状态信息用...

    redis面试复习.xmind

    (这里对每个数据类型做了一些我个人能理解到的解释,包括实现的数据结构等) # redis持久化 ### 写了快照和命令行模式的优点缺点 (按道理的话本应该写上快照模式的自动和手动,save和bgsave等等,但是这里掌握的还不是很...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【算法】什么是一致性哈希?用来解决什么问题? 144 【性能优化】页面静态化 144 【设计模式】写一个单例(延迟加载,高性能) 144 【容器】Apache Http Server和Tomcat 区别 145 【版本控制】GIT与SVN的区别 146 【高...

    beauty of architecture

    一致哈希—分布式存储的基础算法 索引原理:布尔代数和搜索引擎的索引 MySQL索引背后的数据结构和算法原理 4.1.2 NoSQL 集群环境下关系型数据库扩展性的问题 数据模型与存储模型的矛盾 NoSQL的来源、主要特征和...

    ORACLE9i_优化设计与系统调整

    §10.3.2 相互产生运算的数字型字段长度和精度要一致 114 §10.3.2 不要为了节省空间而将字段的长度缩小或拆开 115 §10.4 将LOB类型的字段与其它的类型分开 115 §10.5 采用具有编码的设计方法 115 §10.6 建立公共...

    电子商务设计师真题06年和07年

    对数据一致性及数据库容量进行测试(2) C .对用户输入信息的显示是否按预期要求,如密码显示为‘ * ’等(3) D .是否能正确完整地保存注册信息(4) E .确保系统中没有孤立的页面存在 (5) F 【问题.检测用户...

    数据结构(C++)有关练习题

    从键盘输入数据,建立数据文件student.dat,然后,利用C++编程完成如下处理: (1)对学生姓名或学号进行查询,显示其信息 。 (2)对所有学生,按班级计算每一科平均成绩。 (3)分别按英语、数学、程序设计...

    mysql官方中文参考手册

    1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 1.5.5. MaxDB和MySQL之间的...

    MYSQL中文手册

    1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 1.5.5. MaxDB和...

    MySQL 5.1参考手册中文版

    1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 1.5.5. MaxDB和MySQL...

    MySQL 5.1参考手册 (中文版)

    1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 1.5.5. MaxDB和MySQL之间的...

    MySQL 5.1参考手册

    1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 1.5.5. MaxDB和MySQL之间的...

    MySQL 5.1中文手冊

    1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 1.5.5. MaxDB和MySQL之间的...

    MySQL5.1参考手册官方简体中文版

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....

Global site tag (gtag.js) - Google Analytics