0 构建过程:
组件失效是一种常态:
应用程序bug 操作系统Bug 人为失误 硬盘 内存 连接器 网络 电源失效等造成的问题
因此需要持续监控, 错误侦测,灾难冗余,自动恢复的机制,
这样就是GFS慢慢构建成骨架的过程。
基于数亿个对象和TB级别数据量, 管理已KB为单位的文件显然不明智, IO和Block尺寸都需要重新考虑。
真实生活中,对文件随机写入操作几乎不存在,一旦写完,对文件的操作就只有读,通常都是顺序读,
大量的数据都符合上述规律, 对于海量文件的访问模式,客户端对数据的缓存没有意义,因为大部分程序要么以流的方式读取一个巨大文件, 要么工作集太大根本无法被缓存(无需考虑缓存相关的问题也简化了客户端和整个系统的设计和实现)
数据的追加操作是性能优化和原子性保证主要考量因素。
2 设计概述
2.1 设计预期
系统工作负载主要由两种读写操作组成: 大规模流式读写a和小规模随机读写b,
a方式通常一次读取1M甚至更多数据,来自同一客户机的连续操作通常读取同一文件中连续的一个区域,
b方式通常是在某个文件某个随机位置读取几个KB数据,如果应用程序对性能关注,通常将小规模随机读取
操作合并并排序,之后按顺序批量读取,这样避免了文件中前后来回移动读取位置。---??? 怎么实践
文件通常被用于 生产者--消费者队列,通常有数百个生产者,每个生产者进程运行在一台机器上,
同时对一个文件进行追加操作,实现最小的同步开销来实现原子的多路追加数据操作是必不可少的,
高性能的稳定网络带宽远比低延迟重要。
GFS API接口提供了 API接口函数, 快照 和 记录追加操作,
快照---> 以很低的成本创建一个文件或者目录树拷贝
记录追加---> 允许多个客户端同时对一个文件进行数据追加操作并保证每个操作都是原子性。
记录追加在生产者消费者队列以及多路结果合并中,多个客户端可以在不需要额外同步锁定情况下对同一个文件进行追加数据。 这点对于构建大型分布式应用非常重要。
2.3 架构
GFS存储的文件被分割成固定大小的Chunk(块),Chunk创建的时候会被分配全球唯一的64位Chunk标识,
Master节点管理文件系统元数据, 包括(文件和Chunk的对应关系,每个Chunk副本存放地点,名字空间, 访问控制权限,文件 , Chunk映射信息 , Chunk位置)
Master接管管理系统范围内的活动 包括(Chunk租用管理,孤儿Chunk回收,Chunk服务器之间的迁移,Master心跳周期和每个Chunk服务器通讯)
2.4 单一Master节点:
单一Master节点策略大大简化了系统设计,可以通过全局信息精准定位Chunk的位置以及进行复制决策,
简单解释下读取流程:
客户端把文件名和程序指定的字节偏移,根据固定Chunk大小,转换成文件Chunk索引,然后将文件名和Chunk索引发送给Master节点,Master节点将相应得Chunk标识和副本位置信息发送给客户端,
客户端用文件名和Chunk索引作为key来缓存这些信息。
然后客户端发送请求到其中一个副本处,请求信息包含chunk标识和字节范围,在后续的对这个Chunk读写
操作中,客户端不在和Master节点通讯,除非客户端缓存的元数据信息过期或者文件被重新打开.
真实应用中,客户端通常在一次请求中查询多个Chunk信息,Master回应也会包含紧跟着这些请求Chunk后面的多个Chunk信息。
2.5 Chunk尺寸:
选择64M这个尺寸有几个重要优点:
1 减少和Master节点通讯需求,一次获取足够多的数据范围对降低工作负载来说效果明显。
2 客户端可以轻松缓存1TB工作数据集所有的Chunk位置信息
3 较大的Chunk尺寸客户端可以对一个块进行多次操作,这样能和Chunk服务器保持较长的TCP连接,从而减少网络负载
4 较大的Chunk尺寸减少Master节点需要保存元数据的数量,从而能够保证将元数据全部放在内存中
2.6 元数据
元数据中存储的 文件和Chunk的命令空间, 文件和Chunk的对应关系,每个Chunk副本的存放地点,
前两种也会通过记录变更日志方式保存到系统日志文件中,保存后日志也会被恢复到其他远程Master服务器上,这种日志方式能够简答可靠更新Master服务器状态,并且也不会导致Master服务器崩溃导致的数据不一致风险。
附带说明: 虽然元数据都会在Master服务器内存中存放,但是Master服务器不会持久保存Chunk位置信息,
Master服务器在启动时,或者在新的Chunk服务器加入时,会向各个Chunk服务器轮询Chunk信息。
2.6.1 内存中的数据结构:
基于内存的Master服务器能够简单高效周期性扫描自己保存的全部状态信息,同时也会周期性扫描和实现
Chunk垃圾收集,在Chunk服务器失效时重新复制数据,通过Chunk迁移实现跨Chunk服务器负载均衡以及磁盘使用情况统计。
基于内存的Master虽然会有内存受限问题,但是实际应用中,这并不是一个非常严重的问题,
Master服务器只需要不到64字节的元数据就能管理一个64M的Chunk,并且保存的文件名是用前缀压缩算法压缩过的。
即使需要支持更大的文件系统,为Master服务器增加额外内存的费用是很小的,通过增加有效费用,就能把元数据全部保存在内存中,增强了系统简洁性,可靠性,高速度处理和灵活性也是更划算的事情。
2.6.2 Chunk位置:
Master服务器并不持久化保存哪个Chunk服务器存有指定Chunk副本信息,会在启动的时候轮询Chunk服务器以获取这些信息,并定期轮询以获取更新,这种方式向比较将Chunk位置信息持久保存在Master服务器上更简单,这种设计简化Chunk服务器加入集群,离开,更名,失效,重启下和Master服务器数据同步的问题,并且真实场景中,比如在拥有数百台服务器集群中这种事件经常发生。
并且只有Chunk服务器才知道自己的Chunk信息。相对于Master服务器去拉的方式,用Chunk服务器的推方式更好。
2.6.3 操作日志:
操作日志是元数据唯一的持久化存储记录,同时也作为判断同步操作顺序的逻辑事件基线
文件和Chunk, 以及它们的版本,都由它们创建的逻辑时间唯一永久标识。
我们必须保证操作日志完整性,元数据变化被持久化后,并且日志复制到多台远程机器后,才会响应客户端
的操作请求,Master服务器在灾难恢复时,通过重演操作日志把文件系统恢复到最近状态,
为了缩短Master机器启动时间,我们必须使日志足够小,Master服务器在日志增长到一定量时会对系统做一次CheckPoint,将所有状态数据写入到一个Checkpoint文件, 在灾难恢复时,Master服务器会从磁盘读取这个Checkpoint文件并重演Checkpoint之后的有限个日志文件就能够恢复系统。
Checkpoint文件以B-树的数据结构存储,可以直接映射到内存中,并且在用于命名空间查询时候无需额外解析,这样大大提高了恢复速度,增强可用性。
基于创建一个Checkpoint文件需要一定时间,
Master服务器内部被组织为一种格式,此格式能确保Checkpoint过程中不会阻塞正在进行的修改操作,
Master服务器会使用独立线程切换到新的日志文件和创建新的Checkpoint文件,新的Checkpoint文件会
包含切换前所有的修改, 对于一个包含数百万个文件的集群,创建一个checkpoint文件需要1分钟左右时间
Master服务器恢复的时候仅需最新的Checkpoint文件和后续的日志文件,旧的checkpoint文件和日志文件可以被删除,当然真实中通常多保留一些历史文件。
2.7 一致性模型 (应该是说备份下的数据一致性吧)
2.7.1 GFS一致性保障机制:
GFS支持一个宽松的一致性模型,此模型能很好支撑我们高度分布的应用,
同时还保存了相对简单并容易实现的优点。
数据修改操作分为写入或者追加两种类型,写入操作把数据写在应用程序指定的文件偏移位置上,
即使有多个修改操作并行执行时,记录追加操作至少可以把数据原子性的追加到文件中一次,
偏移位置是由GFS决定的,GFS返回给客户端的偏移量会表示包含了写入记录,已定义region的起点。
由于chunk位置信息会被客户端缓存,所以在信息刷新前,客户端可能从一个失效的副本读取了数据,
即在缓存的超时时间和文件下一次被打开的时间之间存在一个时间窗,
文件再次被打开后会清除缓存中与该文件有关的所有Chunk位置信息,
即使在这个时间窗中读取到了失效副本的数据,因为我们的文件大部分都是只进行追加操作,因此
一个失效的副本返回的数据只能是上一次的数据而不是最新数据。
当一个新的reader重新连接master服务器时,会得到最新的chunk信息。
Master服务器和Chunk服务器通过定期握手来找到失效chunk服务器,使用checkSum来校验是否损坏。
Master节点检测到错误并采取对应措施的反应时间一般是几分钟。
2.7.2 程序的实现
采用追加写入而不是覆盖,
Checkpoint,
自验证的写入操作
自标识记录
真实应用中,应用程序从头到尾写入数据生成文件,写入数据后,应用程序自动将文件改名为一个永久保存
的文件名,或者周期性做checkpoint,记录成功写入多少记录。
Readers仅校验并处理上个checkpoint之后产生的文件region. 这种方式满足了我们一致性和并发处理的要求,Writers在每条写入的记录中都包含了额外的信息,比如checksum,用来校验有效性,
Readers可以利用checksum识别和抛弃额外的填充数据和记录片段。(没读懂)
3 系统交互
重要原则: 最小化所有操作和Master节点的交互。
3.1 租约和变更顺序(就是写入数据同时保证副本也能同步得到数据的过程)
变更: 1 改变chunk内容(原文件增加内容) 2 改变元数据(增加新文件)
租约: 用于保持变更后所有chunk都能达到一致的规范
Master节点为Chunk的一个副本建立一个租约,这个副本叫做主Chunk,
主Chunk对Chunk的所有操作都进行序列化,所有副本都遵从这个序列进行修改操作以达成和主Chunk的一致,这个过程中, Master节点会选择好主Chunk,然后主Chunk分配序列号 最终形成了修改操作的全局顺序
设计租约机制是为了最小化Master节点的管理负担,
客户机向Master节点询问哪个Chunk服务器持有当前租约,以及副本位置,如果没有, Master节点会选择其中一个副本建立一个租约。
Master节点将主Chunk表示符以及副本Chunk(secondary副本)位置返回给客户机,客户机缓存这些数据,
此时客户机将不再和Master节点关联, 只有在主Chunk不可用或者主Chunk回复信息表明不再持有租约时,
客户机才会和Master节点联系。
客户机将数据推送到所有副本,可以是任意顺序推送,Chunk服务器接收到数据并保存到内部的LRU缓存中
直到数据被使用或者过期交换出去。
当所有副本都确认接收到数据,客户机才发送写请求到主Chunk服务器, 主Chunk为接收到所有操作分配
连续序列号,这些操作可能来自不同客户机,而序列号保证了操作的顺序执行,主Chunk把写请求传递到所有二级Chunk中,每个二级Chunk依照分配的序列号以相同顺序执行操作。
所有二级Chunk回复主Chunk已经完成操作
主Chunk服务器回复客户机, 任何副本Chunk产生的错误都会返回给客户机,如果是主Chunk出现错误,
操作不会再被分配序列号也不会再被传递, 如果是二级Chunk出现错误, 客户机代码会重复执上图中3-7步骤做几次尝试。
3.2 数据流( 数据推送链-管道方式 最小化网络延迟)
为了提高网络效率,系统设计将数据流和控制流分开。
控制流从客户机发起,到主Chunk服务器,然后在到所有二级Chunk服务器,数据已管道方式顺序沿着
一个精心选择的Chunk服务器链推送。 这个精心选择的链主要是为了达到 充分利用每台机器的带宽,
避免网络瓶颈,高延迟的连接的目的。
继续说说这个推送链: 数据是以一个Chunk服务器链推送,而不是其他拓扑形式分散推送(比如树状拓扑),线性推送模式下,每台机器所有出口带宽都用于以最快速度传送数据,而不是在多个接受者之间分配带宽。
在线性推送下,每台机器都会尽量在拓扑结构中选择一台还没接收数据并离自己最近的机器作为目标了来推送数据,而计算就是通过IP地址就可以计算出节点之间的距离。
最后总结: 管道方式推送中,2我们基于全双工交换网络,接收到数据后立即向前推送不会降低接收速度,
在没有网络阻塞情况下,传送B字节数据到R个副本理想时间是 B/T + RL
T是网络吞吐量, L是两台机器数据传输延迟 比如 T(网络连接速度)=100Mbps, L 远小于1ms
那么 1MB数据理想情况下 80ms就能分发出去。
3.3 原子的记录追加
记录追加在分布式应用中非常频繁,在这些分布式应用中,通常会有很多客户机并行对同一个文件追加写入操作,如果追加文件超过Chunk最大尺寸,主Chunk首先将当前Chunk填充到最大尺寸,之后通知所有二级副本做同样操作,然后回复客户机要求对下一个Chunk重新进行记录最佳操作。
GFS并不保证Chunk所有副本在字节级别上完全一致,它只保证数据作为一个整体原子的至少写入一次,
操作成功的话,数据一定是写入到Chunk所有副本的相同偏移位置上,这之后,所有副本至少都到了记录尾部的长度,任何后续的记录都会追加到更大的偏移地址,或者不同的Chunk上。
3.4 快照
快照的目的: 1 瞬间完成对一个文件/目录树的拷贝 2 不会对正在进行的其他操作造成任何干扰
3 轻松的提交或者回滚到备份的状态
4 Master节点的操作
1) 执行所有名字空间操作
2) 管理着整个系统中所有Chunk副本
3) 决定Chunk存储位置(创建新的Chunk和副本)
4) 协调各种系统活动以保证Chunk被完全复制
5) 在所有Chunk服务器之间进行负载均衡
6) 回收不再使用的存储空间
4.1 名字空间管理和锁
Master节点很多操作都会花费很长时间, 比如快照操作必须取消Chunk服务器上快照所涉及的所有Chunk租约,我们不希望在这些操作运行时,延缓了其他Master节点操作,因此我们允许多个操作同时进行,并使用名字空间的region上的锁来保证执行的正确顺序。
逻辑上,GFS的名字空间是一个全路径和元数据映射关系查找表,这个表使用前缀压缩被高效存储在内存中,在存储名字空间的树形结构上,每个节点(绝对路径的文件名或绝对路径的目录名)都有一个关联的读写锁。
每个Master节点的操作在开始之前都要获取一系列锁,比如操作涉及文件/文件夹为:
/d1/d2/.../dn/leaf, 那么首先要获取/d1/d2/.../dn的读锁,以及/d1/d2/.../dn的读写锁。
以将/home/user 被快照到 /save/user的案例来说锁的处理:
快照操作获取 /home /save的读取锁, 以及 /home/user 和 /save/user写入锁,
文件创建操作获取 /home读取锁和 /home/user 的读取锁, 以及 /home/user/foo的写入锁,这些操作要顺序执行,因为获取 /home/user的锁是互相冲突,而文件名的读取锁足以防止父目录被删除。
采用这种锁方案优点可以支持对同一目录的并行操作,目录上的读取锁是为了防止目录被删除,改名,快照
,文件名的写入锁序列化文件创建操作,确保不会多次创建同名的文件。
基于名称空间可能有很多节点,读写锁采用惰性分配策略, 即不再使用时立即删除,
并且锁的获取会依照一个全局一致的顺序来避免死锁,
这个顺序是: 先按照名字空间层次排序,在同一层次内按字典顺序排序。
4.2 副本的位置
GFA集群是高度分布的多层布局结构,而不是平面结构, Chunk服务器被来自同一或者不同机架上的数百个
客户机轮流访问,不同机架上的两台机器间的通讯可能跨越一个或者多个网络交换机,并且机架的出入带宽
可能比机架内所有机器加在一起的带宽要小。 多层布局机架对数据灵活性,可靠性,和可用性提出特有挑战
Chunk副本位置选择策略两个目标: 1)最大化数据可靠性和可用性 2) 最大化网络带宽利用率
我们必须在多个机架之间分别存储Chunk副本,以保证一些副本在整个机架被破坏或者掉线(电源或网络交换机造成的问题)下依然能够可用, 这是第一个优点, 第二个: 在Chunk读操作中,能够有效利用多个机架的整合带宽,当然,多机架下写操作必须和多个机架设备进行网络通讯,但是这个代价相对于更频繁的多来说,是我们愿意付出的。
4.3 创建 重新复制 重新负载均衡
chunk副本的三个用途: Chunk创建 重新复制 重新负载均衡
Master节点创建Chunk时会考虑如下:
1) 在低于平均硬盘使用率的Chunk服务器上存储新的副本,这样能平衡Chunk服务器之间的硬盘使用率
Chunk只有在Writer真正写入数据的时候才被创建,一旦写入成功后会变成只读的。
Master会周期性对副本进行重新负载均衡,检测当前副本分布情况,以一定优先级(比如副本确实2个的优先级就要比确实1个的高)移动或者复制副本,以便更好利用磁盘空间,更有效进行负载均衡,同时Master节点
必须选择哪个副本要被移走,通常情况会移走那些剩余空间低于平均值的Chunk服务器副本,从而平衡系统整体的磁盘使用率。
4.4 垃圾回收
GFS在文件删除后不会立即回收可用的物理空间,GFS空间回收采用惰性策略,只在文件和Chunk级的
常规垃圾收集时进行。
4.4.1 机制
文件被删除时,Master节点立即把删除操作以日志方式记录下来,然后Master节点会把文件改名为一个包含
删除时间戳,隐藏的名字,当Master节点对文件系统命令空间常规扫描时,她会删除三天前的隐藏文件,(这个时间戳是可以设置的),而还没有删除的隐藏文件可以通过新的特殊名字读取或者将隐藏文件改名为正常显示的文件名的方式来反删除。
当隐藏文件从名称空间删除,Master内存保存此文件的元数据才会被删除。
而Chunk副本的删除流程是: 对Chunk名字空间做常规扫描时,Master节点找到孤儿Chunk(不被任何文件包含的Chunk) 并删除它们的元数据,Chunk服务器在和Master心跳中,报告Chunk服务器所拥有的Chunk子集信息,Master节点回复Chunk节点哪些Chunk在Master节点中不存在,然后Chunk服务器可以任意删除这些Chunk的副本。
4.4.2 讨论(垃圾回收)
分布式垃圾回收需要一个复杂方案才能解决,但是在GFS系统中非常简单。
Chunk的所有引用都存储在Master服务器内存的文件到块的映射表中,
我们也可以轻易找到所有Chunk副本,他们都以linux形式存在Chunk服务器指定目录下,
所有Master节点不能识别的副本都是垃圾。
垃圾回收把存储空间的回收操作合并到Master节点规律性的后台活动中,比如例行扫描和Chunk服务器握手,因此操作被批量执行,开销会被分散。
并且,垃圾回收在Master节点相对空闲时候完成,这样Master节点就可以给那些需要快速反应的客户机提供更快捷的响应。
同时也延缓了 意外的,不可逆转的删除操作。
当然延迟回收空间的问题有:
阻碍用户调优存储空间的使用,尤其是存储空间紧缺时,
当然可以通过显示的再次删除一个已经被删除的文件的方案来加速空间回收的速度。
也允许用户为命名空间的不同部分设定不同的复制和回收策略, 比如用户可以指定某些目录下的文件不做复制,删除时被即时的不可恢复的从文件系统中移除。
4.5 过期失效的副本检测
当Chunk服务器失效时,Chunk的副本有可能因为错失了一些修改操作而过期失效,Master保存了每个Chunk的版本号,用来区分当前的副本和过期副本。
只要Master节点和Chunk签订一个新的租约,它就会增加Chunk的版本号,然后通知最新的副本,Master节点和这些副本都把版本号记录在他们持久化存储的信息中, 如果某个副本所在的Chunk服务器正好失效状态,副本的版本号不会增加,Master节点在这个Chunk服务器重启后,Chunk服务器向Master服务器报告所拥有的Chunk集合以及相应版本号时,Master节点会检测出过期的Chunk, 此时Master节点在检测别的Chunk服务器发现对应Chunk有更高版本时,Master节点会认为它和Chunk服务器签订租约失效了,因此会选择更高版本的版本号作为当前版本号。
相关推荐
标题中的“GFS资料下载工具”指的是一个基于VC++编程语言开发的应用程序,主要用于下载GFS(Global Forecast System)相关的数据。GFS是由美国国家环境预报中心(NCEP)运行的一个全球数值天气预报模型,提供了对...
《Google文件系统GFS详解》 Google文件系统(GFS)是Google开发的一款高可用、可扩展的分布式文件系统,专为大规模、分布式、大数据访问的应用设计。它运行在普通硬件上,具备容错功能,能为大量用户提供高性能的...
《Google文件系统(GFS)》是一篇由Google公司的Jeff Dean和Sanjay Ghemawat共同撰写的经典论文,首次发表于2003年的ACM操作系统原理研讨会(SOSP)。这篇论文详细介绍了Google为处理大规模数据而设计的分布式文件...
标题中的“自动下载并保存GFS数据的Shell脚本”是指使用Linux的Shell脚本语言编写的一个程序,这个程序能够自动化地从网络上获取全球预报系统(Global Forecast System,简称GFS)的气象数据,并将其存储到本地或者...
`gfs.json` 文件通常包含全球预报系统(Global Forecast System,简称GFS)提供的气象模型数据,这是一种由美国国家环境预报中心(NCEP)运行的数值天气预报模型。GFS 提供对未来多天的全球范围内的气象预测,包括...
在了解GFS2之前,需要先了解GFS和GFS2之间的主要区别、GFS2的性能改进,以及在Red Hat Enterprise Linux 5上安装、配置和维护GFS2的注意事项。 GFS2继承了GFS的许多特性,并且进行了一些关键的改进,包括新的命令名...
### GFS(Google 文件系统)相关知识点 #### 一、引言与背景 Google File System (GFS) 是由Google设计并实现的一种可扩展的分布式文件系统,旨在为大规模的数据密集型应用程序提供支持。该系统在运行于廉价的商用...
### GFS分布式文件系统关键技术知识点 #### 一、GFS概览 - **设计初衷**:GFS(Google File System)是由Google设计并实现的一种分布式文件系统,旨在为大规模数据密集型应用提供一种可伸缩的解决方案。它通过运行...
《Hadoop GFS与MapReduce详解》 在大数据处理领域,Hadoop是一个不可或缺的名字,而GFS(Google File System)和MapReduce则是Hadoop生态系统中的核心组件。本篇将深入探讨这三个概念及其相互关系。 首先,GFS是...
【谷歌文件系统(GFS)】是谷歌设计和实现的一种分布式文件系统,旨在处理大规模的数据存储和处理需求。GFS的出现,对于大数据处理和云计算领域具有里程碑式的意义,它为海量数据的高效存储和访问提供了强大的解决...
Linux 搭建 GFS 系统+iSCSI 实现网络存储 Linux 搭建 GFS 系统+iSCSI 实现网络存储是指使用 Linux 作为操作系统,搭建 Global File System(GFS)和 iSCSI(Internet Small Computer System Interface)协议来实现...
在提供的文档信息中,我们可以了解到这是一本关于GFS2(Red Hat Global File System 2)的官方文档,该文档是专门针对Red Hat Enterprise Linux 5系统。文档不仅详细介绍了GFS2的工作原理,还涉及了安装和部署的详细...
详细介绍红帽集群和GFS的配置部署,快来部署自己的集群和GFS服务吧
在实验环境下,GFS文件系统统一安装到了redhat linux7。2下,(最好不要使用redhat 7.1,因为GFS安装成功后,可能会使系统启动失败)因为GFS5。0要求linux的内核必须是2.4.16以上。所以在安装GFS文件系统之前,需要...
《谷歌文件系统(GFS)》是谷歌在2003年发布的一篇著名论文,它详述了谷歌为处理海量数据而设计的一种分布式存储系统。这篇论文在信息技术领域具有里程碑式的意义,对后续的云存储和大数据处理系统产生了深远影响。...
### Google分布式文件系统(GFS):关键技术与设计原则 #### 概述 Google分布式文件系统(GFS),由Sanjay Ghemawat、Howard Gobioff和Shun-Tak Leung共同设计并实现,旨在为大规模数据密集型应用提供可扩展、高...
**Google File System (GFS)** Google File System(GFS)是Google开发的一个分布式文件系统,它是许多Google大规模数据处理和分析服务的核心组件。GFS的设计目标是为了解决超大规模数据存储和处理的需求,特别是在...