关于分布式文件系统接口设计的信息

网友投稿 283 2023-01-04


本篇文章给大家谈谈分布式文件系统接口设计,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享分布式文件系统接口设计的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

分布式文件系统hdfs主要由哪些功能模块构成

Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。
Hadoop分布式文件系统架构
1 NameNode(名称节点)
HDFS命名空间采用层次化(树状——译者注)的结构存放文件和目录。
2 映像和日志
Inode和定义metadata的系统文件块列表统称为Image(映像).NameNode将整个命名空间映像保存在RAM中。而映像的持久化记录则保存在NameNode的本地文件系统中,该持久化记录被称为Checkpoint(检查点)。NameNode还会记录HDFS中写入的操作,并将其存入一个记录文件,存放在本地文件系统中,这个记录文件被叫做Journal(日志)。
3 数据节点
DataNode上的每一个块(block)副本都由两个本地文件系统上的文件共同表示。其中一个文件包含了块(block)本身所需包含的数据,另一个文件则记录了该块的元数据,包括块所含数据大小和文件生成时间戳。数据文件的大小等于该块(block)的真实大小,而不是像传统的文件系统一样,需要用额外的存储空间凑成完整的块。因此,如果一个块里只需要一半的空间存储数据,那么就只需要在本地系统上分配半块的存储空间即可。
4 HDFS客户端
用户应用程序通过HDFS客户端连接到HDFS文件系统,通过库文件可导出HDFS文件系统的接口。像很多传统的文件系统一样,HDFS支持文件的读、写和删除操作,还支持对目录的创建和删除操作。与传统的文件系统不同的是,HDFS提供一个API用以暴露文件块的位置。这个功能允许应用程序。
5 检查点节点
HDFS中的NameNode节点,除了其主要职责是相应客户端请求以外,还能够有选择地扮演一到两个其他的角色,例如做检查点节点或者备份节点。该角色是在节点启动的时候特有的。
6 备份节点
HDFS的备份节点是最近在加入系统的一项特色功能。就像CheckpintNode一样,备份节点能够定期创建检查点,但是不同的是,备份节点一直保存在内存中,随着文件系统命名空间的映像更新和不断更新,并与NameNode的状态随时保持同步。
7 系统更新和文件系统快照
在软件更新的过程中,由于软件的bug或者人为操作的失误,文件系统损坏的几率会随之提升。在HDFS中创建系统快照的目的,就在于把系统升级过程中可能对数据造成的隐患降到最低。快照机制让系统管理员将当前系统状态持久化到文件系统中,这样以来,如果系统升级后出现了数据丢失或者损坏,便有机会进行回滚操作,将HDFS的命名空间和存储状态恢复到系统快照进行的时刻。

分布式文件系统的NFS介绍

