分布式(集群)文件系统的设计

分布式(集群)文件系统的设计

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。



本文讲的分布式文件系统,是通过集群来实现的,因此也是集群文件系统。本文介绍下分布式文件系统中的常见问题及GFS中给出的解决方法。


设计要点:
性能
提高性能的方法就是并行,讲一个任务分解成多个任务,同一时候运行。

GFS中的思路是将文件分块,每一个块是一个chunk,每一个chunk单独保存,保存chunk的节点叫chunkserver。对文件的读写,能够转成对chunk的读写,不同的chunk能够并行运行,提高效率。每一个chunk有唯一的一个chunk handle表示,chunk的大小(chunk size)须要依据应用特点决定。chunk size过大,影响并行度;过小,占用很多其它的metadata空间,很多其它的chunk解析时间。


高可用性(availability)和可靠性(reliability)
可用性指系统平均宕机时间占总使用时间的比例,越小越好。
可控性指系统的平均无故障执行时间,越长越好。

高可用性能够通过硬件冗余(redundency)实现,当一个硬件不能工作的时候,迅速切换到备份系统。缩小切换时间能够添加�系统的可用性。
提高容错性(fault tolerance)能够提高系统的可靠性,一个component失效,不会影响总体的功能。

GFS中採用的就是硬件冗余的方法来实现高可用和高可靠。master和chunkserver都有备份,对于chunkserver,有3个节点互为备份,备份以chunk为单位进行。
master採用主备(master/slave)方式备份。master主节点(primary master)会将自己的状态信息(operation log和checkpoint)同步到备份节点上,当主节点不可用时,备份节点能够新的主节点使用。


chunkserver採用负载均衡(load balance)方式备份。每一个chunk会被保存在3台chunkserver上,每一个chunkserver都会參与处理请求。对于读请求,会选择距离client较近的chunkserver;对于写请求,master会选择一个primary replica,由primary replica负责将client的数据同步到其它的备份节点上。


可扩展性
集群的规模能够依据须要动态扩展,主要指存储能力的扩展性,即添加�chunkserver的能力。为了支持动态扩展,须要做到chunk保存位置的透明性(Location transparency),用户不须要知道每一个chunk保存在哪些机器上,而是由系统动态维护。这样系统中chunkserver的添加�和降低就不会影响client的使用。

GFS中的思路,採用一个master节点来保存全部的元数据(metadata),实现chunk的位置透明性。
master的主要工作:
文件的namespace管理
  类似于传统文件系统中的文件夹结构,维护系统中已有的文件。
将文件映射成chunks
  每一个文件由若干个chunk组成。从client看来,chunk由0開始编号直到N。master须要将chunk的逻辑编号(0,1,…N)映射为内部的chunk     handle(chunk的唯一全局标示符)。
chunk位置管理
  记录每一个chunk所属的chunkserver的位置,每一个chunk会保存在多个chunkserver上。依据这个信息,能够实现chunk的位置无关性。master会和每一个chunkserver通信,已得到每一个chunkserver上保存的chunk信息。创建新的chunk时,master也会依据一定的算法来选择chunkserver(默认选择3台,存放3个备份)来保存chunk。
容错处理
  系统执行中,可能出现chunkserver损坏的情况。master须要将这台机器上所保存的chunk进行又一次部署(re-replicatoin)。还有随着机器的添加�,还要对chunk存放进行又一次的平衡(rebalancing,chunk migration between chunk servers)。

元数据保存和备份、恢复

上述功能的实现都依赖于metadata,metadata主要保存在内存中。系统中对文件的更改操作(mutation)都会记录操作日志中(operation log,这个日志类似于关系数据库系统中的日志)。内存中的metadata也会以checkpoint的形式存放在磁盘上。依据一个checkpoint和在其上进行的operation log,就能够恢复系统的状态(在checkpoint基础上重放运行过的全部操作就可以)。master就是将checkpoint和operation log备份到其它机器上,来实现备份恢复。



一致性模型(consistency model)

一致性指当一个client更改了文件的内容时,其它的clients是否能看到这些内容,何时看到。

