阅读GFS论文

2023-11-13

GFS论文发表距今已经十几年了,据之开源的hdfs也已经在业界得到了广泛应用。为了取得分布式系统的真经,拜读一下这篇经典论文。


重要假设

  • 软硬件失败乃家常便饭
  • 我们写大文件,不屑小文件
  • 文件改动的主流是追加新数据,随机写是非主流
  • 一旦写完,仅会读取

系统结构

先整一张比较风骚的图

这里写图片描述

再看一张正经图
这里写图片描述

那么你应该可以看出,系统就由四部分构成了

  1. 文件由固定大小的chunk (64 MB) 组成
    • 每个chunk都会从master那得到一个句柄,和一个uuid
    • 存为linux文件
  2. 一个 Master

    • 保存所有metadata
    • 与chunkserver周期性通信
  3. 多个 Chunkserver

    • 在本地磁盘存储chunk
    • 不缓存chunk
  4. 多个客户端

    • 从master请求metadata
    • 从chunkserver读写数据

single master

优点

一目了然,真简单

风险

  • 单点故障
  • 系统瓶颈

解决方案

  • 尽量少参与实际工作,专心当领导
    • 大的chunk设置,64MB(这样实际管理的metadata量减小,并且全在内存中,加快处理速度)
    • 不进行实际数据操作,只管理metadata,在客户端请求时将metadata缓存到客户端
    • 有数据改动时,授权主副本全权操作,后面会提到chunk lease机制
  • 分发操作记录(operation log)到多台机器,一旦挂掉,其它机器可取而代之

主要功能

  • 存metadata
  • 命令空间(类似文件路径)管理/加锁
  • 监管chunkserver
  • 垃圾回收
  • 生成chunk
  • 副本低于指定目标时,查漏补缺
  • 负载均衡,平衡和优化磁盘使用率及负载

metadata

  1. 全部存储于master
    • 文件及chunk命名空间
    • 文件到chunk的映射
    • chunk所有副本的地址
  2. 全部加载于内存
    • 64字节/chunk
    • 快速
  3. 操作记录
    • 持久化于本地磁盘
    • 分发多份副本
    • checkpoints(快速复原)

mutation

mutation原意为突变,此处意为文件变更,是GFS设计的关键和复杂之处,也是其一致性模型要处理的核心问题。文件的变更有三种可能。

  • 文件命名空间变更 ,只在master一处发生,通过锁即可保证原子性和正确性
  • 随机写,write
  • 文件追加,append

那么文件的变更,主要就在于如何处理write和append两种操作了。write和append大体类同,先说write,再说append就简单了。

write操作

这里写图片描述

论文里面详细描述了写的流程,不再赘述,关键在于master指定了要被更改chunk的primary replica(首席副本,假定其所在主机为P),并给了它一个lease,有时间限制,可以视之为令牌。此时P就可以全权执行写操作了,如果有并发写入,P就内定一个顺序,然后其它副本也会按照这个顺序写入,这样当所有副本写入完成后,它们的内容就完全一样了。各个副本写完后回复primary replica,然后P应答client写入成功或者失败。

其实从上面可以看到,master只要指定了primary replica,下面就垂拱而治了。这极大地减轻了master的负担,使得单master可以支持那么大的集群。

下面再给大家上两张更清晰的写流程图:

client下发数据:图中粗的实线代表数据流,左右的client代表并发写入
这里写图片描述

client命令primary replica(主副本)写入,后者确定写入顺序,让其它副本照办
这里写图片描述

append操作

与写入不同,append操作时,client只要提供数据即可,写入时的offset是由primary replica确定的。其它基本一致。

那么,怎么理解“append at least once atomically”,至少会有一次原子性的追加操作。也就是说,如果有副本失败,那么client端会重试,则某些副本可能会多次追加数据,也就是说在某些副本上,数据可能有重复。但是对于所有的副本,在同样的offset处,至少会有一份数据。

一致性问题

在讨论一致性问题前,先看看什么是consistency和defined

这里写图片描述

根据上面的图片,上面几个概念就很清晰了。

  • consistent: 是指多个副本中的相应chunk都相同
  • inconsistent: 多个副本中的相应chunk不尽相同
  • defined: 比consistent严格,对于并发的写入,如果写入的数据大小超过一个chunk,那么不同client的chunk之间就会存在交叉的情况,则为undefined。见consistent图示,红蓝相间即为不同client的chunk交叉

下表即为GFS在不同情况下修改文件后的状态:
这里写图片描述

可以说,GFS这种弱一致性模型是针对其特殊应用场景的,可以获得很高的读写性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阅读GFS论文 的相关文章