(NFS)(Network File System)是个分布式的客户机/服务器文件系统。NFS的实质在于用户间计算机的共享。用户可以联结到共享计算机并像访问本地硬盘一样访问共享计算机上的文件。管理员可以建立远程系统上文件的访问,以至于用户感觉不到他们是在访问远程文件。
NFS是个到处可用和广泛实现的开放式系统。 允许用户象访问本地文件一样访问其他系统上的文件。提供对无盘工作站的支持以降低网络开销。
简化应用程序对远程文件的访问使得不需要因访问这些文件而调用特殊的过程。
使用一次一个服务请求以使系统能从已崩溃的服务器或工作站上恢复。
采用安全措施保护文件免遭偷窃与破坏。
使NFS协议可移植和简单,以便它们能在许多不同计算机上实现,包括低档的PC机。
大型计算机、小型计算机和文件服务器运行NFS时,都为多个用户提供了一个文件存储区。工作站只需要运行TCP/IP协议来访问这些系统和位于NFS存储区内的文件。工作站上的NFS通常由TCP/IP软件支持。对DOS用户,一个远程NFS文件存储区看起来是另一个磁盘驱动器盘符。对Macintosh用户,远程NFS文件存储区就是一个图标。 服务器目录共享 服务器广播或通知正在共享的目录,一个共享目录通常叫做出版或出口目录。有关共享目录和谁可访问它们的信息放在一个文件中,由操作系统启动时读取。
客户机访问 在共享目录上建立一种链接和访问文件的过程叫做装联(mounting),用户将网络用作一条通信链路来访问远程文件系统。
NFS的一个重要组成是虚拟文件系统(VFS),它是应用程序与低层文件系统间的接口。 close文件关闭操作
create 文件生成操作
fsync将改变保存到文件中
getattr 取文件属性
link 用另一个名字访问一个文件
lookup 读目录项
mkdir建立新目录
open 文件打开操作
rdwr 文件读写操作
remove 删除一个文件
rename 文件改名
rmdir删除一目录
setattr 设置文件属性 Andrew File System(AFS)Andrew文件系统(AFS)
AFS是专门为在大型分布式环境中提供可靠的文件服务而设计的。它通过基于单元的结构生成一种可管理的分布式环境。一个单元是某个独立区域中文件服务器和客户机系统的集合,这个独立区域由特定的机构管理。通常代表一个组织的计算资源。用户可以和同一单元中其他用户方便地共享信息,他们也可以和其他单元内的用户共享信息,这取决于那些单元中的机构所授予的访问权限。
文件服务器进程 这个进程响应客户工作站对文件服务的请求,维护目录结构,监控文件和目录状态信息,检查用户的访问。
基本监察(BOS)服务器进程 这个进程运行于有BOS设定的服务器。它监控和管理运行其他服务的进程并可自动重启服务器进程,而不需人工帮助。
卷宗服务器进程 此进程处理与卷宗有关的文件系统操作,如卷宗生成、移动、复制、备份和恢复。
卷宗定位服务器进程 该进程提供了对文件卷宗的位置透明性。即使卷宗被移动了,用户也能访问它而不需要知道卷宗移动了。
鉴别服务器进程 此进程通过授权和相互鉴别提供网络安全性。用一个“鉴别服务器”维护一个存有口令和加密密钥的鉴别数据库,此系统是基于Kerberos的。
保护服务器进程 此进程基于一个保护数据库中的访问信息,使用户和组获得对文件服务的访问权。
更新服务器进程 此进程将AFS的更新和任何配置文件传播到所有AFS服务器。
AFS还配有一套用于差错处理,系统备份和AFS分布式文件系统管理的实用工具程序。例如,SCOUT定期探查和收集AFS文件服务器的信息。信息在给定格式的屏幕上提供给管理员。设置多种阈值向管理者报告一些将发生的问题,如磁盘空间将用完等。另一个工具是USS,可创建基于带有字段常量模板的用户帐户。Ubik提供数据库复制和同步服务。一个复制的数据库是一个其信息放于多个位置的系统以便于本地用户更方便地访问这些数据信息。同步机制保证所有数据库的信息是一致的。

如何用java 建立一个分布式系统

