阅读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论文 的相关文章

  • 【笔记】下单但未支付的订单倒计时自动取消逻辑实现

    平常我们都用过淘宝 京东这些电商平台 同时肯定也在这些平台上面下过单 这种情况不保证大家都有遇到过 但做开发的 肯定也知道有这个环节的存在 确认货品配置无误之后 我们都会点击购买 随之而来的就是一个结算页 让你确认商品信息 收货地址 价格等
  • 【业务功能篇104】 补充【业务功能篇99】微服务-springcloud-springboot-电商订单模块--整合支付

    在前面我们业务功能篇98 99中 我们介绍了电商项目中的订单模块服务 那么最后就是需要进行支付动作 那么我们这里就通过订阅第三方平台支付宝的支付调用接口功能 来进一步完成订单提交后的支付动作 支付宝的接口使用可以登录官网开发指南详情去了解
  • 区块链学习笔记(六)——区块链的分类

    文章目录 一 强调 二 公有链 联盟链 私有链 1 公有链 2 联盟链 3 私有链 总结 一 强调 先做一下重复强调 区块链技术是集分布式存储 点对点传输 共识机制 加密算法 数据区块等概念于一体的新兴技术集合 二 公有链 联盟链 私有链
  • 数据库如何热备份

    1 1数据库冷备份 概念 在固定的周期内 人为的将数据库中的数据进行备份 一般一式三份 缺点 1 可能会造成数据丢失 2 如果数据量很多 则可能会导致备份时间很长 并且备份不能正常完成 说明 虽然冷备份有诸多的缺点 但是最好进行冷备份 因为
  • 基于 Zipkin的链路追踪

    Zipkin介绍 Zipkin 是 Twitter 的一个开源项目 它基于 Google Dapper 实现 它致力于收集服务的定时数据 以 解决微服务架构中的延迟问题 包括数据的收集 存储 查找和展现 我们可以使用它来收集各个服务器 上请
  • 什么是分布式架构

    一 分布式架构定义 什么是分布式架构 分布式系统 distributed system 是建立在网络之上的软件系统 内聚性 是指每一个数据库分布节点高度自治 有本地的数据库管理系统 透明性 是指每一个数据库分布节点对用户的应用来说都是透明的
  • 2022Java面试题大全(整理版)面试题附答案详解,最全面详细

    目录 JAVA八股文 Java基础 String 和StringBuffer和 StringBuilder的区别 sleep 区间wait 区间有什么区别 Object 中有哪些方法 其中clone 怎么实现一个对象的克隆 Java如何实现
  • 【seaweedfs】3、f4: Facebook’s Warm BLOB Storage System 分布式对象存储的冷热数据

    论文地址 Facebook的照片 视频和其他需要可靠存储和快速访问的二进制大型对象 BLOB 的语料库非常庞大 而且还在继续增长 随着BLOB占用空间的增加 将它们存储在我们传统的存储系统 Haystack 中变得越来越低效 为了提高我们的
  • Kafka 权威指南

    Kafka 权威指南 这本书于 2021 年看完 2022 年又看了一遍 感觉书读百遍 其义自现 这本书侧重于 Kafka 的理论知识 虽然书有点老 但是其中关于 Kafka 的基础知识的章节讲得确实不错 适合学习 Kafka 的新手以及
  • 项目实战之RabbitMQ死信队列应用

    作者名称 DaenCode gt https blog csdn net 2302 79094329 作者简介 啥技术都喜欢捣鼓捣鼓 喜欢分享技术 经验 生活 人生感悟 尝尽人生百味 方知世间冷暖 文章目录 架构图 application
  • Apollo(阿波罗)——携程推出的分布式配置管理中心 & 启动Apollo & SpringBoot集成 & @ConfigurationProperties的使用姿势

    前言 Apollo 阿波罗 是一款可靠的分布式配置管理中心 诞生于携程框架研发部 能够集中化管理应用不同环境 不同集群的配置 配置修改后能够实时推送到应用端 并且具备规范的权限 流程治理等特性 适用于微服务配置管理场景 本篇博客介绍如何启动
  • 在异构系统中学习应用的流迭代分布式编码计算研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 什么是自动化测试,看完你就懂了!

    随着互联网技术的飞速发展 软件本身的规模和复杂度也是逐步增加 为了保证软件项目能够保质保量交付到客户手中 软件测试环节就显得非常重要了 它可以看作是软件项目交付给客户最后一道安全保证 今天给大家聊聊软件测试当中自动化测试相关的知识 希望对大
  • AI分布式训练:DDP (数据并行)技术详解与实战

    编者按 如今传统的单机单卡模式已经无法满足超大模型进行训练的要求 如何更好地 更轻松地利用多个 GPU 资源进行模型训练成为了人工智能领域的热门话题 我们今天为大家带来的这篇文章详细介绍了一种名为 DDP Distributed Data
  • 消息队列选型:Kafka 如何实现高性能?

    在分布式消息模块中 我将对消息队列中应用最广泛的 Kafka 和 RocketMQ 进行梳理 以便于你在应用中可以更好地进行消息队列选型 另外 这两款消息队列也是面试的高频考点 所以 本文我们就一起来看一下 Kafka 是如何实现高性能的
  • Zookeeper 和 Dubbo 的关系?

    Zookeeper的作用 zookeeper用来注册服务和进行负载均衡 哪一个服务由哪一个机器来提供必需让调用者知道 简单来说就是ip地址和服务名称的对应关系 当然也可以通过硬编码的方式把这种对应关系在调用方业务代码中实现 但是如果提供服务
  • 华纳云:ServiceComb如何实现zipkin分布式调用链追踪

    Apache ServiceComb是一个开源的微服务框架 它提供了分布式系统开发所需的一系列工具和服务 在ServiceComb中 实现分布式调用链追踪可以通过整合Zipkin来实现 Zipkin是一个开源的分布式追踪系统 它可以帮助你跟
  • 终于找到了最新版的Zookeeper入门级教程,建议收藏!

    小熊学Java https javaxiaobear cn 1 分布式一致性 1 CAP 理论 CAP 理论指出对于一个分布式计算系统来说 不可能同时满足以下三点 一致性 在分布式环境中 一致性是指数据在多个副本之间是否能够保持一致的特性
  • 【复现】遗传算法求解分布式电源选址定容问题并考虑环境因素研究【IEEE33节点】(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • Kafka速度之谜:高性能的幕后秘密大揭秘

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 kafka高性能的原因 Page Cache ZeroCopy 零拷贝 前言 Kafka的介绍 kafka是linkedIn开源的分布式消息系统 归给Ap

随机推荐

  • 讲述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也已经在业界得到了广泛应用 为了取得分布式系统的真经 拜读一下这篇经典论文 重要假设 软硬件失败乃家常便饭 我们写大文件 不屑小文件 文件改动的主流是追加新数据 随机写是非主流 一旦写完 仅