GFS简要学习

  GFS是Google提出的分布式文件系统,它由一个单一的master服务器以及多个chunk文件服务器组成,master服务器主要对命名空间、文件和chunk的映射以及chunk所在服务器的位置进行管理(包括文件的锁管理),chunk服务器主要存储chunk文件,单个chunk文件最大为64M,以文件的形式保存。

  下面问题来了,对于一个文件系统,主要关心的问题是文件如何写入和读取,对于一个分布式文件系统,我们还要关心系统的可靠性以及一致性,对于GFS的学习,本人也从回答上述问题入手。

  1、文件读取

  GFS分布式系统中,一个文件被划分为多个chunk文件,被存储在多个Chunk服务器中,如果要读取某一个文件,客户端程序先在master服务器中找到该文件的chunk映射关系以及chunk的位置,然后,根据chunk的顺序,直接从Chunk服务器中读取数据。其流程图如下:

  由图中可以看出,数据的读取是由客户端程序直接与Chunk服务器进行交互,因此,对于master节点,并没有太大的流量压力。

  2、数据的写入

  GFS中没有对文件编辑的概念,数据的写入方式也是追加写入,根据论文中的观点,追加写入的方式可以容易使得主备chunk上的数据保持一致性,当chunk文件被追加写入成功后,chunk的版本会被提升,如果某一个chunk的副本数据追加失败,chunk的版本由master节点负责维护和更新。

  在对chunk进行追加写入操作时,master会从相同数据的不同chunk文件中选举出一个主chunk文件,由主chunk来负责执行数据追加的顺序,先来看一张数据写入的流程图:

  这个图中看出,整个GFS系统中数据的流动分为两种,一种是数据流,还有一种是控制流,当客户端往chunk中写数据时,只向一种的一个chunk发送一次数据,不同chunk之间内部进行数据的同步。具体的写入流程如下:

  (1)客户端向master节点请求chunk的位置信息

  (2)master节点返回给客户端所有的chunk文件的位置信息

  (3)客户端向其中的一个chunk服务器发送数据

  (4)当所有的chunk服务器接收到客户端的请求后,客户端请求主chunk写入数据,主chunk确定写入数据的顺序,并将数据写入到本地。

  (5)主chunk通知所有的副chunk按照顺序写入数据

  (6)副本完成写入后通知主chunk。

  (7)主chunk通知客户端数据写入成功或者失败。

  3、GFS文件系统的可靠性

  (1)master节点的可靠性:在GFS文件系统中,master节点的可靠性由日志操作保证,同时,为了减小日志文件的大小,master服务器会定期对日志文件进行一个压缩,形成checkpoint,master节点中数据的恢复只需要checkpoint及其之后的日志操作即可。在GFS文件系统中,还有一个shadow master的存在,当然,在master节点以及shadow master之间会存在一个日志的同步问题。

  (2)chunk冗余:每个chunk文件会有额外的两个备份chunk文件,防止其中的某个chunk文件追加失败或者chunk 服务器宕机而造成数据的丢失。按照HDFS中的分配分配方法,另外两个chunk文件,一个备份在相同的Chunk服务器上,还有一个在其他的chunk服务器上。

  

时间: 2024-12-19 22:26:23

GFS简要学习的相关文章

JavaScript权威设计--JavaScript函数(简要学习笔记十)

1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"likeZqz()".有些些函数是用作内部用的或者为私有函数通常以一条下划线为前缀,就像"_zqzName()". 2.以表达式方式定义的函数 如: var zqz=function (){ return "zhaoqize"; } 在使用的时候必须把它赋值给一个变

linux下的bash编程简要学习

linux下的bash编程简要学习     1.bash是什么: linux运行时系统只会运行系统运行所需要的运行脚本即系统守护进程,一般根据用户自己需求设定和实现的服务需要手动启动,这种服务进程通常由bash启动,脚本中的命令通常被按照一定规则被bash读取视作参数,因此在脚本头部要申明运行的bash类型,bash命令分为内建命令及外部命令,外部命令通过PATH进行依次查找. bash读取命令后将其启动(fork)成为一个进程,依次启动服务     2.bash控制语句:         本地