分布式架构的演进
系统架构演化历程-初始阶段架构
初始阶段 的小型系统 应用程序、数据库、文件等所有的资源都在一台服务器上通俗称为LAMP
特征:
应用程序、数据库、文件等所有的资源都在一台服务器上。
描述:
通常服务器操作系统使用Linux分布式文件系统接口设计,应用程序使用PHP开发,然后部署在Apache上,数据库使用MySQL,汇集各种免费开源软件以及一台廉价服务器就可以开始系统的发展之路了。
系统架构演化历程-应用服务和数据服务分离
好景不长,发现随着系统访问量的再度增加,webserver机器的压力在高峰期会上升到比较高,这个时候开始考虑增加一台webserver
特征:
应用程序、数据库、文件分别部署在独立的资源上。
描述:
数据量增加,单台服务器性能及存储空间不足,需要将应用和数据分离,并发处理能力和数据存储空间得到了很大改善。
系统架构演化历程-使用缓存改善性能
特征:
数据库中访问较集中的一小部分数据存储在缓存服务器中,减少数据库的访问次数,降低数据库的访问压力。
描述:
系统访问特点遵循二八定律,即80%的业务访问集中在20%的数据上。
缓存分为本地缓存和远程分布式缓存,本地缓存访问速度更快但缓存数据量有限,同时存在与应用程序争用内存的情况。
系统架构演化历程-使用应用服务器集群
在做完分库分表这些工作后,数据库上的压力已经降到比较低了,又开始过着每天看着访问量暴增的幸福生活了,突然有一天,发现系统的访问又开始有变慢的趋势了,这个时候首先查看数据库,压力一切正常,之后查看webserver,发现apache阻塞了很多的请求,而应用服务器对每个请求也是比较快的,看来 是请求数太高导致需要排队等待,响应速度变慢
特征:
多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题。
描述:
使用集群是系统解决高并发、海量数据问题的常用手段。通过向集群中追加资源,提升系统的并发处理能力,使得服务器的负载压力不再成为整个系统的瓶颈。
系统架构演化历程-数据库读写分离
享受了一段时间的系统访问量高速增长的幸福后,发现系统又开始变慢了,这次又是什么状况呢,经过查找,发现数据库写入、更新的这些操作的部分数据库连接的资源竞争非常激烈,导致了系统变慢
特征:
多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题。
描述:
使用集群是系统解决高并发、海量数据问题的常用手段。通过向集群中追加资源,使得服务器的负载压力不在成为整个系统的瓶颈。
系统架构演化历程-反向代理和CDN加速
特征:
采用CDN和反向代理加快系统的 访问速度。
描述:
为了应付复杂的网络环境和不同地区用户的访问,通过CDN和反向代理加快用户访问的速度,同时减轻后端服务器的负载压力。CDN与反向代理的基本原理都是缓存。
系统架构演化历程-分布式文件系统和分布式数据库
随着系统的不断运行,数据量开始大幅度增长,这个时候发现分库后查询仍然会有些慢,于是按照分库的思想开始做分表的工作
特征:
数据库采用分布式数据库,文件系统采用分布式文件系统。
描述:
任何强大的单一服务器都满足不了大型系统持续增长的业务需求,数据库读写分离随着业务的发展最终也将无法满足需求,需要使用分布式数据库及分布式文件系统来支撑。
分布式数据库是系统数据库拆分的最后方法,只有在单表数据规模非常庞大的时候才使用,更常用的数据库拆分手段是业务分库,将不同的业务数据库部署在不同的物理服务器上。
系统架构演化历程-使用NoSQL和搜索引擎
特征:
系统引入NoSQL数据库及搜索引擎。
描述:
随着业务越来越复杂,对数据存储和检索的需求也越来越复杂,系统需要采用一些非关系型数据库如NoSQL和分数据库查询技术如搜索引擎。应用服务器通过统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。
系统架构演化历程-业务拆分
特征:
系统上按照业务进行拆分改造,应用服务器按照业务区分进行分别部署。
描述:
为了应对日益复杂的业务场景,通常使用分而治之的手段将整个系统业务分成不同的产品线,应用之间通过超链接建立关系,也可以通过消息队列进行数据分发,当然更多的还是通过访问同一个数据存储系统来构成一个关联的完整系统。
纵向拆分:
将一个大应用拆分为多个小应用,如果新业务较为独立,那么就直接将其设计部署为一个独立的Web应用系统
纵向拆分相对较为简单,通过梳理业务,将较少相关的业务剥离即可。
横向拆分:将复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务
横向拆分需要识别可复用的业务,设计服务接口,规范服务依赖关系。
系统架构演化历程-分布式服务
特征:
公共的应用模块被提取出来,部署在分布式服务器上供应用服务器调用。
描述:
随着业务越拆越小,应用系统整体复杂程度呈指数级上升,由于所有应用要和所有数据库系统连接,最终导致数据库连接资源不足,拒绝服务。
Q:分布式服务应用会面临哪些问题分布式文件系统接口设计
A:
(1) 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。
(2) 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
(3) 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?
(4) 服务多了,沟通成本也开始上升,调某个服务失败该找谁?服务的参数都有什么约定?
(5) 一个服务有多个业务消费者,如何确保服务质量?
(6) 随着服务的不停升级,总有些意想不到的事发生,比如cache写错了导致内存溢出,故障不可避免,每次核心服务一挂,影响一大片,人心慌慌,如何控制故障的影响面?服务是否可以功能降级?或者资源劣化?
Java分布式应用技术基础
分布式服务下的关键技术:消息队列架构
消息对列通过消息对象分解系统耦合性,不同子系统处理同一个消息
分布式服务下的关键技术:消息队列原理
分布式服务下的关键技术:服务框架架构
服务框架通过接口分解系统耦合性,不同子系统通过相同的接口描述进行服务启用
服务框架是一个点对点模型
服务框架面向同构系统
适合:移动应用、互联网应用、外部系统
分布式服务下的关键技术:服务框架原理
分布式服务下的关键技术:服务总线架构
服务总线同服务框架一样,均是通过接口分解系统耦合性,不同子系统通过相同的接口描述进行服务启用
服务总线是一个总线式的模型
服务总线面向同构、异构系统
适合:内部系统
分布式服务下的关键技术:服务总线原理
分布式架构下系统间交互的5种通信模式
request/response模式(同步模式):客户端发起请求一直阻塞到服务端返回请求为止。
Callback(异步模式):客户端发送一个RPC请求给服务器,服务端处理后再发送一个消息给消息发送端提供的callback端点,此类情况非常合适以下场景:A组件发送RPC请求给B,B处理完成后,需要通知A组件做后续处理。
Future模式:客户端发送完请求后,继续做自己的事情,返回一个包含消息结果的Future对象。客户端需要使用返回结果时,使用Future对象的.get(),如果此时没有结果返回的话,会一直阻塞到有结果返回为止。
Oneway模式:客户端调用完继续执行,不管接收端是否成功。
Reliable模式:为保证通信可靠,将借助于消息中心来实现消息的可靠送达,请求将做持久化存储,在接收方在线时做送达,并由消息中心保证异常重试。
五种通信模式的实现方式-同步点对点服务模式
五种通信模式的实现方式-异步点对点消息模式1
五种通信模式的实现方式-异步点对点消息模式2
五种通信模式的实现方式-异步广播消息模式
分布式架构下的服务治理
服务治理是服务框架/服务总线的核心功能。所谓服务治理,是指服务的提供方和消费方达成一致的约定,保证服务的高质量。服务治理功能可以解决将某些特定流量引入某一批机器,以及限制某些非法消费者的恶意访问,并在提供者处理量达到一定程度是,拒绝接受新的访问。
基于服务框架Dubbo的服务治理-服务管理
可以知道分布式文件系统接口设计你的系统,对外提供了多少服务,可以对服务进行升级、降级、停用、权重调整等操作
可以知道你提供的服务,谁在使用,因业务需求,可以对该消费者实施屏蔽、停用等操作
基于服务框架Dubbo的服务治理-服务监控
可以统计服务的每秒请求数、平均响应时间、调用量、峰值时间等,作为服务集群规划、性能调优的参考指标。
基于服务框架Dubbo的服务治理-服务路由
基于服务框架Dubbo的服务治理-服务保护
基于服务总线OSB的服务治理-功能介绍
基于服务总线OSB的服务治理
Q:Dubbo到底是神马?
A:
淘宝开源的高性能和透明化的RPC远程调用服务框架
SOA服务治理方案
Q:Dubbo原理是?
A:
-结束-