GFS中採用的是强一致性(strong consistency model)模型,这个模型中,当一个client改动完毕后,其它的全部clients都会立马看到改动(无论client是从哪个备份读)。这个和普通的单机文件系统是一致的。GFS中没有提供的文件读写的并发控制,当多个client同一时候进行更改操作时,文件内容是不确定的(undefined)

并发控制(concurrency control)

当有多个client同一时候运行某个操作时,要保证系统的正确性。

GFS中对文件namespace的操作时原子操作,及多个client同一时候使用不会产生问题,内部有一定的并发控制策略(通过锁lock机制实现)。但对文件内容的读写没有提供并发控制。

GFS还提供了还有一种原子操作,附加记录(Atomic Record Appends)。

总结:
这些问题在每一个分布式文件系统中都会出现,不同的系统可能有不同的解决方法。在学习的时候,能够先关注这些点。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/118611.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java递归下降分析_JAVA中的递归下降

    java递归下降分析_JAVA中的递归下降publicclassParser{//ThesearethetokentypefinalintNONE=0;finalintDELIMITER=1;finalintVARIABLE=2;finalintNUMBER=3;//ThesearethetypeofsyntaxerrorsfinalintSYNTAX=0;final…

  • python读取txt文件内容(python怎么读取excel)

    python读取txt文件的方法:首先打开文件,代码为【f=open(‘/tmp/test.txt’)】;然后进行读取,代码为【本教程操作环境:windows7系统、python3.9版,该方法适用于所有品牌电脑。python读取txt文件的方法:一、文件的打开和创建>>>f=open(‘/tmp/test.txt’)>>>f.read()’hell…

  • matlab画圆函数

    matlab画圆函数function[]=circle(x,y,r)%画圆函数%circle(0,0,4);gridon%xy是中心,r是半径rectangle(‘Position’,[x-r,y-r,2*r,2*r],’Curvature’,[1,1])axisequal%为了修饰曲线的颜色,宽度,圈盘填充颜色等,可以设置其他参数等,例如%’edgecolor’,’b’,其中edgecolor表示边框颜色,后面的b是颜色参数值;%facecolor’,’r’,其中facecolor表示内部填

  • freeswitch笔记2:呼叫中心坐席转接

    freeswitch笔记2:呼叫中心坐席转接1.设置呼叫中心拨号计划<extensionname=”Call-Center-9999″continue=””uuid=”c3500cca-9d04-4e18-a857-9d54c7490038″> <conditionfield=”destination_number”expression=”^([^#]+#)(.*)$”break=”never”> <actionapplication=”set”data=”caller_id_name=$2″/&

  • fec浅析_fec13

    fec浅析_fec13fec(ForwardErrorCorrection),向前纠错。fec主要用于在传输过程中,发现带宽时够的,但是会有丢包的情况。一般用于udp传输,比如webrtc传视频,视频会议传输视频。另外提一下的是,udp传输视频一般会把一帧视频分为很多个分组,为啥要分组,因为如果不分组,传输过程中丢失了任何一个分组,整帧数据就丢失了。按mtu以下的分组传输好处是,可以实现udt,和fec了。比如一帧分了5个分组,增加一个fec冗余包,当前面5个分组中丢失任何一个,都可以通过这个fec冗

  • php 伪静态 rewriterule,PHP伪静态 RewriteRule-htaccess详细规则使用说明「建议收藏」

    php 伪静态 rewriterule,PHP伪静态 RewriteRule-htaccess详细规则使用说明「建议收藏」伪静态实际上是利用PHP把当前地址解析成另一种方法来访问网站,要学伪静态规则的写法,要懂一点正则一、正则表达式教程有一个经典的教程:正则表达式30分钟入门教程常用正则如下:.换行符以外的所有字符\w匹配字母或数字或下划线或汉字\s匹配任意的空白符\d匹配数字\b匹配单词的开始或结束^匹配字符串的开始$匹配字符串的结束*重复零次或更多次+重复一次或更多次?重复…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号