- 读后感
逐字逐句看完《大型分布式网站架构设计与实践》第2章,意犹未尽!如标题所言,这是一本“真材实料的分布式资料”,它与我看过的分布式书籍(如《大型网站系统与Java中间件实践》)不同,本书重技术兼并理论,给了新人入手的方向。
我最最感动的是书中介绍了很多分布式的“干货”:分布式缓存可以用memcache、数据库水平/垂直拆分技术、分布式存储可以HBase/Redis等、消息通道可以用ActiveMQ、搜索引擎Lucene/Solr等。当然每一种技术都不是一本书能说完的,作者至少给了我们学习的方向,我很感动。
这只是第2章,后面还会有我很感兴趣的日志处理、数据仓库、负载均衡等,如果没有中奖,我也会去买一本学习。这是一本适合入门和进阶的书籍,有介绍分布式的理论,也同时介绍每种技术用到的具体实现方式,可以让我们少走弯路。
书中介绍了一致性hash算法(consistent hashing),我个人也非常佩服这个经典算法,所以后面对它进行一些介绍总结。
- 一致性算法
背景:所谓分布式缓存不是说每台服务器都存储所有的缓存,而是让每台服务器均分存储缓存。要实现服务器的均分及更新就要注意两点:①用什么算法去均分才能快速找到指定缓存;②当缓存出现新增、删除时如何将变化的缓存同步到对应服务器也是一个关键。
传统算法:最传统的算法是通过“缓存总数/服务器数量”的形式来均分,每一个缓存都有其唯一的Hash值(数字),要找到指定缓存在哪台服务器上可通过hash(key)%N取余的形式判断,这样基本能达到平衡。
传统的算法查找缓存运行模式如下图所示,当客户端需要某个缓存的时候,首先会向缓存索引(菱形结构)发出请求,此时索引器通过算法(hash(key)%N)取余的形式找到余数对应的缓存服务器并取得该缓存返回。
这种算法能达到缓存的第一个条件“用什么算法去均分才能快速找到指定缓存”,但是却在第二个条件上碰了壁“当缓存出现新增、删除时如何将变化的缓存同步到对应服务器”。假设server1突然宕机,该服务器上的所有缓存失效,这时又得重新平均计算缓存并且平均放到剩余的几台服务器上。重置缓存是需要花费时间的,这时如果有用户请求则无法取到缓存,取而代之的是从数据源读数据,一大波数据请求不断冲击服务器,很可能造成系统崩溃,这也就是所谓的“雪崩效应”。
一致性哈希(consistent hashing):一致性哈希算法在1997年由麻省理工学院提出,设计目标是为了解决因特网中的热点问题,目前在集群缓存应用中得到非常高的肯定。
下图所示为一致性哈希的理论原理。
>>首先要有一个首位相接的圆环,这个圆环大小是有科学依据的:一般一个缓存对象的hash值是32位的,那么理论上就可以存在2的32次方个(也就是从数字0~2的32次方-1)不同的哈希值,那么只需要将0和2的32次方-1首尾相连就成了一个数字圆环。
>>假设有9个缓存,这时将其进行hash计算成一个数字,再根据他们的哈希值放到圆环对应数字点位上,这样9个缓存就已经有自己位置(如下图粉色小圆点即是缓存哈希)。
>>假设有4台缓存服务器,我们也对服务器进行哈希计算生成32位数字,这时再将服务器放在圆环对应位置上(如下图淡蓝色圆圈)。这样就组成了缓存与缓存服务器的物理结构图。[顺便提一下服务器的hash计算,一般的方法可以使用机器的IP地址或者机器名作为hash输入。]
>>如何将缓存映射到对应服务器上呢?一致性哈希算法采用单向就近原则:在这个环形空间中,如果沿着顺时针方向从缓存哈希出发,直到遇见一个服务器Node,那么就将该对象存储在这个Node上,因为缓存哈希和服务器的hash值是固定的,因此这个缓存必然是唯一和确定的。这样就能很方便根据哈希值找到对应服务器下的缓存对象。
用这种方式只需要维护node的hash值即可找到对应缓存,非常快速方便。而且假设有一个node宕机,则只需要将它维护的缓存hash放入下一个Node中即可;假设有新缓存加入,则只需要根据其hash值找最近的Node即可,缓存变化影响非常小。这是模式满足了前面提到的分布式缓存第二点要求“当缓存出现新增、删除时如何将变化的缓存同步到对应服务器”。
当然,上面描绘的只是一种理想的情况,各个节点在环上分布得十分均匀。正常情况下,当节点数量较少时,节点的分布可能十分不均匀,从而导致数据访问的倾斜,大量的 key 被映射到同一台服务器上。为了避免这种情况的出现,可以引入虚拟节点机制,对每一个服务器节点都计算多个 Hash值,每一个Hash值都对应环上一个节点的位置,该节点称为虚拟节点,而key 的映射方式不变,只是多了一步从虚拟节点再映射到真实节点的过程。这样,如果虚拟节点的数量足够多,即使只有很少的实际节点,也能够使 key分布得相对均衡。
这就是一致性哈希算法的原理,理论非常合理,所以才会受到这么广泛的应用,希望能给大家有所帮助。
相关推荐
这本书“分布式系统-原理与范例”可能是深入理解这一主题的关键资源,尽管这里提供的信息是英文版且清晰度不高。然而,对于熟悉英文的专业人士来说,这仍然是一个有价值的学习材料。 分布式系统的原理主要包括以下...
本资料合集聚焦于分布式系统的架构设计,特别是通过《豆瓣技术架构》和《支付宝技术架构》这两个案例研究,揭示了如何在大型互联网公司中构建和优化这样的系统。 《豆瓣技术架构》展示了豆瓣如何应对海量用户和数据...
在这个"Java编程代码-分布式事务-源代码+讲义+资料"的压缩包中,我们可以期待深入学习关于分布式事务的理论与实践。 首先,分布式事务的核心目标是实现ACID(原子性、一致性、隔离性和持久性)特性,这是数据库事务...
通过以上各个方面的设计和实践,一个大型分布式电商系统架构能够逐步完善,适应不断变化的业务需求,为用户提供高效、稳定、安全的购物体验。在整个过程中,持续集成/持续部署(CI/CD)流程的建立也是必不可少的,它...
在IT行业中,分布式Java应用和电商项目的结合是现代企业级...通过深入学习这些内容,开发者不仅可以掌握大型分布式Java应用电商项目的开发技术,还能提升自己的架构设计能力,为成为一位优秀的架构师奠定坚实的基础。
【分布式IO-ADAM物联网全面感知解决方案】 ADAM物联网全面感知解决方案是亚当科技提出的一种分布式数据采集系统,旨在提供高效、智能的物联网(IoT)应用。自1992年以来,亚当科技不断创新,推出了多款ADAM系列产品,...
其次,“阿里巴巴中文站架构设计实践(何崚).pdf”可能涵盖了阿里巴巴中文网站的架构演进历程,从单体架构到分布式架构的转变。这可能包括负载均衡策略、缓存机制、数据一致性保障、容灾恢复方案等内容。通过这样的...
最后,《分布式实时处理系统 原理、架构与实现.pdf》则全面探讨了实时数据处理的原理和实践。这可能包括实时处理系统的架构设计,如批处理与流处理的区别,实时数据处理框架(如Spark Streaming、Flink)的工作机制...
《系统架构师考试材料2009-2017》是针对系统架构师资格认证考试的一份全面学习资源,涵盖了从2009年至2017年间的历年真题、教程及部分论文资料。这份压缩包对于备考者来说极具价值,因为它不仅提供了试题的回顾,还...
《RedSoft多层分布式架构实例源码》是一个深入探讨分布式系统设计与实现的宝贵资源,主要涉及软件/插件开发、编程语言应用以及分布式技术的实际运用。本源码集为开发者提供了一个完整的、多层的分布式架构示例,有助...
### 分布式光伏扶贫项目接网工程典型设计 #### 总论 分布式光伏扶贫项目接网工程典型设计是一项旨在通过光伏技术改善贫困地区能源供应的重要工程。该设计充分考虑了光伏扶贫项目的特殊性和地区特点,旨在为分布式...
2. **软件设计与开发方法**:包括面向对象设计、敏捷开发、统一建模语言(UML)、软件工程过程模型等,这些将帮助理解如何有效地设计和实施大型软件项目。 3. **系统分析与设计**:系统架构师需要具备强大的分析...
【标题】"毕业设计-分布式快递系统-crm前台(没弄).zip" 提供的是一个基于分布式架构的快递管理系统的前端部分,虽然CRM(客户关系管理)的前台部分未完成,但我们可以从这个主题中抽取一些关键的IT知识点。...
总而言之,此文档是关于移动通信领域分布式皮基站设计的重要技术资料,不仅涵盖了从2G到5G的技术演进,还包括了BBU、PRRU等关键组件的介绍,以及分布式基站架构的部署案例。此设计图方案应该是为专业人士提供参考的...
《高可用网站架构设计与实现》是一份深入探讨如何构建稳定、可靠且高效网站架构的综合资料。这份压缩包包含了详细的设计文档、开题报告以及相关的PPT演示文稿,旨在为IT专业人士提供一个全面的学习资源,同时也适用...
分布式驱动电动汽车的轮毂设计与优化是当前电动汽车技术发展的重点之一。本文针对分布式驱动电动汽车轮毂的设计与优化进行了详细的研究和分析,主要的知识点包括了以下几点: 1. 分布式驱动电动汽车的特点:分布式...
### Hadoop3.1.3安装与单机/伪分布式配置知识点详解 #### 一、实验目的和要求 - **掌握Hadoop3.1.3的安装与配置**:包括单机模式和伪分布式模式。 - **理解Hadoop的工作原理**:特别是其在不同模式下的运行机制。 ...
在讨论分布式轮边驱动中同步带传动的设计与研究时,需要重点掌握以下几个知识点: 1. 分布式轮边驱动的定义与特点:分布式轮边驱动系统是指驱动系统中的驱动力矩直接作用于车辆或机械系统的轮边,而不需要通过传统...
分布式系统架构设计与优化章节,通过案例分析深入探讨了分布式系统的顶层设计,以及分布式问题的设计考虑。内容涉及基础系统的划分、用户界面设计、性能问题解决、并发访问和日志处理的考虑。此外,业务拓扑领域对象...
本资源包包含了对大规模分布式存储系统的深入解析和实际架构案例,结合电商项目的实践视频,旨在帮助学习者理解和掌握这一领域的核心知识。 首先,我们从“Java基础入门到架构师”的部分开始,这部分内容涵盖了Java...