Spark简要学习

什么是Spark? 在Apache的网站上,有非常简单的一句话,'Spark is a fast and general engine',就是说Spark是一个统一的计算引擎,而且突出fast.那么具体是做什么的?是做large-scale的processing,即大数据处理. Spark is a fast and general engine for large-scale processing. 这句话非常简单,但是它突出了Spark的一些特点:第一个特点就是Spark是一个并行式的.内存

JavaScript权威设计--Window对象之Iframe(简要学习笔记十四)

1.Window对象属性的文档元素(id) 如果在HTML文档中用id属性来为元素命名,并且如果Window对象没有此名字的属性,Window对象会赋予一个属性,它的名字是id属性的值,而他们的值指向表示文档元素的HTMLElement对象. Window对象是以全局对象的形式存在于作用域链的最上层,这就意味着HTML文档中使用的id属性会成为可以被脚本访问的全局变量. 如: <button id="but"/> 就可以通过全局变量but来引用此元素. 2.多窗体窗口(if

JavaScript权威设计--Window对象(简要学习笔记十三)

1.Window对象是所有客户端JavaScript特性和API的主要接入点. Window对象中的一个重要属性是document,它引用Document对象. JavaScript程序可以通过Document对象和它包含的Element对象遍历和管理文档. 2.URL中的JavaScript 在URL后面跟一个JavaScript:协议限定符.里面的代码会作为JavaScript代码进行运行,需用分号分割. 如: <a href="javascript:alert('OK!')"

JavaScript权威设计--JavaScript函数(简要学习笔记十一)

1.函数调用的四种方式 第三种:构造函数调用 如果构造函数调用在圆括号内包含一组实参列表,先计算这些实参表达式,然后传入函数内.这和函数调用和方法调用是一致的.但如果构造函数没有形参,JavaScript构造函数调用的语法是允许省略实参列表和圆括号的. 如: var o=new Object(); //->等价于 var o=new Object; 第四种:使用call()与apply()间接调用(放在后面详细说明) 2.函数的实参与形参——可选形参 先看一个例子: function getA(

JavaScript权威设计--JavaScript数组(简要学习笔记九)

1.数组的创建 如: var a=[1.1,null,"a"]; var b=[1, ,3]; //中间的那个元素是undefined var c=[ , , ] 这里c.length你是不是以为是3? 哈哈,长度应该是2.因为数组直接量的语法允许有可选的结尾逗号. 2.数组索引的其他种类 a[-1.23]=true    //创建一个名为-1.23的属性 a["1000"]=0    //如果是字符串,它就转换为数组的索引 a[1.000]    //和a[1]相

JavaScript权威设计--JavaScript表达式与运算符,语句(简要学习笔记六)

1.delete是一元操作符,用来删除对象属性或者元素. var a={ x:1, y:2 } delete a.x; //删除x属性 “x”in a //false:a对象中已经不存在x属性 alert(a.x) //undefined;这里还是存在“东西”的 就如: var b=[1,2,3]; delete b[0]; b.length //3:还是3,虽然上面已经删除了b[0] 2.void运算符 void忽略操作的值,因此在操作数具有辅助作用的时候使用void来让程序更具语义 例子:

JavaScript权威设计--JavaScript表达式与运算符(简要学习笔记五)

1.3种原始表达式 1.直接量:    1.23    //数字直接量 “hello”    //字符串直接量 ... 2.保留字构成的原始表达式: true    //返回布尔值:真 false    //假 null    //返回一个值:空 3.变量: i    //返回变量i的值 sum    //返回sum的值 2.对象初始化表达式 var p={ x:2.3, y:-1.2 } //一个拥有两个属性成员的对象 对象直接量也可以嵌套: var rea={ upp:{ x:2, y:2