资源描述
Google文件系统GFSGoogle设计GFS的动机为了满足为了满足GoogleGoogle迅速增长的数据处理需求迅速增长的数据处理需求,需要需要一个支持海量存储的文件系统一个支持海量存储的文件系统购置昂贵的分布式文件系统与硬件?购置昂贵的分布式文件系统与硬件?Google设计GFS的动机为什么不使用当时现存的文件系统?为什么不使用当时现存的文件系统?GoogleGoogle所面临的问题与众不同所面临的问题与众不同不同的工作负载,不同的设计优先级(廉价、不可靠的硬不同的工作负载,不同的设计优先级(廉价、不可靠的硬件)件)需要设计与需要设计与GoogleGoogle应用和负载相符的文件系统应用和负载相符的文件系统GFS的假设与目标硬件出错是正常而非异常硬件出错是正常而非异常系统应当由大量廉价、易损的硬件组成系统应当由大量廉价、易损的硬件组成必须保持文件系统整体的可靠性必须保持文件系统整体的可靠性主要负载是流数据读写主要负载是流数据读写主要用于程序处理批量数据,而非与用户的交互或随机主要用于程序处理批量数据,而非与用户的交互或随机读写读写数据写主要是数据写主要是“追加写追加写”,“插入写插入写”非常非常少少需要需要存储大尺寸的文件存储大尺寸的文件存储的文件尺寸可能是存储的文件尺寸可能是GBGB或或TBTB量级,而且应当能支持存量级,而且应当能支持存储成千上万的大尺寸文件储成千上万的大尺寸文件GFS设计原则组件失效被认为是组件失效被认为是常态事件常态事件,而不是,而不是意外事件意外事件。能应付对能应付对大型大型/超大型超大型文件处理。文件处理。绝大部分文件的修改是采用在绝大部分文件的修改是采用在文件尾部文件尾部追加数追加数据,而不是据,而不是覆盖覆盖原有数据的方式。原有数据的方式。应用程序和文件系统应用程序和文件系统APIAPI的的协同协同设计提高了整个设计提高了整个系统的灵活性。系统的灵活性。支持支持大量用户大量用户同时访问。同时访问。系统交互设计设计GFSGFS系统系统时,一个重要的原则是时,一个重要的原则是最小化所有最小化所有操作和操作和MasterMaster节点节点的的交互。交互。u租约和租约和变更变更顺序顺序u数据流数据流u原子的记录原子的记录追加追加u快照快照租约和变更顺序变更是一个会改变变更是一个会改变Chunk Chunk 内容或者元数据的操作内容或者元数据的操作,比,比如写入操作或者记录追加操作。变更操作会在如写入操作或者记录追加操作。变更操作会在Chunk Chunk 的所有副本上执行。我们使用的所有副本上执行。我们使用租约(租约(leaselease)机制来)机制来保持多个副本间变更顺序的一致性。保持多个副本间变更顺序的一致性。Master Master 节点为节点为Chunk Chunk 的一个副本建立一个租约,我们把这个副本叫的一个副本建立一个租约,我们把这个副本叫做主做主ChunkChunk。主。主Chunk Chunk 对对Chunk Chunk 的所有更改操作进行的所有更改操作进行序列化。所有的副本都遵从这个序列进行修改操作。序列化。所有的副本都遵从这个序列进行修改操作。因此,修改操作全局的顺序首先因此,修改操作全局的顺序首先Master Master 节点选择的节点选择的租约的顺序决定,然后由租约中主租约的顺序决定,然后由租约中主Chunk Chunk 分配的序列分配的序列号决定。号决定。设计租约机制的目的是为了最小化设计租约机制的目的是为了最小化MasterMaster节点的管理负担。节点的管理负担。租约和变更顺序客户机向Master 节点询问哪一个Chunk 服务器持有当前的租约,以及其它副本的位置。Master节点将主Chunk 的标识符以及其它副本的位置返回给客户机。客户机缓存这些数据以便后续的操作。客户机把数据推送到所有的副本上。客户机可以以任意的顺序推送数据。Chunk 服务器接收到数据并保存在它的内部LRU 缓存中,一直到数据被使用或者过期交换出去。当所有的副本都确认接收到了数据,客户机发送写请求到主Chunk 服务器。主Chunk 把写请求传递到所有的二级副本。每个二级副本依照主Chunk 分配的序列号以相同的顺序执行这些操作。所有的二级副本回复主Chunk,它们已经完成了操作。主Chunk 服务器回复客户机。任何副本产生的任何错误都会返回给客户机。数据流为了提高网络效率,采取了把为了提高网络效率,采取了把数据流和控制流数据流和控制流分开的措施。分开的措施。在控制流从客户机到主在控制流从客户机到主ChunkChunk、然后再到所有二、然后再到所有二级副本的同时,数据以管道的方式,顺序的沿级副本的同时,数据以管道的方式,顺序的沿着一个精心选择的着一个精心选择的Chunk Chunk 服务器链推送。服务器链推送。目标是充分利用每台机器的带宽,避免网络瓶目标是充分利用每台机器的带宽,避免网络瓶颈和高延时的连接,最小化推送所有数据的延颈和高延时的连接,最小化推送所有数据的延时。时。数据流为了充分利用每台机器的带宽,数据沿着一个为了充分利用每台机器的带宽,数据沿着一个Chunk Chunk 服务器链顺序的推送。服务器链顺序的推送。为了尽可能的避免出现网络瓶颈和高延迟的链为了尽可能的避免出现网络瓶颈和高延迟的链接,每台机器都尽量的在网络拓扑中选择一台接,每台机器都尽量的在网络拓扑中选择一台还没有接收到数据的、离自己最近的机器作为还没有接收到数据的、离自己最近的机器作为目标推送数据。目标推送数据。利用基于利用基于TCPTCP连接的、管道式数据推送方式来最连接的、管道式数据推送方式来最小化延迟。小化延迟。数据流假设客户机把数据从假设客户机把数据从Chunk Chunk 服务器服务器S1S1推送到推送到S4S4。它把数据推送到最。它把数据推送到最近的近的ChunkChunk服务器服务器S1S1。S1S1把数据推送到把数据推送到S2S2,因为,因为S2S2和和S4S4中最接近的中最接近的机器是机器是S2S2。同样的,。同样的,S2S2把数据传递给把数据传递给S3S3和和S4S4之间更近的机器,依次之间更近的机器,依次类推推送下去。我们的网络拓扑非常简单,通过类推推送下去。我们的网络拓扑非常简单,通过IP IP 地址就可以计地址就可以计算出节点的算出节点的“距离距离”。原子的记录追加传统方式写入操作传统方式写入操作客户程序会指定数据写入的客户程序会指定数据写入的偏移量,对偏移量,对同一个同一个regionregion的并行写的并行写入操作不是串行入操作不是串行的,的,regionregion尾部可能会包含多个不同客户机写尾部可能会包含多个不同客户机写入的数据入的数据片段。片段。记录记录追加追加客户机只需要指定要写入的客户机只需要指定要写入的数据,数据,GFSGFS保证至少有一次原子的写保证至少有一次原子的写入操作成功入操作成功执行,执行,写入的数据追加到写入的数据追加到GFSGFS指定的偏移位置上,之指定的偏移位置上,之后后GFSGFS返回这个偏移量给返回这个偏移量给客户机。客户机。记录追加成功记录追加是一种修改操作,它也遵循前面描述的控制流程。记录追加是一种修改操作,它也遵循前面描述的控制流程。客户机把数据推送给文件最后一个客户机把数据推送给文件最后一个Chunk Chunk 的所有副本,之后的所有副本,之后发送请求给主发送请求给主ChunkChunk。主。主ChunkChunk会检查这次记录追加操作是否会检查这次记录追加操作是否会使会使Chunk Chunk 超过最大尺寸(超过最大尺寸(64MB64MB)。如果超过了最大尺寸,)。如果超过了最大尺寸,主主Chunk Chunk 首先将当前首先将当前Chunk Chunk 填充到最大尺寸,之后通知所有填充到最大尺寸,之后通知所有二级副本做同样的操作,然后回复客户机要求其对下一个二级副本做同样的操作,然后回复客户机要求其对下一个Chunk Chunk 重新进行记录追加操作。(重新进行记录追加操作。(记录追加的数据大小严格记录追加的数据大小严格控制在控制在Chunk Chunk 最大尺寸的最大尺寸的1/41/4,这样即使在最坏情况下,数据,这样即使在最坏情况下,数据碎片的数量仍然在可控的范围。碎片的数量仍然在可控的范围。)通常情况下追加的记录不)通常情况下追加的记录不超过超过Chunk Chunk 的最大尺寸,主的最大尺寸,主Chunk Chunk 把数据追加到自己的副本把数据追加到自己的副本内,然后通知二级副本把数据写在跟主内,然后通知二级副本把数据写在跟主Chunk Chunk 一样的位置上,一样的位置上,最后回复客户机操作成功。最后回复客户机操作成功。记录追加失败如果记录追加操作在任何一个副本上失败了,客户端就需要如果记录追加操作在任何一个副本上失败了,客户端就需要重新进行操作。重新进行记录追加的结果是,同一个重新进行操作。重新进行记录追加的结果是,同一个Chunk Chunk 的不同副本可能包含不同的数据,或者重复包含一个记录全的不同副本可能包含不同的数据,或者重复包含一个记录全部或者部分的数据。部或者部分的数据。一致性保障如果操作成功执行,数据一定已经写入到如果操作成功执行,数据一定已经写入到Chunk Chunk 的所有副本的相同偏移位置上。这之后,所有的的所有副本的相同偏移位置上。这之后,所有的副本至少都到了记录尾部的长度,任何后续的记副本至少都到了记录尾部的长度,任何后续的记录都会追加到更大的偏移地址,或者是不同的录都会追加到更大的偏移地址,或者是不同的ChunkChunk上,即使其它的上,即使其它的Chunk Chunk 副本被副本被Master Master 节点节点选为了主选为了主ChunkChunk。就一致性保障模型而言,记。就一致性保障模型而言,记录追加操作成功写入数据的录追加操作成功写入数据的region region 是已定义的是已定义的(因此也是一致的),反之则是不一致的(因(因此也是一致的),反之则是不一致的(因此也就是未定义的)。(此也就是未定义的)。(2.7.22.7.2中说了程序可以中说了程序可以处理不一致的区域)。处理不一致的区域)。什么是快照pSNIA(SNIA(存储网络行业协会存储网络行业协会)对快照对快照(Snapshot)(Snapshot)的定的定义是:关于指定数据集合的一个完全可用拷贝,义是:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点该拷贝包括相应数据在某个时间点(拷贝开始的时拷贝开始的时间点间点)的映像。快照可以是其所表示的数据的一个的映像。快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品副本,也可以是数据的一个复制品。p而从具体的技术细节来讲,快照是指向保存在存而从具体的技术细节来讲,快照是指向保存在存储设备中的数据的引用标记或指针。我们可以这储设备中的数据的引用标记或指针。我们可以这样理解,快照有点像是详细的目录表,但它被计样理解,快照有点像是详细的目录表,但它被计算机作为完整的数据备份来对待。算机作为完整的数据备份来对待。p快照操作几乎可以瞬间完成对一个文件或者目快照操作几乎可以瞬间完成对一个文件或者目录树(录树(“源源”)做一个拷贝,并且几乎不会对)做一个拷贝,并且几乎不会对正在进行的其它操作造成任何干扰。正在进行的其它操作造成任何干扰。p用户可以使用快照迅速的创建一个巨大的数据用户可以使用快照迅速的创建一个巨大的数据集的分支拷贝(而且经常是递归的拷贝拷贝),集的分支拷贝(而且经常是递归的拷贝拷贝),或者是在做实验性的数据操作之前,使用快照或者是在做实验性的数据操作之前,使用快照操作备份当前状态,这样之后就可以轻松的提操作备份当前状态,这样之后就可以轻松的提交或者回滚到备份时的状态。交或者回滚到备份时的状态。快照使用的技术快照使用的是标准的快照使用的是标准的COWCOW(copy-on-writecopy-on-write写时复写时复制)技术。制)技术。意思上就是:在复制一个对象的时候并不是真正意思上就是:在复制一个对象的时候并不是真正的把原先的对象复制到内存的另外一个位置上,的把原先的对象复制到内存的另外一个位置上,而是在新对象的内存映射表中设置一个指针,指而是在新对象的内存映射表中设置一个指针,指向源对象的位置,并把那块内存的向源对象的位置,并把那块内存的Copy-On-Copy-On-WriteWrite位设置为位设置为1.1.在你还在上学的时候,你的父母要你不要看电视,而去复习在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书。这就是你才真正捡起课本看书。这就是“拖延战术拖延战术”,直到你非要,直到你非要做的时候才去做。做的时候才去做。当然,这种事情在现实生活中时往往会出事,但其在编程世当然,这种事情在现实生活中时往往会出事,但其在编程世界中摇身一变,就成为了最有用的技术,正如界中摇身一变,就成为了最有用的技术,正如C+C+中的可以随中的可以随处声明变量的特点一样,处声明变量的特点一样,ScottMeyersScottMeyers推荐我们,在真正需要推荐我们,在真正需要一个存储空间时才去声明变量(分配内存),这样会得到程一个存储空间时才去声明变量(分配内存),这样会得到程序在运行时最小的内存花销。执行到那才会去做分配内存这序在运行时最小的内存花销。执行到那才会去做分配内存这种比较耗时的工作,这会给我们的程序在运行时有比较好的种比较耗时的工作,这会给我们的程序在运行时有比较好的性能。必竟,性能。必竟,20%20%的程序运行了的程序运行了80%80%的时间。的时间。COW技术在对新的对象执行读操作的时候,内存数据不发生任何在对新的对象执行读操作的时候,内存数据不发生任何变动,直接执行读操作;而在对新的对象执行写操作时,变动,直接执行读操作;而在对新的对象执行写操作时,将真正的对象复制到新的内存地址中,并修改新对象的将真正的对象复制到新的内存地址中,并修改新对象的内存映射表指向这个新的位置,并在新的内存位置上执内存映射表指向这个新的位置,并在新的内存位置上执行写操作。行写操作。这个技术需要跟虚拟内存和分页同时使用,好处就是在这个技术需要跟虚拟内存和分页同时使用,好处就是在执行复制操作时因为不是真正的内存复制,而只是建立执行复制操作时因为不是真正的内存复制,而只是建立了一个指针,因而大大提高效率。但这不是一直成立的,了一个指针,因而大大提高效率。但这不是一直成立的,如果在复制新对象之后,大部分对象都还需要继续进行如果在复制新对象之后,大部分对象都还需要继续进行写操作会产生大量的分页错误,得不偿失。所以写操作会产生大量的分页错误,得不偿失。所以COWCOW高效高效的情况只是在复制新对象之后,在一小部分的内存分页的情况只是在复制新对象之后,在一小部分的内存分页上进行写操作。上进行写操作。怎样实现快照当当Master 节点收到一个快照请求,它首先取消作快节点收到一个快照请求,它首先取消作快照的文件的所有照的文件的所有Chunk 的租约。这个措施保证了后的租约。这个措施保证了后续对这些续对这些Chunk 的写操作都必须与的写操作都必须与Master 交互交互交互交互以找到租约持有者。这就给以找到租约持有者。这就给Master 节点一个率先创节点一个率先创建建Chunk 的新拷贝的机会。的新拷贝的机会。租约取消或者过期之后,租约取消或者过期之后,Master 节点把这个操作以节点把这个操作以日志的方式记录到硬盘上。然后,日志的方式记录到硬盘上。然后,Master节点通过节点通过复制源文件或者目录的元数据的方式,把这条日志记复制源文件或者目录的元数据的方式,把这条日志记录的变化反映到保存在内存的状态中。新创建的快照录的变化反映到保存在内存的状态中。新创建的快照文件和源文件指向完全相同的文件和源文件指向完全相同的Chunk 地址。地址。Thank you!Thank you!
展开阅读全文