GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,但可以提供容错功能。它可以给大量的用户提供总体性能较高的服务
从概念上来说,一个集群文件系统可以允许多个 *** 作系统载入同一个文件系统并可以在同一时间内向同一文件系统写入数据。现在有许多集群文件系统,包括Sun的Lustre,Oracle的OCFS(Oracle集群文件系统),以及Linux的GFS
有许多方法可以让一个块设备同时被多个服务器所使用。可以分区出一个对多个服务器都可视的SAN(存储局域网)LUN(逻辑单元号),设置好相应的iSCSI(互联网小型计算机系统接口),或使用DRBD(分布式复制块设备)在两台服务器之间复制一个分区。在使用DRBD的时候,将需要在主/主节点中设置好DRBD以使用GFS
还有一些详细的东西,挺多的,可以联系我ls_shang@sinacom
转载表面上看,是一套基于B/S方式实现的分布式管理系统,但其实背后的架构是基于C/S完成的。你以为他是一只鞋吗?其实他是一个吹风机。作为界面化的系统,浏览器框架是不可或缺的,但更加重要的东西在Socket上面。
一、需要解决中央控制端到各节点服务器之间的通信。
这个其实牵扯到一个通信协议的问题,各语言都有自己的socket,thread的库,直接调用即可。但是这个通信协议就需要自己来完成了。既不能太简单,太简单了,明码传输,如果别人获知了这个接口,就很容易执行一些令人讨厌的 *** 作。也不能太复杂,太复杂了等于是给自己找麻烦,所以简单的数据包编解码的工作或者用token验证的方式是需要的。通信协议起码要两种,一种是传输命令执行的协议,一种是传输文件的协议。
二、跨语言的socket通信
为什么要跨语言,主控端和代理端通信,用什么语言开发其实无所谓。但是为了给自己省事,尽可能使用服务器上已经有了的默认语言,Ambari前期采用phppuppet的方式管理集群,这不是不可以,puppet自己解决了socket通信协议和文件传输的问题,可你需要为了puppet在每台服务器上都安装ruby。我是个有点服务器和代码洁癖的人。光是为了一个puppet就装个ruby,我觉得心里特对不起服务器的资源。所以我自己写了一个python的代理端。python是不管哪个linux系统在安装的时候就都会有了。然后主控端的通信,可以用python实现,也可以用php实现,但是考虑到对于更多的使用者来说,改php可能要比改tornado简单许多,所以就没用python开发。hadoop分支版本众多,发布出去,用户要自己修改成安装适合自己的hadoop发行版,就势必要改源码,会php的明显比会python的多。php里面的model封装了所有的 *** 作,而python只是个 *** 作代理人的角色而已。
所以也延伸出一个问题,什么语言用来做这种分布式管理系统的代理端比较合适,我自己觉得,也就是python比较合适了, *** 作系统自带,原生的package功能基本够用。用java和php也可以写agent,但是你势必在各节点预先就铺设好jre或者php运行环境。这就跟为什么用python和java写mapred的人最多是一样的。没人拦着你用nodejs写mapred,也可以写,就是你得在每个节点都装v8的解释引擎,不嫌麻烦完全可以这样干。原理参看map/rece论文,不解释。perl也是 *** 作系统原生带的,但是perl的可维护性太差了,还是算了吧。
所以这就牵扯到一个跨语言的socket问题,理论上来说,这不存在什么问题。但这是理论上的,实际开发过程中确实存在问题,比如socket长连接,通信数据包在底层的封装方式不同。我没有使用xml-rpc的原因之一就是我听说php的xmlrpc跟其他语言的xmlrpc有不同的地方,需要修改才能用,我就没有用这种办法。最早是自己定义的 *** 作协议,这时就遇到了这些问题,所以后来直接采用了thrift方式。就基本不存在跨语言的socket通信问题了。
三、代理端执行结果的获取
无论命令还是文件是否在代理端执行成功,都需要获取到执行结果返回给中央端。所以这里也涉及一个读取节点上的stdout和stderr的问题。这个总体来说不是很难,都有现成的包。当然这个时候你需要的是阻塞执行,而不能搞异步回调。
还有个问题是,我要尽可能使用python默认就带的包,而尽量不让服务器去访问internet下载第三方的包。
还有代理端最重要的一点,就是python的版本兼容性。centos5用python24,centos6用python26,ubuntu基本默认都是27。所以一定要最大限度的保证语言的跨版本兼容性,要是每个 *** 作系统和每一个版本我都写一个代理,我一个人就累死了。
四、浏览器端的model,view,controller
这里面你要封装好所有的通信协议,以及需要在节点上面执行的脚本。发送文件的 *** 作和数据库 *** 作也要在model里面完成。
如果对tcl/tk很熟,也可以写基于 *** 作系统界面方式的管理,不用浏览器就是了。
view对我来说是最痛苦的事,都是现学的jQuery怎么用,前端的工作太可怕了。关于这方面,没有太多可描述的,html和js带给我的只有痛苦的回忆,万恶的undefined。
五、跨 *** 作系统的安装文件封装。
要适应不同的 *** 作系统也是个很麻烦的事情,需要用agent提前获知 *** 作系统的发行分支,版本号。然后去找到对应的安装文件去执行。你不能保证一个分布式系统的集群中所有的节点都可以访问internet,更多的情况是这些节点都存在在一个安全的内网中。只有个别几个节点是可以访问外网的。所以,我势必要把所有的安装文件以及他们的依赖尽可能集中起来。我不确定安装 *** 作系统的lzo,yum或者apt-get会去下什么鬼东西,甚至无论是yum还是apt-get,里面都没有hadoop-lzo的库文件。所以,最好的办法是自己编译打包rpm和deb包。直接安装就好了,别去找repo下载什么。
这就是第五步工作,把需要的依赖的东西自己编译打包成rpm和deb。
deb包很好解决,但是rpm就没那么好办了,需要学习rpm的编译文件如何编写,这块是挺麻烦的,但是这玩意用好了还是挺不错的。现在我自制的安装包里面就已经包含了自己编译的lzo和snappy两种压缩库,以及hadoop-gpl-packaging的rpm和deb。下一个发布的easyhadoop将直接支持centos5,6,suse,以及ubuntu/debian的系统上安装hadoop。已经自带了lzo和snappy以及lzop和snzip。
六、把这些所有东西,整合到一个系统里面。
关联这些所有事情间的联系,整合到一个浏览器界面里面去。写一个分布式的管理脚本不难,写一个界面也不难,但是也许是我的水平不行,这两件事结合起来让他们协同工作还是有点难度的。对我来说,写界面的工作可能更难一点。
Cloudera可能是十来个人在写Manager的东西,ambari也是放到github和apachesvn上面,apache基金会的各种committer在写。easyhadoop没他们功能那么强大,一年来只有我一个人设计架构,功能,各种语言的编码,测试,发布。Fortheloveofgod,WhathaveIdone(英文部分请站在山顶仰天长啸)T_T。从前台到后台,到hadoop和生态系统以及他们的依赖软件的单独patch、编译打包。(系统yum或者apt-get的包不如自己打的好使。)
从时间上来看,全球第一款开源的hadoop部署管理系统应该还是属于ambari,2011年8月开始写的,2012年9月底进入apache的incubator。我是大概2012年8月开始写的easyhadoop,全球第一没赶上,估计国内第一个开源的hadoop管理系统还是可以排上的。
当你和成千上万的其他人同时提交搜索时,这个快照也正在不断地随着这些变化被更新着。与此同时,数据是由数以千计的独立服务器进程处理的,每个都各司其职,从计算出给你提供的相关联广告,到决定搜索结果的排列顺序。 支持谷歌搜索引擎的存储系统必须能够承受每天由运行于数以千计的服务器上的成千上万的独立进程所发出的数百万计的读写请求,几乎不能停机来备份或维护,还必须不断扩容以容纳由谷歌网页抓取机器人添加的日益扩大的众多页面。总体下来,谷歌每天要处理超过20PB。 这可不是谷歌可以从一个现成的存储架构就能完成的。而且对于运行超大规模的数据中心的其他网络和云计算巨头来说也是如此,比如亚马逊和Facebook。虽然大多数数据中心已经通过在一个存储区网络添加更多硬盘容量来解决扩充存储的问题,更多的存储服务器,通常是更多的数据库服务器,因为云环境的性能限制,这些方法却失效了。在云环境下,任何时候都可能有成千上万的活跃用户的数据,而且数据的读写在任何时刻都能达到数千TB。 这不仅仅是一个关于磁盘读写速度的简单问题。以这些卷上的数据流来讲,主要的问题是存储网络的吞吐量;即使有最好的交换机和存储服务器,传统的SAN架构也能成为数据处理的性能瓶颈。 接下来就是老生常谈的扩大存储的成本问题。超大规模网络公司增加容量的频率(举个例子,亚马逊现在每天为其数据中心增加的容量相当于整个公司在2001年全年的容量,根据亚马逊副总裁杰姆斯·汉密尔顿的说法),用大多数数据中心的同样做法来摆平所需的存储,依照所需的管理,硬件和软件成本,花费将是巨大的。这种花费在关系数据库被添加到混合数据库时甚至更高,这取决于一个组织对它们的分割和复制如何处理。 对于这种不断扩展和持久存储的需求,驱使互联网巨头——谷歌,亚马逊,Facebook,微软等等——采取一种不同的存储解决方案:基于对象存储的分布式文件系统。这些系统至少都部分受到其他分布式集群文件系统的启发,如Red Hat的全局文件系统和IBM的通用并行文件系统。 这些云巨头的分布式文件系统的架构把元数据(关于内容的数据)从它存储的数据中分开。这能通过多个副本对数据进行大量并行读写 *** 作,并且抛掉了像“文件锁定”这样的概念。 这些分布式文件系统的影响远远超出了它们为超大规模数据中心而创建的范畴——它们会直接影响那些使用公共云服务的公司(比如亚马逊的EC2,谷歌的AppEngine和微软的Azure)如何开发和部署程序。公司,大学和政府机构寻找一种快速存储和提供大量数据访问的方法正日益变成受云巨头们启发的数据存储系统的新阶段。因此有必要了解一下它们的发展史和过程中所做的工程折衷方案。谷歌文件系统 谷歌是最早面对存储容量问题的主流网络公司中的一家。在2003年,谷歌工程师们找到了问题的答案,就是建立一个可为谷歌数据中心战略定制的分布式文件系统——谷歌文件系统(GFS)。 谷歌文件系统几乎是所有公司云服务的基础。它能够处理数据存储,包括公司的BigTable数据库和为谷歌的AppEngine“平台即服务”的数 据储存,并且为谷歌搜索引擎和其他程序提供数据。谷歌创建谷歌文件系统的设计决定推动了大量云架构下的软件工程技术,反之亦然。谷歌往往把程序数据储存在 大量的文件里,并把文件作为“生产者-消费者队列”使用,数以百计的机器收集的数据可能被写入同一个文件。这个文件可能会由另一个合并或分析数据的应用程 序处理——或许甚至是在数据正被写入的时候。 “这当中的某些服务器一定会出错——因此谷歌文件系统被设计为能够容忍这种错误,不会丢失(太多)数据”。 谷歌为自己保留了大量技术细节,原因很明显。但是由谷歌研究员Sanjay Ghemawat,首席工程师Howard Gobioff和高级工程师Shun-Tak Leung在2003首次发表的报告中提到,谷歌文件系统在设计上是带有一些非常具体的优先考虑的:谷歌想把大量便宜的服务器和硬盘驱动器变成一个可以储 存数百TB数据的能够在出错时自行管理可靠的数据存储。并且它需要被设计成按谷歌的方式收集和读取数据,允许多个应用程序同时把大批量数据添加到系统上, 且能以高速访问。 就像是一个RAID 5存储阵列通过多磁盘放置数据进行出错保护,谷歌文件系统把文件分成固定大小的块,复制到整个服务器集群。因为它们是用着廉价硬盘的电脑,其中一些服务器肯定会出错——因此谷歌文件系统被设计为能够容忍这种错误,不会丢失(太多)数据。 但是RAID和GFS的相同点就到此为止了,因为那些服务器可以分布于网络——既可以在第一个单独的物理数据中心也可以分散于不同的数据中心,取决 于数据的用途。GFS设计主要用于批量处理大量数据。重点是高速读取数据,而不是到文件中某个部分的访问速度,也不是数据写入到文件系统的速度。GFS提 供如此高输出是以牺牲更高密度的读写和更快速度的数据写入为代价的。正如Ghemawat和公司在文件中所说,“在文件中任意位置的小的写入是支持的,但 不一定非要高效。” 这种分布式的性质,随着GFS处理数据量的庞大——数百万的文件,当中很多都超过100MB而且通常都会变成GB——需要一些取舍,以便让GFS和 你通常安装在一台服务器上的文件系统有很大的不同。因为成百上千的独立进程可能同时对一个文件进行写入和读取,GFS需要支持“原子性”数据——在不影响 其他程序的情况下回滚出错的写入。而且它需要以非常低的同步开销保持数据的完整性以避免拖垮性能。 GFS由三层组成:GFS客户端,处理程序数据请求;管理服务器,用内存中的索引追踪数据文件名和所在区块的位置;还有数据存储服务器本身。最初, 为简单起见,GFS为每个集群使用一个单独的管理服务器,因此系统被设计成让管理服务器尽可能避开数据访问。谷歌已经发开出了一个分布式管理服务器系统, 可以控制数百台管理服务器,每一台都能处理大约1亿个文件。 当GFS客户端收到一个特定数据文件的请求,它需要从管理服务器请求数据的位置。管理服务器提供其中一个副本的位置,之后客户端就可以直接与存储服务器进行沟通,用来读写剩下的其他部分。管理服务器就不再参与其中了,除非有错误发生。 为确保数据是高度可用的,GFS舍弃了其他一些东西——比如各副本间的一致性。GFS确实坚持数据的原子性——如果写入失败,它将返回一个错误,然 后将写入回滚到元数据,并产生一个旧数据的副本。但是管理服务器在数据写入上的介入缺失意味着当数据写入到系统时,它不能立刻让副本遍布整个GFS集群。 在处理对数据同时访问和网络限制的必要性之外,该系统遵循谷歌所谓的“宽松一致性模型”。 这意味着GFS对于在必要时从旧的副本提供陈旧的数据完全不在乎——只要数据最终得以更新。管理服务器的追踪变化,或“突变”,当变化发生时,区块中的数据会用版本号来指示。由于一些副本被留下了(或变“旧了”),GFS管理服务器会确保这些区块在更新前不会送至客户端。 但这并不一定发生在已经连接到那些区块的部分。元数据的变更在管理服务器处理这些变更,并将它们反映在元数据前是不可见的。元数据也需要在多个位置 生成副本,以防管理服务器出错——那样的话整个文件系统就丢失了。而且如果在写入过程中管理服务器有错误发生,变更同样会消失。由于谷歌处理数据的方式, 这并不是一个大问题:程序使用的大部分的数据很少变化,而且当变化发生时,数据通常是扩充的而不是原地修改的。 当GFS在为2003年运行的谷歌应用设计出来时,离谷歌开始遭遇扩展性问题并不远。甚至是在公司收购YouTube之前,GFS开始碰壁——很大 原因是谷歌新添加的应用在64M文件大小下工作的不是很好。为了绕过它,谷歌转向了Bigtable,一种基于表格的数据存储,那依稀类似于数据库,位于 GFS之上。Bigtable大多是一次写入,因此变更被作为对表的扩展进行存储的——谷歌将其用于如对Google Docs进行版本控制的类似应用上。 如果你不是在谷歌工作,那上述内容太过于学术性了(虽然它可以帮助AppEngine,谷歌云存储和谷歌其他服务的用户更好地了解台面下是怎么事 儿)。虽然谷歌云存储通过一个网络接口提供了一个公开方式来储存和访问位于GFS上的文件,但是 *** 控GFS的真正接口和工具并不是公开的。但报告称GFS 引领了更广泛使用的分布式文件系统的发展,如:Hadoop分布式文件系统。Hadoop分布式文件系统(HDFS) Hadoop是用Java开发的,作为Apache基金会的一个开源项目,它在网络公司和其他有“大数据”问题的公司间已经有了如下的口碑,它被称 之为“二十一世界的瑞士军刀”。所有这些宣传意味着,你很可能会发现你迟早要以某种形式用Hadoop处理问题而不是用其他的分布式文件系统——特别是当 微软开始将其列入Windows Server的扩展中的时候。 Hadoop是由开发者Doug Cutting在他儿子给一只玩具大象起名后用它命名的,“灵感”来自于GFS和谷歌的MapReduce分布式计算环境。在2004年,Cutting 和其他工作于Apache Nutch搜索引擎项目的人试图寻求一种可以将抓取器和索引带向“网络规模”的方式,Cutting阅读了谷歌关于GFS和MapReduce的论文并开 始动手开发自己的项目。虽然对于Hadoop的大多数热情来自于它由MapReduce启发的分布式处理管理衍生出的分布式数据处理能力,但使用 Hadoop分布式文件系统还是因为它能对大量数据进行处理。 Hadoop是在Apache许可证下开发的,有许多商业和自由发行版可用。我用的版本来自Cloudera公司(Doug Cutting现在的东家)——Cloudera发行版包括了Apache Hadoop(CDH),Cloudera企业平台的开源版本,和Cloudera服务和配置特别版,它可免费支持50个节点。 HortonWorks,该公司与微软合作帮助后者把Hadoop移植到Azure和Windows Server,有其自己的基于Hadoop和HortonWorks数据平台,是一个受限的“技术预览版”。同样还有Apache Core的Debian包,和许多其他开源的或商业的基于Hadoop的某种形式的产品。 HDFS可被用于支持在大量廉价硬件和大数据下广泛的应用。但由于其架构,它不完全适合于通用数据存储,并且放弃了一定的灵活性。HDFS必须废除 某些经常与文件系统有关的事情,以确保它能更好地处理在分布着数百甚至数千台物理机器上的大量数据——如对数据交互访问这种事情。 虽然Hadoop运行于Java上,但是除了它的Java API之外还有许多种方式和HDFS进行交互。有一种C语言版本的API,通过Hadoop的命令行界面,文件可以通过>1 可以模拟出来。2 Google File System (GFS) 是一种分布式文件系统,可以在虚拟机中模拟出来。
虚拟机可以模拟多台计算机,每台计算机运行一个 GFS 节点,这些节点通过网络连接起来组成一个 GFS 集群,实现文件的存储和管理。
3 虚拟机模拟的 GFS 系统可以用于测试和开发,也可以用于教学和研究。
但是需要注意的是,虚拟机的性能和实际环境可能有所不同,需要对测试结果进行评估和调整。 利用云服务器做一个接入点方式:1、手工安装,相关流程参考内容。
2、利用恒讯科技一键自动部署程序。
3、在恒讯科技开通bzz云服务器后,可购买节点搭建服务,费用便宜。
用云服务器来搭建节点的优势:
1、 云服务器可以快速部署,快速上线,从开通到部署上线,仅需30分钟。这是目前已知的最快方案。
2、 云服务器可以动态调整资源,从CPU、内存到磁盘、带宽等资源,都可以在分分钟内完成动态调整。
3、 云服务器具备稳定、可靠、高性能等特点,尤其是网络质量相当高,对于BZZ上主网后,将极大的有利于节点的链接。
GFS的诞生来源于google日益增长的数据量的处理需求,它是一个可扩展的分布式文件系统,用于大型分布式数据密集型应用,在廉价的通用硬件上运行时提供容错机制,并且可以为大量客户端提供较高的聚合性能。
它的设计由当前和预期的应用负载(当时的)和技术环境驱动,与以前的文件系统的假设有着明显不同,因此gfs在设计上有几个不同的points:
当前已部署多个集群用于不同目的,最大的拥有1000多个存储节点,超过300TB的存储服务,并且有数百个客户端连续不断地高负载请求。
前面提到一些对应用负载和技术环境的观察,现在更详细地进行阐述:
虽然GFS不能提供像POSIX标准的API,但它提供一个相似的文件系统接口。文件在目录中按层次结构组织,并以路径名作为标识。支持create、delete、open、close、read and write files。
gfs支持快照和record append *** 作。快照以低代价创建文件副本或者目录树,record append支持多个客户端并发地写文件,保证每个独立客户端append的原子性。
一个gfs集群包含一个master和多个chunkservers,chunkserver被多个客户端访问,如图1所示。每一个都是普通linux机器上运行的用户态服务进程。资源允许的情况下,客户端可以和chunkserver部署在同一台机器上。
文件被划分为固定大小的块。每个chunk由一个独一无二的64位大小的chunk handle所标识,chunk handle在chunk被创建时由master分配。每个chunk的副本分布在多个机器上,系统默认为三副本模式,用户也可以为不同namespace的文件指定不同级别的副本。
master包含文件系统的所有元信息。包含namespace、访问控制权限信息、文件到chunks的映射、当前chunks的位置信息。也控制着全局的活动,像chunk租约管理、gc、chunk迁移等。master通过心跳的方式与每个chunkserver交流来发送它的指令和收集状态。
客户端与master的交互涉及元信息 *** 作,所有数据 *** 作直接与chunkserver交互。gfs不提供POSIX标准API,因此不需要挂接到linux的vnode层。
客户端和chunkserver都不缓存文件数据。大多数应用传输大文件,客户端缓存收益很低。chunks作为本地的文件存储,linux系统有自己的buffer cache,chunkserver不需要再增加缓存。
单master简化了系统的设计,但是会有单点的瓶颈问题,这是必须要解决的。客户端不会从master读写数据文件,客户端请求master它需要的交互的chunkserver信息,并且将其缓存一段时间,后续的 *** 作直接与chunkservers交互。
客户端会发送请求给离它最近的一个副本。实际上,客户端通常会向master请求多个chunk的信息,以减少未来与maser交互的代价。
chunk size定为64MB,相比普通的文件系统的block size更大。每个chunk副本以linux文件的形式存在chunkserver上,仅根据需要来扩展。使用lazy space allocation的方式避免空间浪费。
large chunk size有以下几个优点:
但是large chunk size with lazy space allocation也有其缺点:单个文件可能包含很少数量的chunks,或许只有一个,当许多客户端访问相同文件时这些chunks成为热点。但由于目标应用大多是顺序的读多个large chunk文件,热点并不是主要的问题。
然而GFS第一次用于批处理队列系统时确实出现了热点问题,数百个客户端同时访问一个单chunk文件,存储这个文件的几个chunkserver超负荷运转,当时通过错开应用的启动时间避免了这个问题,一个潜在、长期的解决方法是允许客户端从其它客户端读取数据。
master保存三种类型的元数据:
所有元数据都保存在内存中 。对于元数据的内存 *** 作是很快的,后台任务周期巡检整个状态也是比较简单高效的。周期巡检用于实现chunk gc、在chunkserver故障时重新构造副本、chunk迁移以平衡多个chunkserver的负载和disk usage。
虽然系统的容量受master内存大小的限制,但这并不是一个严重的问题,64MB的chunk只需要不到64byte大小的元信息,如果一定需要更大的文件系统,那么增加内存的代价相比为可靠性、性能和灵活性等付出的代价是较小的。
前两种类型的元数据通过写日志来保证持久化,并且会复制日志到远程机器上。master不需要将chunks的位置信息持久化,而是在master启动和新的chunkserver加入集群时向每个chunkserver询问它的位置信息,之后通过心跳信息监控chunk位置变更信息。chunkserver作为最后一关是确切知道自己本地有没有哪些chunk的,因此维护一个一致性的视图是没有必要的。
operation log 包含元数据的变更记录, 它是GFS的核心 ,它不仅仅是唯一的元数据持久化记录,也表明了并发 *** 作的逻辑时间线。文件、chunks和它们的版本都是由逻辑时间线唯一标识。元数据变更记录在持久化之前对客户端是不可见的,而且日志被复制到多个远程的机器,只有相应的记录在本地和远程都持久化到硬盘了才可以回复客户端。master使用批处理log的方式提高系统的吞吐。
master通过回放日志来恢复文件系统的状态,为提高恢复速度需要保持log量足够小。当log增长超过特定大小时,master会checkpoint它的状态,以加速恢复提高可用性。构建checkpoint可能需要花费一段时间,因此master以一种不delay后续变化的方式来组织内部状态,先switch到一个新的日志文件,使用独立的线程创建checkpoint,新的checkpoint包含了所有switch之前的变化。几百万个文件的集群在一分钟内可以完成,完成后将同时被写入本地和远程。恢复只需要最新的checkpoint和之后的日志文件,旧的checkpoints和日志文件可以完全删除。
GFS使用一个宽松的一致性模型,这种模型可以很好地支持分布式应用程序,而且实现起来简单有效。
file namesapce变化(例如文件创建)是原子的,使用namespace锁。
master的operation log定义了这些 *** 作的全局顺序。
数据变化后文件region的状态取决于变化的类型,是否成功、失败或者是并发的。Table1做了总结。如果所有客户端都能看到相同的数据,无论它们读的是哪个副本,则这个file region是一致的。
数据变化有两种:writes或者record appends。write是指从应用指定offset处开始写数据,record append指即使存在并发冲突,数据也要被原子地append到文件至少一次,但offset是由GFS选定。
GFS保证在一系列成功的mutations后,file region是defined,通过下面两点来保证:
过期的副本将不会再涉及到任何mutation,master也不会将其位置信息回应给客户端,不久后将会被gc。但客户端缓存的信息可能包含过期的副本,缓存失效存在一个时间窗口,文件再次打开也会清除该文件的所有chunk信息。由于大多数文件是append-only,过期的副本通常返回的是过早的结尾而不是过期的数据。
介绍客户端、master和chunkserver之间如何交互来实现数据变化、原子追加写和快照的。
使用租约的方式维护多个副本间一致的mutation order。master授权租约给副本中的一个,称之为primary。primary为chunk的mutaions选择一个顺序,所有副本都按照这个顺序apply。
租约机制最小化了master的管理overhead。租约初始的超时时间是60s,如果chunk一直在变化过程中,primary可以申请续租。这些授权和续租请求由master和chunkserver之间的心跳信息携带。master也可以尝试撤销租约,即使它与primary失去了联系,也可以等租约过期后安全地授权给另外一个副本。
在Figure2中,跟随着写入控制流展示了处理过程:
如果一个写请求比较大或者超出了chunk边界,GFS客户端将它拆为多个写 *** 作,但是多个 *** 作可能与其它客户端并发交叉写入,因此共享的fie region最终可能包含多个不同客户端的碎片,这会造成 一致性模型 中所描述的file region处于consistent but undefined状态。
数据以pipline的机制在chunkserver链上线性传输,而控制流是从客户端到primary再到所有的其它副本。分离数据流和控制流可以更高效地使用网络。可以带来以下好处:
GFS提供原子的append operaton叫作 record append 。传统的write中,客户端指定offset,并发写相同region时不是serializable,最终region可能包含多个客户端的碎片数据。而对于record append,客户端仅指定数据,GFS保证至少一次成功的原子append,offset由GFS选定,与Unix的O_APPEND模式相似。
多个客户端并发 *** 作相同文件是比较重的。如果处理传统的write,客户端需要额外复杂和昂贵的同步逻辑,像分布式锁。而record append仅需要primary增加一点额外的逻辑:primary检查是否并发append数据的chunk会超出max size,如果会超出则将chunk填充到max size,并且告诉所有二级副本同样 *** 作,然后回应客户端指出这个 *** 作应该选择另一个chunk重试;大多数情况下记录是在max size内的,primary将数据append到自己的副本,并告诉所有二级副本按照确切的offset写数据,最后回应给客户端。
如果中间出现错误,客户端重试,相同chunk的副本可能包含不同的数据,可能包含相同的记录或者一部分相同,GFS不保证bytewise identical,仅仅保证数据至少有一次被成功地原子写入。从report success逻辑可以容易得出,数据必须是在某个chunk的所有副本上以相同的offset写入。在此之后,所有副本都与记录end一样长,即使后面不同的副本成为primary,任何将来的记录也将分配到更高的offset或者不同的chunk。根据上述的一致性保证,成功的record append的region是defined和一致的,而中间的region是不一致的(undefined)。GFS的应用可以处理这种不一致的region(272)。
snapshot *** 作拷贝一份文件或者目录树,几乎是实时的,同时最大程度减少对正在进行中的mutation的干扰。
像AFS一样,使用标准的COW技术实现snapshot。当master接收到一个snapshot请求,首先将所有涉及到chunks的租约撤销,这保证了这些chunks后续的write将会先请求master查找租约持有者,master会创建一个新的副本来回应。
租约被撤销或者过期后,master将这个 *** 作记录日志到disk。新创建的snapshot引用元数据相同的chunks。
当snapshot *** 作完成后,客户端第一次要写chunk C,发送请求给master查询持有租约者,master察觉到chunk C的引用大于1,则让每个含有当前chunk副本的chunkserver创建一个新的chunk叫作C',所有创建都使用本地的副本,相比100Mb的网络本地速度大约是三倍速度。master授权租约给新的chunk C'中的一个并且回复给客户端,之后正常地写chunk。整个过程对客户端是透明的。
master执行所有的namespace *** 作。另外,它管理整个系统的chunk副本:
接下来,详细探讨这些细节。
许多master *** 作可能花费较长一段时间,比如snapshot *** 作需要撤销相关的所有chunks的租约。因此为了不delay其它master *** 作,在namesapce的regions上使用locks来确保串行化。
GFS没有按目录列出该目录中所有文件的结构,也不支持文件和目录的别名(unix中的硬链和软链)。GFS将完整的路径名到元数据的映射表作为它的逻辑namespace。使用前缀压缩,这个表可以有效保存在内存中。namespace tree中的每个节点都有一个关联的读写锁。
每个master *** 作在运行前都会获取一组锁。如果涉及到/d1/d2//dn/leaf,它将获取目录名称/d1、/d1/d2、、/d1/d2//dn上的读锁,完整路径/d1/d2//dn/leaf的读锁或者写锁。leaf可以是文件或者目录。
创建文件不需要对父级目录加锁,因为没有"目录"的概念不会修改它,而加读锁是防止它被删除、重命名或者snapshot。这种锁机制的好处是允许相同目录下并发的mutations。
一个GFS集群通常具有分布在多个机架上的数百个chunkserver,这些chunkserver也会被相同或者不同机架的数百个客户端访问。不同机架上的两台计算机之间的通信可能会跨越一个或者多个网络交换机。另外进出机架的带宽可能小于机架内所有计算机的总带宽。多级分布式对如何分发数据以实现可伸缩性、可靠性和可用性提出了独特的挑战。
副本放置策略有两个目的:最大化数据可靠性和可用性,最大化网络带宽利用率。不仅要在多台机器上放置,还要在多个racks上,即使整个racks损坏也可以确保部分副本保持可用。也可以利用多个racks的总带宽。
chunk副本创建有三个原因:
当master创建新的chunk时,根据几个因素考虑如何放置新的副本:
当chunk可用副本的数量低于用户指定时,master会重新复制。可能发生在几种情况:
需要重新复制的chunk根据以下几个因素确定优先级:
master限制集群和每一个chunkserver内的活跃的clone数量,另外chunkserver通过限制其对源chunkserver的读请求来限制在每个clone *** 作上花费的带宽。
master会定期重新平衡副本:检查当前副本的分布,迁移副本以获得更好的磁盘空间利用率和负载平衡。同样通过此过程,master逐渐填充一个新的chunkserver。另外,master通常更倾向于移除具有低磁盘利用率chunkservers上的副本,以平衡空间使用。
当文件被删除时,master记录日志,但不会立即回收资源,而是将文件重命名为包含删除时间戳标记的隐藏名称。如果这些文件存在时间超过三天(时间可配置),master巡检时会将其删除。在此之前,仍然可以用特殊名称来读取文件,并且可以重命名为正常名称来取消删除。当从namesapce中删除隐藏文件时,其内存元数据将被删除,这有效切断了所有chunk的连接,在对chunk namespace的扫描中,master识别出孤立的chunk并清除元数据。在心跳信息中,每个chunkserver报告其拥有的chunks子集,而master将回应不在存在于master元数据中的所有的chunk的标识。chunkserver可以自由删除此类chunk的副本。
这种gc机制相比立即删除有以下几个优点:
这种机制主要的缺点是当存储空间紧张时,延迟有时会影响用户的使用,重复创建和删除临时文件的应用可能无法立即重用存储。如果删除的文件再次被明确删除,GFS将通过加快存储回收来解决这些问题。还允许用户将不同的复制和回收策略应用于不同的namespace的不同部分中。
如果一个chunkserver故障或者chunk丢失了mutations,这个chunk副本可能是过期的。对于每个chunk,master都维护了一个chunk版本号。
当master授权租约给一个chunk时,这个chunk的版本号增加1,如果一个副本当前不可用了,则其版本号将不会领先。当chunkserver重新启动并报告其chunks集合和相关联的版本号时,master将检测到该chunkserver上具有过期的副本。如果master看到的版本号大于它记录的版本号,则认为在授权租约时失败了,因此将较高的版本号更新。
master在常规gc中删除旧的副本。另一个保护措施,在master回应客户端哪个chunk持有租约或者clone *** 作中chunkserver从另一个chunkserver读取chunk时会包含chunk的最新版本号。客户端或者chunkserver在执行 *** 作时会验证版本号。
这个系统最大的挑战之一是处理经常故障的组件。组件的质量和数量造成的问题会超出预期,组件故障可能造成系统不可能,甚至数据错误。接下来讨论GFS如何应对这些挑战,还有系统如何诊断不可避免问题。
使用两个简单有效的方式保证系统的高可用:快速恢复和复制。
master和chunkserver的恢复都是秒级别的。
master维护每个chunk的副本数量,当chunkserver下线或者checksum检测出错误副本时,master会通过已有副本来复制。尽管复制提供了很好的解决方式,但仍在探索其它形式的跨服务器冗余方案,例如奇偶校验或者纠删码,以适应不断增长的只读存储需求。在非常松耦合的系统中实现这些更复杂的冗余方案更具有挑战性。
master的 *** 作日志和checkpoint会被复制到多台机器上,状态的变化只有在本地和所有副本上都持久化以后才可以commit。master进程负责所有的mutations以及后台任务,当它宕机时可以很快重启,如果机器或者磁盘故障,GFS的外部监控将使用日志在其它节点重启新的master进程。在master宕机时,master的备节点只提供只读服务,它们不与master保持强一致,可能会落后于master,通常在1/4秒内。它们保证了那些不介意读到过期数据的应用的高可用读。类似于chunk的primary机制,master的备按照相同的序列应用日志。与master一样,在启动时从每个chunkserver拉取chunks的位置信息,与它们频繁交换握手消息来监控其状态。
每个chunkserver使用checksum来检测存储数据的损坏。数据损坏的chunk可以通过其它的副本来恢复,但是通过副本间比较来检验数据是不切实际的。正常的副本也不是完全一样的,如前文所讲,原子的append并不能保证完全一样的副本。因此每个chunkserver会维护自己的checksum。
每个chunk分为多个64kb的blocks,每个block包含一个32位的checksum,与其它元数据一样,checksum保存在内存中,依靠log持久化,与用户数据分离。
对于读,chunkserver在返回数据给请求者前先检测checksum,确保不会将出错的数据传输给其它chunkservers或者客户端。如果数据是坏的,chunkserver将错误返回给请求者并报告给master,请求者将会去读其它副本, master将会根据其它副本重新克隆一份。当新的副本创建以后,master指示chunkserver将错误的副本删除。checksum的计算不涉及I/O,对读的影响比较小,客户端通常尝试使用对齐block边界读来减少overhead。
为append写是做了checksum计算上的优化的,因为append写是主要的负载(相比于overwrite)。GFS只增量地更新最后部分block的checksum,为新的block的计算新的checksum。这样即使block已经损坏,新的checksum将与存储的数据不会匹配,下次读时将会与正常一样被检测出来。
如果一个写请求要写一个chunk中已存在的region,必要要先检验region的第一个和最后一个block的checksum,然后再重写,最后计算新的checksums。因为第一个和最后一个block可能含有不被重写的内容,如果这部分数据是损坏的,则新的checksum将包含错误的数据。
在idle时,checkserver可以扫描并检查不活跃的chunks,可以检测到冷chunks的错误,一旦错误被检测到,master可以创建一个新的副本。
GFS在设计上与传统文件系统有很多不同,这些点是基于对当时应用负载和技术环境的观察所重新设计,将组件故障看作平常的事件而非异常,为大文件的读取和追加写做优化,扩展和放宽了标准的文件系统接口以改善整个系统。通过监控、复制以及快速恢复能力提供容错能力,使用checksum机制来校验数据的正确性。通过将控制流和数据流分离,数据直接在chunkservers、客户端之间传输,为许多并发的各种任务的读取和写入提供了高吞吐量。大chunk size和租约机制使得master的 *** 作足够轻量化,使得这样一个简单中心化的master不会成为瓶颈。
GFS成功地满足了google的存储需求,作为研究、开发和数据处理的存储平台广泛地应用于google内部。
下载客户端后安装程序有些人看到这个节点标志后,不知道怎么去做。也有些人限于自身的条件,没有条件通过电脑做节点测试等等问题,做以下解答一、节点的作用,简单概况为:1、仓储作用2、安全验证作用3、挖pi作用4、区块链的“块”二、想通过电脑做测试的旷工,需具备以下条件:1、软件必须在电脑上运行,手机上不能运行;2、台式机、笔记本电脑都可以,平板电脑不可以;3、电脑不要过于陈旧, *** 作系统要在64位以上;4、每部电脑只可以运作一个pi账户,不能多账号运作。三、不方便通过电脑测试的旷工:1、如果不方便电脑运行节点软件,只是想继续挖矿,也可以不用电脑申请节点试点,仍然像往常一样继续用手机挖矿,没什么影响。2、即使通过电脑下载了节点软件、挖矿,并非就具有了试点资格。你还需要申请做节点试点;申请成功后才可以做试点、被选中的节点可以优先进行kyc,但不开通内转。
用什么VPS搭建V2Ray服务器比较好?一键搭建Brook服务器推荐你使用Vultr(推荐)、搬瓦工(BandwagonHOST)、Hostwinds等大公司的VPS。其中,Vultr可以方便且无限制地免费更换IP,而且在全球拥有17个数据中心,但线路没有对亚洲和中国大陆进行特别优化,不同数据中心对中国大陆不同地区的速度和稳定性有差别,综合性价比最高;其次,我推荐你使用BandwagonHOST(搬瓦工),因为它的速度和稳定性更好,尤其是CN2/CN2GIA/香港线路,速度和稳定性都是首屈一指的,CN2线路套餐的综合性价比最高,用过都说好;鉴于Hostwinds虽然在国外口碑非常好,但IP地址资源比较少,被GFW照顾后,不方便更换IP,所以我不再推荐。如果你是老鸟的话,任何一家VPS都有值得推荐的优势,如果你追求速度和稳定性的话,我推荐您使用有中国电信CN2/CN2GIA高端线路或中国联通CUVIP高端线路的VPS,当然如果有香港/台湾/日本地区的数据中心就更好,网络延迟低,速度也比较快。虽然这些线路很好,但价格也是比较贵,尤其香港/台湾/日本地区的CN2/CN2GIA/CUVIP线路过于昂贵,普通用户真心用不起,我们一般选择美国或欧洲机房的这些高端线路,性价比非常高。关于Vultr的账户注册、套餐购买和VPS服务器系统安装与远程管理的详细使用教程,请参考最新Vultr账户注册、
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)