架构设计:文件服务存储设计

在架构设计:文件服务的设计与实现一文中,通过实现一个文件服务来梳理了一个架构设计的一般流程,并得到如下静态架构图

本文继续聊聊文件服务中的子模块:「存储模块」的设计,包括:

前面的架构没有对存储进行特别设计,直接使用了本地存储。考虑到后期文件数量可能会越来越多,本地存储可能无法支撑,且本地存储的安全性也没有保障。为了便于后期扩展,需要对「存储」部分进行设计。

存储的方式有很多,本地存储、NAS、分布式存储,为了能支持不同的存储方式,需要对「存储模块」进行抽象。考虑到「存储模块」涉及到IO,是一个相对底层的模块。「上传」这个核心模块不能依赖于具体的存储,所以这里也需要对其进行依赖反转。

见紫色部分,UploadService调用了FileInfoRepository来存储FileInfo,而FileInfoRepository是个接口,具体实现由存储模块中的实现类来实现。

我们先看本地存储。最简单的实现,就是直接使用IO将文件写到对应的目录下就可以了。但是,本地存储会有如下几个问题:

下面我们针对上面的问题,来一个个的解决。

首先,对于多租户来说,在我们的架构中,实际对应的是Group,我们按照Group的不同,来划分目录即可。即 不同的租户有不同的文件根目录 ,后期某个租户迁移时,直接迁移对应目录即可。这也稍微解决了单目录文件数量多的问题。

对于单目录下,随着文件数量的增加导致访问速度下降的问题,我们该如何解决呢?

