读《The Google File System》

GFS特点:

1. 面向大规模数据密集型应用;

2. 可伸缩;

3. 分布式;

4. 灾难冗余;

5. 基于廉价硬件设备;

6.组件失效是常态,不是意外;

设计背景:

1. 文件巨大,因此I/O操作和Block尺寸都被重新考虑;

2. 绝大部分文件的修改采用追加,而不是随机写入,因此数据追加操作对性能最为关键;

3. 工作负载:大规模流式读取、小规模随机读取、大规模顺序追加的写操作;

4. 文件通常用于“生产者-消费者”模式(上百个生产者同时写入),因此要求最小的同步开销;

5. 应用程序通常是批量处理数据,因此高性能的稳定网络带宽远比低延迟重要

GFS架构:


由GFS架构图可以看出:

1. GFS由一个master和多个chunkserver组成,master管理文件系统元数据,包括名字空间、访问控制信息、文件与chunk的映射信息,以及当前chunk的位置信息,chunkserver存储数据本身,底层仍然是基于linux文件系统;

2. master发送指令给各个chunkserver,chunkserver定时发送心跳信息给master,汇报自己的状态;

3. 当客户端想要访问GFS的某个文件时,首先根据chunk大小将文件转化成chunk索引,然后咨询master,master将相应的chunk的位置信息和标识返回给客户端,之后客户端以文件名和chunk索引为key缓存这些元数据,并且直接与相应的chunkserver进行数据交换;

chunk尺寸:

chunk大小为64MB,且每个chunk副本都以普通linux文件的形式保存在chunkserver上,并使用惰性空间分配策略避免内部碎片,至于惰性空间分配是如何避免内部碎片的,见下图。


大尺寸的chunk带来的好处:

1. 减少客户端和master的通讯,用更少的请求次数来获取同一大小的文件的chunk元数据;

2. 与chunkserver建立长时间的TCP连接,减轻网络负载;

3. 减少master需存储的元数据数量;

坏处:

1. 小文件造成的hotspot问题;

元数据:

master存储3种主要类型的元数据:文件和chunk的命名空间、文件和chunk的对应关系、每个chunk副本的存放地点。

所有元数据都存储在master服务器的内存中,并且master并不持久化存储这些元数据,而是在每次启动时轮询chunkserver来获取,之后通过心跳信息进行更新。

操作日志:

操作日志是唯一被持久化存储的元数据,记录了命名空间、文件和chunk的对应关系。操作日志被存储在master服务器的本地磁盘上,并复制到其他master服务器。

checkpoint:

操作日志增长到一定量时,会对系统状态做一次checkpoint,并删除之前的日志文件,该checkpoint文件及之后的日志文件用于灾难恢复。

数据一致性:

修改后的文件region有三种状态:

1. “已定义的(隐含一致性)”:所有客户端都可以看到写入的内容;

2. “一致的、未定义的”: 所有客户端看到同样的数据,但是看不到新写入的数据;

3. “不一致的(同时也是未定义的)”: 不同客户端在不同时间会看到不同的数据;

数据修改分为“写入”和“记录追加”,两者的不同在于“写入”指定了文件偏移,而“追加”的文件偏移由GFS计算决定

一致性保障措施:

1. 对chunk的所有副本修改操作顺序一致;

2. 维护chunk版本号;

3. master服务器与chunkserver定期“握手”,并使用checksum来校验数据;

系统交互:

原则是最小化所有操作和master节点的交互。

数据变更操作采用租约(lease)机制,如图所示。


step1. client向master询问持有租约的chunkserver及其副本位置;

step2. master将主chunk的标识符及其副本位置返回给client;

step3. clien将数据推送到所有副本,这里采用线性集中推送,而非拓扑分散推送,即每个chunkserver都选择一个离自己最近的、还没有接收到数据的chunkserver进行推送,这是为了让每台机器的出口带宽以最快速度传输数据而不用在多个接收者间分配带宽;

