分布式计算课程
3. 分布式系统模型问题
概述
1. RPC概念,RPC中间件如何起作用
- RPC概念
- 使应用程序可以像调用本地节点上的过程(子程序)那样去调用一个远程节点上的子程序。
- RPC将面向过程的通用编程模型扩展到了分布式环境。
- 实现了跨进程、跨语言、跨网络、跨平台的过程调用
- 强化了面向接口编程的编程风格
- 实现RPC必须要有RPC中间件的支持。
- RPC中间件如何起作用·
- 在调用者进程中植入stub/proxy模块,stub 模块作为远程过程的本地代理,并且暴露与远程过程相同的接口。
- 在被调用者进程中植入skeleton模块, skeleton作为调用者在远程主机中的代理,代替客户端调用 本地方法,并把结果返回给客户端。
- skeleton模块相当于Client-Server通信模式中的服务器端, 要先于客户端运行,并且在某个Socket端口进行监听。
2. 什么时候使用消息队列,有什么好处?
消息队列通信模式:
— 在生产者和消费者之间建立的满足先进先出的消息队列
— 一个队列可以有多个生产者,也可以有多个消费者。
— 消息队列中的消息一旦被某个消费者取走,该消息就从队 列中删除。
— 出队的消息按照某种负载均衡策略发送给特定的消费者。 — 高级队列模式:带优先级的队列;支持持久性的队列
主题/订阅通信模式:
— 支持向一个特定的消息主题发布消息。
— 多个订阅同一主题的消费者可以同时接收发布到该消息主 题的消息
— 可以灵活地实现广播、组播等多对多通信模式
异步通信,可以减少系统响应时间,提高吞吐量
分布式节点之间的解耦
保证消息的可靠递交,实现最终一致性
实现广播、组播和多对多通信
流量削峰和流控
支持Push模型和Pull模型
三种接收方式:阻塞接收、轮询接收、回调|通知接收
例题
问题
- 简述远程过程调用 RPC 的实现原理和 RPC 中间件的主要作用。(4 分)
- 互联网电商平台在应对秒杀、双十一突发访问峰值等场景时如何利用分布式消息中间件提高系统的高并发服务能力?(4 分)
- 除了 RPC 和消息队列通信方式,分布式系统中不同节点之间还可以采用哪些通信方式?(列举 2 种)(4 分)
三、关于远程过程调用(RPC) 技术,回答下列问题。(共12分)
1.从应用程序员角度看,RPC 技术的主要作用是什么? (4 分)
2.简述RPC的实现原理和RPC中间件的主要作用。(6 分)
3.支持跨编程语言调用的RPC中间件系统中,如CORBA和gRPC,都会定义专用的接口定义语言(IDL: Interface Definition Language),请问IDL语言的作用是什么? (2 分)
三、关于远程过程调用(RPC) 技术,回答下列问题。(共10分)、
1.从应用程序员角度看,RPC技术的主要作用是什么?,(4分)
2.简述RPC的实现原理和RPC中间件的主要作用。(6 分)
四、关于基于消息中间件的分布式通信技术,回箐下列问题。(共11分)
1.简述发布/订阅模式和消息队列模式的区别。(4分)
2.消费者接收消息的三种方式是什么? (3 分)
3.分布式节点之间基于消息中间件进行通信有哪些优点? (4 分)
简述远程过程调用 RPC 的实现原理和 RPC 中间件的主要作用。
other
支持跨编程语言调用的RPC中间件系统中,如CORBA和gRPC,都会定义专用的接口定义语言(IDL: Interface Definition Language),请问IDL语言的作用是什么?
互联网电商平台在应对秒杀、双十一突发访问峰值等场景时如何利用分布式消息中间件提高系统的高并发服务能力?
-
异步处理:通过将请求异步化,将高并发的请求解耦并交给消息中间件处理,可以减轻系统的压力。当用户提交订单或进行秒杀等操作时,不需要立即响应,而是将请求消息发送到消息中间件中,让后续的处理过程异步进行。这样可以有效地平衡系统的负载,提高系统的吞吐量和并发能力。
-
订单队列:使用消息中间件作为订单队列的缓冲区,将用户提交的订单消息放入队列中进行处理。系统可以根据处理能力的情况,逐个消费订单消息进行订单处理。这种方式可以避免系统被瞬间的高并发请求压垮,并提供了订单处理的有序性。
-
分布式事务处理:在秒杀等高并发场景中,可能涉及到库存扣减、订单生成等多个操作,而这些操作需要保持一致性。分布式消息中间件可以提供分布式事务处理的支持,保证多个操作的原子性和一致性。通过将不同操作的消息放入同一个事务中,可以确保这些操作要么全部成功,要么全部回滚,避免了数据不一致的问题。
-
消息削峰填谷:当系统遇到突发的访问峰值时,可以通过消息中间件进行削峰填谷的处理。系统可以将请求消息发送到消息中间件,然后由后端的消费者按照系统处理能力的承载能力进行消费。这样可以平稳地处理高并发的请求,防止系统崩溃。
-
水平扩展:分布式消息中间件具备高可用性和可扩展性,可以方便地进行水平扩展。通过增加消息中间件的实例或增加消费者的数量,可以提升消息处理的能力,满足高并发场景下的需求。
综上所述,利用分布式消息中间件,互联网电商平台可以通过
除了 RPC 和消息队列通信方式,分布式系统中不同节点之间还可以采用哪些通信方式?
restful api,rmi,基于消息传递的通信
-
RESTful API:基于HTTP协议的RESTful API是一种常见的通信方式,它使用HTTP作为传输协议,通过HTTP请求和响应进行通信。每个节点可以暴露一组API接口,其他节点可以通过HTTP请求来调用这些接口进行通信。RESTful API具有简单、轻量级、易于扩展的特点,广泛应用于分布式系统和微服务架构中。
-
基于消息传递的通信:除了消息队列,还可以使用消息传递的通信方式,如发布-订阅(Pub-Sub)模式或事件驱动模式。节点之间可以通过消息传递来进行异步通信和事件通知。这种通信方式可以实现松耦合和可伸缩的系统架构,允许节点之间相互独立地进行通信。
-
数据库同步:在分布式系统中,不同节点之间可以通过数据库同步来进行通信。节点可以将数据写入本地数据库,并通过数据同步机制将数据复制到其他节点的数据库中。这样可以实现数据的共享和同步,不同节点之间可以通过读写数据库来进行通信和数据交换。
-
文件共享:分布式系统中的节点可以通过文件共享的方式进行通信。节点可以将需要共享的数据文件存储在共享文件系统中,其他节点可以通过访问共享文件系统来获取和操作数据文件。文件共享通信方式适用于需要大规模数据共享和批量数据交换的场景。
-
远程方法调用(RMI):类似于RPC,远程方法调用(RMI)也是一种节点之间的通信方式。RMI允许一个节点上的程序通过调用另一个节点上的方法来进行远程通信。不同于RPC的是,RMI通常在同一语言或平台中使用,它通过Java的远程接口和远程对象实现远程方法的调用和通信。
这些通信方式都可以在分布式系统中用于不同节点之间的通信和数据交换。选择适合的通信方式取决于系统的需求、场景和技术栈的选择。
4. 物理时钟和逻辑时钟
5 分布式存储
分区与复制
复制:在多个不同的节点存储相同数据的多个副本
分区:将一个大型数据文件/数据库,分成若干个较小子集(分区),再将不同分区指派给不同节点。
多副本分布式存储一致性问题(为什么会有一致性问题)
why?
1. 多个客户端“同时”对分布式存储系统进行读写。(并发)
2. 分布式节点之间的网络不可靠:丢包、延迟、断裂、乱序
3. 部分存储节点会失效
4. 节点的局部时钟不同步
强一致性与弱一致性
1. 强一致性:(线性一致性/原子一致性)
满足强一致性的两个条件:
(1)一个写入操作返回成功应答之后,后续的读操作一定可以读出最新的值;
(2)一个读操作读取到了一个更新后的变量值,发生在该读操作之后的所有读操作只能读出相同的值或者更新版本的值,不能读出旧版本的值。
在客户端看来,分布式存储系统的外在表现和单副本存储系统的外在表现完全一致。(类似于多个线程访问同一个寄存器)任意客户端看到的所有针对分布式系统的操作(读、写等原子操作)按 全局一致的顺序排列(线性化),并且该排序满足多个操作在时间维 度上的实际发生先后顺序。
1. 顺序一致性(强一致性):
任意客户端看到的所有针对分布式系统的操作(读、写等原子操作)按 全局一致的顺序排列(线性化),同一个客户端发出的多个操作的顺序与该全局一致排序并不矛盾。
3. 因果一致性:
不同客户端看到的所有针对分布式系统的操作(读、写等原子操作)排序不一定一致,但该排序不违背操作发生的因果关系。这种模型保证了按照事件的因果关系进行的操作在所有节点上具有一致性。
4. 最终一致性:
在分布式系统停止更新时,最终所有读操作都可以获得最新版本的数据。
raft协议
一种基于领导者、追随者的一致性协议。节点相互通信选出leader,由此leader统一调度。
当旧leader失效后,会重新选出一个新leader,从而解决了脑裂问题。
通过日志复制机制、leader决策解决了继承性问题,新leader会完成旧leader未完成的任务
Raft更注重可读性和易于实现,适用于更广泛的应用场景;而Paxos则更加复杂,适用于一些对性能要求更高的场景
概述
题目1
在一个包含 n 个节点的分布式系统中应用 Paxos 或 Raft 分布式共识协议实现不同节点间的数据同步,最多可以容忍多少个节点的失效?
Paxos协议能够容忍 (n-1)/2 个节点的失效,而Raft协议能够容忍 (n/2)-1 个节点的失效,其中 n 是总节点数量
在Paxos和Raft分布式共识协议中,能够容忍的节点失效数量取决于所采用的算法和协议的具体配置。
在Paxos协议中,基本的一致性算法(Multi-Paxos)可以容忍 n/2 - 1 个节点的失效,其中 n 是总节点数量。这意味着在一个由奇数个节点组成的系统中,最多可以容忍 (n-1)/2 个节点的失效。
在Raft协议中,为了保证正常的操作和容错能力,系统通常会配置一个主节点和多个从节点。Raft协议的容错性取决于选举过程中的多数派原则。具体来说,在一个由 n 个节点组成的系统中,至少需要 (n/2)+1 个节点正常工作才能保证系统的正常运行。因此,最多可以容忍 (n/2)-1 个节点的失效。
需要注意的是,以上提到的容忍失效节点的数量是指在系统中同时发生的失效情况。如果失效节点发生在不同的时间段或并不是同时发生的,系统可能会容忍更多的节点失效。此外,节点失效数量也可以通过增加节点数量来提高系统的容错性。
总而言之,Paxos协议能够容忍 (n-1)/2 个节点的失效,而Raft协议能够容忍 (n/2)-1 个节点的失效,其中 n 是总节点数量。
分区:哈希分区、一致性哈希分区
哈希分区和一致性哈希分区是在分布式系统中常用的数据分片策略,用于将数据均匀地分布到多个节点上。
- 哈希分区:
哈希分区是一种简单的数据分片方法。它使用数据的哈希值来确定数据应该被存储在哪个节点上。具体步骤如下:
- 根据数据的特征,计算数据的哈希值。
- 将哈希值映射到节点的范围,通常使用模运算将哈希值映射到节点编号。
- 将数据存储在对应的节点上。
哈希分区的优点是简单直观,适用于均匀分布的数据。但它的缺点是对于节点的增减和数据的迁移不够灵活,因为一旦节点发生变化,所有的数据都需要重新分配。
- 一致性哈希分区:
一致性哈希分区是一种解决数据分片和节点扩缩容问题的高级方法。它通过哈希环来表示节点,将数据映射到哈希环上的位置,从而决定数据应该存储在哪个节点上。具体步骤如下:
- 将节点映射到一个哈希环上的位置。
- 对于数据,计算其哈希值并映射到哈希环上的位置。
- 沿着哈希环顺时针寻找下一个节点,将数据存储在该节点上。
一致性哈希分区的优点是在节点增减和数据迁移时具有很好的扩展性和灵活性。当节点发生变化时,只需要重新分配受影响的部分数据,而不需要重新分配所有数据。这使得节点的扩缩容更加高效。但一致性哈希分区的实现相对复杂一些。
总的来说,哈希分区和一致性哈希分区都是常用的数据分片策略。哈希分区简单直观,适用于均匀分布的数据,但对节点的增减和数据的迁移不够灵活。一致性哈希分区解决了这个问题,具有更好的扩展性和灵活性,但实现较为复杂。选择使用哪种分区策略应根据具体的需求和系统设计的要求来决定。
HDFS
- 主从框架
- 高容错
- 高吞吐量
- 大文件支持 why不适合大量小文件存储?
- 简单一致性模型
概述
名称节点(NameNode) 管理HDFS的命名空间,保存了两个核心的数据解构:FsImage,EditLog。
FsImage:维护文件系统树以及文件树中所有文件和文件夹的元数据
EditLog:记录了所有针对文件的创建、删除、重命名等工作。
记录了文件各个块所在节点的位置信息。
数据节点(DataNode)HDFS的工作节点。负责数据的存储、读取。会根据client/NameNode的调度来进行数据的存储与检索,并定期向NameNode发送自己的所存储块的列表
题目
1. 简述客户端读取一个 HDFS 文件时与 NameNode 节点和 DataNode 节点的交互过程。(4 分)
2. 为了提高数据存储的可靠性,HDFS 在设计上采取了哪些技术措施?(至少给出 2 种)(4 分)
3. 为什么 HDFS 不适合存储大量的小文件?(2 分)
1. HDFS的NameNode节点和DataNode节点的主要功能分别是什么? (4 分)
2. HDFS采用什么技术提高数据存储的可靠性? (3分)
3. 简述HDFS客户端读取一个HDFS文件时与NameNode和DatanNode的交互过程。(4分)
1. why HDFS不适合大量小文件存储
- 大量小文件会导致NameNode负载过大
- HDFS采用碎片化存储,大量小文件会导致存储空间浪费
- HDFS数据元开销大,不适合大量小文件
- 处理大量小文件时,需要进行多次文件系统操作,尤其在并发环境下,会性能下降
HDFS不适合大量小文件存储的主要原因包括以下几点:
-
元数据开销:HDFS在存储小文件时,需要为每个文件分配一定的存储空间来保存元数据信息,如文件名、权限、时间戳等。对于大量小文件,这将导致巨大的元数据开销,消耗过多的存储空间和内存资源。
-
存储碎片化:小文件的存储方式会导致存储碎片化问题。HDFS的文件块大小通常为64 MB 或128 MB,如果存储的文件很小,可能会浪费大量存储空间,因为每个文件都需要至少分配一个块的空间。这将导致磁盘空间利用率低下,同时也会增加存储的管理和维护成本。
-
延迟和处理成本:在处理大量小文件时,HDFS需要进行多次文件系统操作,如文件定位、读取和关闭等。这些额外的操作会增加访问延迟,并且对于大量并发请求的情况下,可能会造成文件系统的瓶颈和性能下降。
-
NameNode的负载问题:在HDFS中,NameNode负责管理和维护文件系统的元数据信息。大量小文件会导致NameNode需要管理的文件数量巨大,使其负载过重,可能导致性能下降甚至系统崩溃。
尽管HDFS对大型文件和大数据处理具有良好的扩展性和容错性,但对于大量小文件存储,HDFS的设计并不适用。如果需要存储大量小文件,可以考虑其他专门针对小文件存储优化的文件系统,或者使用数据存储和处理框架,如Apache HBase等。
2. HDFS采用什么技术提高数据存储的可靠性
数据复制、数据块的位置感知调度、心跳机制、数据完整性检验、自动故障检测与恢复
HDFS(Hadoop Distributed File System)采用了多种技术来提高数据存储的可靠性,其中主要包括以下几个方面:
-
数据复制:HDFS将文件切分为数据块,并将每个数据块复制多次存储在不同的数据节点上。默认情况下,每个数据块会有三个副本(可以通过配置进行调整),其中一个是主副本,其他副本是冗余备份。这样即使某个数据节点出现故障,数据仍然可以从其他副本中获取。
-
数据块的位置感知调度:HDFS会尽量将副本放置在不同的机架上,以防止机架级别的故障。这样即使整个机架发生故障,数据仍然可以通过其他机架上的副本来获取,提高了系统的容错性。
-
心跳机制:HDFS中的数据节点会定期向NameNode发送心跳信号,以通知其存活状态。如果某个数据节点长时间未发送心跳信号,NameNode会将其标记为不可用,将其上的数据块复制到其他可用的节点上,以确保数据的可靠性。
-
数据完整性校验:HDFS通过使用校验和来检测数据在传输或存储过程中的损坏。每个数据块都会计算一个校验和,并与数据一起存储。当客户端读取数据时,HDFS会计算读取的数据的校验和,并与存储的校验和进行比较,以确保数据的完整性。
-
自动故障检测与恢复:HDFS具有自动故障检测和恢复机制。当数据节点或NameNode出现故障时,HDFS能够快速检测到,并自动进行故障切换和恢复,以保持系统的可靠性和可用性。
通过以上这些技术手段,HDFS能够提供高度可靠的数据存储服务,保证数据的安全性和可用性。这些技术使得HDFS在大规模数据存储和处理场景下具有优秀的容错性和鲁棒性。
3. 简述HDFS客户端读取一个HDFS文件时与NameNode和DatanNode的交互过程
- 客服端向名称节点发送读请求,参数包含:文件名、偏移量、长度
- 名称节点根据文件名、偏移量,查找"文件名—数据块对应表","数据块—物理节点对应表",并讲包含目标数据块的数据节点ip列表发送给客服端
- 客服端根据数据节点ip列表,选择最近的数据节点,进行连接,读取数据
写操作
- 客服端向名称节点发送新建文件请求
- 名称节点根据负载均衡选择三个数据节点,并将ip返回给客户端
- 客服端讲这三个数据节点构成一个流水线,装入第一个数据块
- 第一个数据块装入成功后,再向名称节点获取下一个数据块的三个数据节点
HDFS的NameNode节点和DataNode节点的主要功能分别是什么
名称节点(NameNode) 管理HDFS的命名空间,保存了两个核心的数据解构:FsImage,EditLog。
FsImage:维护文件系统树以及文件树中所有文件和文件夹的元数据
EditLog:记录了所有针对文件的创建、删除、重命名等工作。
记录了文件各个块所在节点的位置信息。
数据节点(DataNode)HDFS的工作节点。负责数据的存储、读取。会根据client/NameNode的调度来进行数据的存储与检索,并定期向NameNode发送自己的所存储块的列表
在HDFS中,NameNode节点和DataNode节点具有不同的功能和角色:
-
NameNode节点:
- 元数据管理:NameNode节点负责管理HDFS的文件系统命名空间和元数据信息。它维护着整个文件系统的目录结构、文件和目录的权限、时间戳等元数据信息。
- 块分配和命名空间操作:NameNode负责协调数据块的分配和管理。它决定将文件的数据块分配给哪些DataNode节点,并记录数据块与DataNode节点之间的映射关系。
- 故障检测和恢复:NameNode通过与DataNode节点保持心跳联系,及时检测和处理DataNode节点的故障。当一个DataNode节点失效时,NameNode负责将其上的数据块复制到其他健康的DataNode节点上,以保证数据的可靠性和可用性。
-
DataNode节点:
- 数据存储和管理:DataNode节点是HDFS的数据存储节点。它负责实际存储文件数据块,并提供数据的读取和写入服务。每个DataNode节点都保存着存储在本地磁盘上的数据块副本。
- 数据块报告和心跳:DataNode节点周期性地向NameNode发送心跳信号,以向其报告自身的状态和可用性。它还发送数据块报告,通知NameNode当前存储的数据块信息,包括数据块的ID、大小、位置等。
- 数据块复制和恢复:DataNode节点按照NameNode的指示进行数据块的复制。当一个DataNode节点上的数据块损坏或丢失时,其他DataNode节点上的副本可以被用来恢复丢失的数据块。
NameNode节点和DataNode节点之间通过网络进行通信,协同工作来实现分布式文件系统的管理和数据存储。NameNode负责管理元数据和文件系统操作,而DataNode则负责实际的数据存储和处理。这种分工使得HDFS能够提供高容错性、高可用性和高扩展性的分布式存储服务。
6 MapReduce
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)