如果你做过分布式系统,那么想一想, 我们是否可以把单目录看成是一个服务器,访问目录下的文件看成是一个个的请求呢 ?如果可以,那解决单目录下访问速度慢的问题是不是就变成了「如何解决单服务器下,负载过高」的问题了?那解决服务端负载过高的方法是否适用于解决目录访问速度下降的问题呢?

我们从下面几个方面来分析一下:

首先来看「解决服务端负载过高的方法」!答案很明显: 分流+负载均衡 !

分布式服务的负载均衡有几种方式呢?

再来看「目录访问和服务器的区别」,虽然可以把目录看成服务器,但是两者还是有区别的:

也就是说,对于目录来说,我们不需要考虑创建成本。

那么针对服务器负载高的解决方案是否适合目录访问呢?或者哪种方式适合目录访问呢?我们一个个来分析:

可以看到,主要的问题就是创建目录的问题!如何保证在目录数量改变时,不需要调整程序呢?

实际上git已经给出了答案:

也就是说,根据sha1散列的前两位对文件进行归类。这样既解决了目录创建问题,也解决了文件分布问题。可能的问题是,「sha1散列2^80次,可能会发生一次碰撞」。这个问题对于一般文件系统来说,好像也没有担心的必要。

解决了「单目录文件过多,导致访问速度下降」的问题,我们来看下一个问题: 数据安全 。

文件数据是存放在电脑磁盘上的,如果硬盘损坏,可能导致文件的丢失。这实际还是一个「单点问题」!

「单点问题」的解决方案是什么呢? 冗余 啊!

最简单的方案就是定时去备份数据,可以有如下几种方案:

我们继续一个个的讨论。

首先是 人工备份 ,这是最low的方案,当然也是最简单的,即有人定期去备份就行了。问题是时效性不高,例如一天备份一次,如果磁盘在备份前坏了,那就会丢失一天的数据。同时恢复比较耗时,需要人工处理。

第二个方案是 代码实现 ,即在上传文件时,程序就自动备份。以上面的架构为例,可以添加一个BackupListener,当上传完成后,通过事件,自动备份上传的文件。同时下载时需要判定文件是否完整,如果有问题则使用备份数据。此方案时效性得到了保障,但是将数据备份和业务放到了一起,且需要编码实现,增加了业务代码量。

第三个方案是 libfuse ,libfuse是用户态文件系统接口。下面是libfuse官方简介:

简单来说,就是可以用libfuse构建一个用户态文件系统。之前在老东家做了一个日志分析平台,日志的收集就使用了libfuse,大致架构如下:

业务系统写日志到挂载的用户态文件系统中,用户态文件系统自动转发到了后续的处理中间件:redis、消息队列、文件系统。

在这里也可以用类似的功能,即在文件上传后,用户态文件系统自动备份。此方案解耦了文件备案逻辑与业务逻辑。

最后一个方案是 RAID ,即廉价冗余磁盘阵列。RAID不但可备份文件,还支持并发读写,提高上传下载速率。

常用的RAID有:RAID0,RAID1,RAID01/RAID10,RAID5和RAID6等。我们来看看这几种RAID的特点,以及是否适用于我们的文件服务。你会发现从RAID0到RAID6,又是一个从单点到分布式的过程。

看下面的两张图应该能更好的理解:

无论是RAID10还是RAID01,对磁盘的使用效率都不高。那如何提高磁盘使用率呢?就有了RAID3。

对于本地存储来说,RAID是个相对实用的解决方案,既能提高数据安全、快速扩容,也提高了读写速率。但是无论扩展多少磁盘,容量还是相对有限,吞吐也相对有限,同时由于其还是单点,如果文件服务本身挂掉,就会导致单点故障。所以就有了分布式文件系统。

分布式文件系统下次单独讨论!

最后打个广告,帮朋友开的专栏《零基础Unity3D 游戏 开发》,适合没有基础、想从事 游戏 开发的小白!朋友从事 游戏 多年,开发了多款 游戏 ,收了30多个徒弟,技术杠杠的!

关于分布式文件系统接口设计和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 分布式文件系统接口设计的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、分布式文件系统接口设计的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用Scala生成随机数的方法示例
下一篇:主流微服务网关(微服务架构 网关)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~