step4. 当所有副本都收到数据后,client发送写请求到主chunkserver,主chunkserver为操作分配连续的序列号(正是这些序列号保证了所有chunk副本以同样的顺序进行操作),主chunkserver按顺序执行这些操作;

step5. 主chunk将写请求传递到所有二级副本,每个二级副本按主chunk分配的序列号执行操作;

step6. 所有二级副本回复主chunk操作已完成;

step7. 主chunkserver回复client操作已完成;

记录追加:

记录追加是原子性的,GFS保证数据作为一个整体原子至少被写入一次,任何一个chunk副本操作失败都会导致client重新操作,记录追加的数据大小严格控制在chunk最大尺寸的1/4,以控制数据碎片数量。

快照:

快照以很低的开销完成对一个文件或者目录树的拷贝,用户可以使用快照迅速地创建一个巨大数据集的分支拷贝,或是在做实验性的数据操作之前,使用快照备份当前状态用以回滚。

快照采用copy on write(写入时拷贝)技术,根据维基百科的解释,COW是一种用于程序设计最佳化的策略,当有多个呼叫者同时请求同一个资源时,他们会共同取得指向该资源的指针,只有当某个呼叫者尝试修改该资源时,系统才会真正复制一个副本给该呼叫者(写入时才复制)以避免被修改的资源被直接察觉到,该过程对其他呼叫者都是透明的,该策略的主要优点是如果呼叫者没有尝试修改资源,则系统不会创建资源的副本。

对应到GFS,快照请求由用户发出,当master接收到一个快照请求时,它首先取消快照文件涉及的所有chunk的租约,当有多个client同时请求该文件时(此时还没有写请求),master将同一份文件的元数据发送给所有client,直到第一次某个client发出对该文件(中某个chunk C)的写请求时,由于client向master询问持有租约的chunkserver及其副本位置,此时master发现该chunk C的引用计数超过了1,master要求每个拥有chunk C 当前副本的chunkserver创建一个新的chunk C'(本地创建),master与新的chunk C'的一个副本建立租约,并把新chunk C'的租约信息返回给client,之后所有修改操作都是针对该新chunk C‘。

master节点的职责

master节点的职责包括:名称空间管理和锁,副本的位置,创建、重新复制、重新负载均衡,垃圾回收,过期失效的副本检测。

1. 名称空间管理和锁:GFS的名称空间是一个全路径和元数据映射关系的查找表,在存储名称空间的属性结构上,每个节点都有一个关联的读写锁,当操作涉及/di/d2/.../dn/leaf时,首先要获得/d1, /d1/d2, ..., /d1/d2/.../dn的读锁,还要获得/d1/d2/.../dn/leaf的读写锁,这种方案支持对同一目录的并行操作。

2. 副本的位置: 副本位置的选择策略服务两大目标,即最大化数据可靠性和可用性,最大化网络带宽利用率。因此,不仅要在多台机器上分别存储副本,还要在多个机架间分布存储chunk副本。

3. chunk创建,重新复制和重新负载均衡:

1)创建位置选择因素:a. 在低于平均硬盘使用率的chunk服务器上存储;b. 限制在每个chunkserver上“最近”的chunk创建操作的次数;c. 分布在多个机架之间;

2)重新复制位置选择因素:首先对所有需要复制的chunk设置优先级,优先级考虑到三个因素:a. 优先复制现有副本与复制因数相差较大的chunk;b. 优先复制活跃文件的chunk;c. 优先复制会阻塞client程序处理流程的chunk;然后位置选择与1)相同;

3)周期性重新负载均衡位置选择因素:与1)相同;

4. 垃圾回收:惰性

5. 过期失效的副本检测: 利用chunk的版本号,每次master节点和chunk签订一个新的租约就增加chunk的版本号,若某个副本失效,其chunk版本号不会增加,master在例行垃圾回收是发现并移除过期失效的副本。

高可用性机制:快速恢复、复制

数据完整性:每个chunkserver独立维护自己的checksum

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值