随机推荐

  • 讲述IT人的程序人生,IT人心声,职业生涯,职场规划,程序员爱情优美文章155篇

    讲述IT人的程序人生 IT人心声 职业生涯 职场规划 程序员爱情优美文章155篇 来自 http www ithao123 com itlife 1 程序人生 程序 烟 我的人生2 程序人生 做技术 切不可沉湎于技术3 程序员 不得不习惯一
  • 一个经过改良的XMLHelper(包含了序列化,反序列化,创建xml文件,读取节点

    转自 http www 360doc com content 13 0905 20 1944636 312482651 shtml public class XmlHelper public XmlHelper public enum Xm
  • 如何在 VS Code 中安装和使用 Amazon CodeWhisperer

    大家好 今天我将向大家介绍如何在 Visual Studio Code 简称 VS Code 中安装和使用 Amazon CodeWhisperer 这是一个强大的 AI 辅助代码生成工具 CodeWhisperer 可以帮助你自动生成你需
  • 114DNS Public DNS+ 阿里DNS 百度DNS 360 DNS派 Google DNS

    为什么80 的码农都做不了架构师 gt gt gt 114DNS 腾讯dnspod DNS 阿里DNS 百度DNS 360DNS Google DNS公 共DNS评测体验报告从ping及dig返回时间对比测试 国内DNS普遍很快 而阿里DN
  • 在react中使用redux并实现计数器案例

    React Redux 在recat中不使用redux 时遇到的问题 在react中组件通信的数据是单向的 顶层组件可以通过props属性向下层组件传递数据 而下层组件不能向上层组件传递数据 要实现下层组件修改数据 需要上层组传递修改数据的
  • Matplotlib 散点图 绘制详解

    目录 基础 点的大小 点的颜色 透明度 颜色条 多组散点 1 散点图 基础 代码 import matplotlib pyplot as plt import numpy as np 第一组散点 x np array 1 2 3 4 5 6
  • 在C++上利用onnxruntime (CUDA)和 opencv 部署模型onnx

    概述 将得到的模型转化为onnx模型 加载到c 中运行 来完成模型的部署 下载并安装onnxruntime CMakeLists txt cmake minimum required VERSION 2 8 project test 使用c
  • 一起学nRF51xx 10 -  rng

    前言 随机数产生器 RNG 的结构 随机数发生器 RNG 根据内部热产生真实的非确定性随机数噪音 RNG通过触发START任务启动 并通过触发STOP任务停止 当随机数已经生成 它会产生一个VALRDY事件 同时把随机数存入VALUE寄存器
  • 智慧城市领域大单,巨头占尽优势

    智慧城市领域 哪个公司做的比较好 一 前言 二 智慧城市中标大单 清单 三 中标厂商分析 1 华为 2 科大讯飞 3 腾讯 4 阿里 5 中国电科 6 中国电子 7 百度 8 数字广东 四 获取 智慧城市等全套最新解决方案合集 一 前言 在
  • python eclipse+pydev(An error has occurred when creating this preference page)

    Eclipse 安装pydev Help gt Install New Software gt add gt Location http pydev org updates 点击pydev左边的小三角勾选pydev for eclipse
  • Shell init Ubuntu

    echo HISTFILESIZE 99999 gt gt bashrc echo HISTSIZE 99999 gt gt bashrc echo HISTTIMEFORMAT F T gt gt bashrc echo PROMPT C
  • Thrift原理简析(JAVA)

    Apache Thrift是一个跨语言的服务框架 本质上为RPC 同时具有序列化 反序列化机制 当我们开发的service需要开放出去的时候 就会遇到跨语言调用的问题 JAVA语言开发了一个UserService用来提供获取用户信息的服务
  • CUDA编程 基础与实践 学习笔记(十)

    线程束 warp 一个GPU由多个SM组成 一个SM上可以放多个线程块 不同线程块之间并行或顺序执行 一个线程块分为多个线程束 一个线程束由32个线程 有连续的线程号 组成 从更细粒度来看 一个SM以一个线程束为单位产生 管理 调度 执行线
  • Java面向对象 - 封装、继承和多态

    第1关 什么是封装 如何使用封装 相关知识 为了完成本关任务 你需要掌握 1 什么是封装 2 封装的意义 3 实现Java封装的步骤 package case1 public class TestPersonDemo public stat
  • GoLang之”奇怪用法“实践总结

    2013 11 23 wcdj 0 摘要 本文通过对A Tour of Go的实践 总结Go语言的基础用法 1 Go语言 奇怪用法 有哪些 1 go的变量声明顺序是 先写变量名 再写类型名 此与C C 的语法孰优孰劣 可见下文解释 http
  • 销售心理学

    销售中的心理学 影响你一生的销售心理学书籍 要想钓到鱼 就要像鱼一样思考 在生活中 如果想钓到鱼 你就得像鱼那样思考 而不是像渔夫那样思考 当你对鱼了解得越多 你也就越来越会钓鱼了 这样的想法用在销售中同样适用 要知道 销售的过程其实就是销
  • 【Redis17】Redis进阶:管道

    Redis进阶 管道 管道是啥 我们做开发的同学们经常会在 Linux 环境中用到管道命令 比如 ps ef grep php 在之前学习 Laravel框架时的 Laravel6 4 管道过滤器https mp weixin qq com
  • Latex使用

    问题 在使用latex的过程中插入图片 在某些条件下 图片可能会出现越过后续的文字出现在下一页的页首 解决办法 在该tex文件首部加上 usepackage stfloats 然后参数设置成H如下 begin figure H center
  • 使用frp 实现内网穿透 & 将私人电脑变成一个服务器

    使用frp 实现内网穿透 frp 是什么 frp 是一个可用于内网穿透的高性能的反向代理应用 支持 tcp udp 协议 为 http 和 https 应用协议提供了额外的能力 且尝试性支持了点对点穿透 作用 比如你需要用到云服务器部署你的
  • 阅读GFS论文

    GFS论文发表距今已经十几年了 据之开源的hdfs也已经在业界得到了广泛应用 为了取得分布式系统的真经 拜读一下这篇经典论文 重要假设 软硬件失败乃家常便饭 我们写大文件 不屑小文件 文件改动的主流是追加新数据 随机写是非主流 一旦写完 仅