MIT6.824 课程-GFS
GFS
原文:https://zhuanlan.zhihu.com/p/113161014
搬运用于参考学习
概述
存储(Storage)是一个非常关键的抽象,用途广泛。
GFS 论文还提到了很多关于容错、备份和一致性的问题。
GFS 本身是 Google 内部一个很成功的实用系统,其关键点被很好的组织到一块发表成为了学术论文,从硬件到软件,涵盖了很多问题,值得我们学习。
为什么难
- 性能(High Performance)–> 分片(sharding)
分布式系统,自然想利用大量的机器提供成比例的性能,于是通常将数据分散到不同的机器上,以并行读取。我们称之为:分片(Sharding)。但分片一多,故障率就上来了。
- 故障(Faults)—> 容错(tolerance)
故障多了,就需要进行自动容错。最简单直接、通常也最有效的容错方法就是:备份(Replication,或译为冗余、副本)。如果副本是可修改的,就需要定期同步,这就引出了一致性的问题。
- 副本(Replication)—> 一致性(Consistency)
当然,通过精心的设计,可以维持系统的一致性,但这就意味着你需要损失性能。
- 一致性(Consistency)—> 低性能(Low Performance)
这有点类似于反证法,最后推出了矛盾,说明了构建分布式存储系统这件事的难点所在。在实践中,在给定场景性下,我们有更多的取舍余地,也就让设计一个合理的系统成为可能。

一致性
强一致性
即,尽管存储系统中有很多副本、很多机器,但是对外表现的行为却像单机一样:所有客户端都能够读到其他客户端之前所写内容。这个行为,或者说保证,看起来很简单、自然,但在分布式环境中,这确非易事。这部分想详细了解的可以看我翻译的一篇关于 CAP 的经典文章。
糟糕设计
为了使得所有副本保持一致性,可以在在客户端做同步:每次写操作,都并行的写多个备份。每个备份服务器接收到的写操作顺序可能并不一致,从而造成备份的不一致性。

GFS
在谷歌三篇著名论文(MapReduce,GFS,Bigtable)出来之前,一些分布式的理论大多停留在学术界中,谷歌由于面临海量数据(youtube 视频、网页索引等等)的处理、存储和访问需求,最早开发出了实用的大规模的分布式框架。
特点
- 体量大,速度快(Big,Fast):海量数据的快速存取
- 全球部署(Global):不同 site 的数据访问和共享
- 分片(Sharding):多客户端并发访问,增大吞吐
- 自动恢复(Auto recovery):机器太多,自动化运维
不过接下来,我们只讨论具有以下限定的 GFS:
- 部署在单个数据中心(datacenter)
- 仅供内部使用,不用过多考虑安全性
- 大数据的顺序读写,而非随机访问
GFS 可贵之处在于他是经过实践检验、部署过上千台机器的工业级系统,颠覆了之前学术界中很多的经典设计认知,比如:
- 为了保证数据访问不出错,需要提供强一致性保证(GFS 仅提供某种弱一致性)
- 为了系统的可靠性,用多机来保证主节点的可靠性(GFS 使用了单点 Master)
系统角色
Clients:客户端,通过接口访问系统。
Master:保存命名空间以及元信息
ChunkServer:存储节点。
Master 数据结构
Master 数据:
主要有以下两张表(Map):
- 文件名到 chunk 句柄的映射:
filename→array of chunk handles(nv) - chunk 句柄到 chunk元信息的映射(包括副本位置,chunk 版本号,主 chunk,租约过期时间):
chunk handle → list of chunk servers(v)/version(nv)/ Primary(v) / lease expire time(v)
这两个数据结构都存在内存(RAM)中。但为了宕机恢复,需要把一些信息(标记为 nv:non-volatile)写到硬盘上,即:
- 读取,从内存中读即可。
- 写入,修改内存同时在磁盘上记操作日志( LOG)+ 快照(CheckPoint)。
对于另外一些信息(标记为v:volatile),根据从 chunkserver 来的心跳构建即可。
使用日志(Log)而不是数据库(DB)来记录操作信息,是因为在磁盘上,前者更快。但如果操作特别多,恢复起来会很慢。能不能压缩?因此有了快照(snapshot):将操作日志所对应的内存状态通过某种格式(比如说B-tree)做一个快照。两者结合:将历史息用快照存储、最近一段信息用操作日志存储。这样既提高了空间利用率,也降低了操作延迟。
读写流程
读取 READS
文件名、偏移量–请求→MasterMaster–回应→Chunk 句柄,Chunk 副本地址列表(Client 会缓存该信息)- 客户端向某个副本(比如物理最近)所在的 chunk sever 请求数据,chunk server 返回相应数据
Q&A:
待访问数据跨 chunk 怎么办?GFS 会提供客户端 lib,自动将其拆成多次请求。客户端不需要关心这些细节。
写入 WRITES
这里只讲一下 Record Appends,分两种情况,
Master 上没有主副本信息(No Primary)
- 找到所有最新副本(即需要大于等于 Master 所知最新版本号)
- Master 选择其中一个作为主副本(Primary),其他的即为从副本(Secondary)
- Master 增加版本号
- Master 将新版本号同步给所有主从副本;同时给主副本一个租约。
- Master 将版本号持久化。
Master 有主副本信息
- Primary 选定 offset(由于 append 存在并发,Primary 负责将并发的 append 安排一个写入顺序,即给每个 append 一个不同的 offset)。
- 所有副本被通知在该 offset 写入数据。
- 如果所有副本回复 Primary 写成功,Primary 回复 Client 写成功
- 任何一个副本写失败,则 Primary 回复 Client 写失败。Client lib 会自动重试整个 Append 过程。
Q&A:
- 如果 Client 写失败,则最终不同副本可能会存在不一致的区域(有些写成功了,有些写失败了)。但只要最终写成功了,会保证在返回的 offset 处,所有的数据都一致。中间写失败形成的不一致会在读取的时候被跳过。
- 同步数据时,Client 只会同步给最近的一个 replica,然后该 replica 进一步同步给其他 replica。如此链式同步,以避免交换机带宽瓶颈。
- 只有在 Master 认为所请求 chunk 没有主副本时,才会更新版本号。如果能在其内存表中找到主副本地址,则直接返回给 Client。
- 当发生网络分区时,Primary 和 Client 可以正常连接,但是与 Master 失联。租约到期时,没有收到Primary 心跳(Primary 通过向 Master 心跳来续约),Master 就会认为 Primary 宕机,从而重新选择一个 Primary。此时就会形成 split brain。这种情况就比较难办了。一个解决办法是,Master 等旧 Primary 租约过期(旧 Primary 也知道自己的租约过期时间,没有正常续约时,会自动失去 Primary 身份)后再去选择一个新 Primary。
- 如果要 Append 的某个文件还不存在怎么办?Master 会初始化一个版本号,然后随机选定一个 Primary 和几个 secondaries,然后回复给 Client。
参考笔记
6.824 2020 视频笔记三:GFShttps://zhuanlan.zhihu.com/p/113161014
GFS —— 取舍的艺术https://www.qtmuniao.com/2019/05/26/gfs/
gfs原理https://oserror.com/distributed/gfs/
参考代码
a simple GFS: https://github.com/lishuai87/asgfs
论文
英文原文:The Google File System
中文翻译:The Google File System
相关文章:
MIT6.824 课程-GFS
GFS 原文:https://zhuanlan.zhihu.com/p/113161014 搬运用于参考学习 概述 存储(Storage)是一个非常关键的抽象,用途广泛。 GFS 论文还提到了很多关于容错、备份和一致性的问题。 GFS 本身是 Google 内部一个很成功的实用系统&…...
力扣第200题 岛屿数量
前言 记录一下刷题历程 力扣第200题 岛屿数量 岛屿数量 原题目: 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平…...
协议头,wireshark,http
目录 协议头 ip头 udp头 mac层 网络工具 telnet wireshark Http 一、HTTP 协议介绍 二、HTTP 协议的工作过程 三、使用抓包工具抓取报文 四、获取到http请求报文: 五、http请求(request) (一)、认识URL 项…...
vscode ssh离线远程连接ubuntu调试
遇见问题: 1 ssh连接上无法启动服务器的虚拟环境; 2 ssh连接上启动服务器的虚拟环境后无法打断点; 对于问题需要参考下面连接安装python和debugy的插件拓展,并且配置json文件link。VSCode - 离线安装扩展python插件教程_vscode…...
Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号
步骤 1:安装 Version Number Plugin 登录 Jenkins 的管理界面。进入 “Manage Jenkins” -> “Manage Plugins”。在 “Available” 选项卡中搜索 “Version Number Plugin”。选中并安装插件,完成后可能需要重启 Jenkins。 步骤 2:配置…...
元学习之应用案例
现在在做元学习的时候,我们最常拿来测 试元学习技术的任务叫做少样本图像分类,简单来讲就是每一个任务都只有几张图片,每一 个类别只有几张图片。比如我们使用图1的案例为例说明。现在分类的任务是分为三个 类别,每个类别都只有两…...
网络高级(学习)2024.9.10
目录 一、Modbus简介 1.起源 2.特点 3.应用场景 二、Modbus TCP协议 1.特点 2.协议格式 3.MBAP报文头 4.功能码 5.寄存器 (1)线圈寄存器,类比为开关量,每一个bit都对应一个信号的开关状态。 (2)…...
【软件全文档】项目概要设计说明书(2024实际项目Word原件)
一、 引言 (一) 编写目的 (二) 范围 (三) 文档约定 (四) 术语 二、 项目概要 (一) 建设背景 (二) 建设目标 (三࿰…...
震惊!国产数据库厂商减少了51家!
前面文章我提到国产数据库厂商实际上大部分都不赚钱,我估计国产目前国产数据库厂商利润为正的,目前不超过5家。 而经济寒冬,融资困难,那么对于很多厂商,尤其是全靠融资的数据库厂商来讲,这将变得极其困难。…...
[AI书籍分享]<AI时代,学什么,怎么学 - 和渊>
本文由Markdown语法编辑器编辑完成。 1, 背景: 本书是一位清华大学毕业的生物学博士,和渊老师,现就职于人大附中, 是一名一线的高中生物教师. 她之前已经写过几本关于教育类的书籍,而这本书,则是她针对当前, AI时代迅猛发展的背…...
鸿蒙HarmonyOS开发:一次开发,多端部署(界面级)断点和媒体查询
文章目录 概述引入与使用流程媒体查询条件语法规则媒体类型(media-type)媒体逻辑操作(media-logic-operations)媒体特征(media-feature) 场景示例1、监听设备屏幕的方向(竖屏,横屏&a…...
1 Linux SSH安全加固_linux system-auth
 RabbitMQ详解
RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。 消息中间件最主要的作用是解耦,中间件最标准的用法是生产者生产消息传送到队列,消费者从队列中拿取消息并处理&…...
《华为 eNSP 模拟器安装教程》
1.电脑安装环境要求: 检查电脑是否安装过 eNSP 和依赖软件,如果有,请全部卸载。 安装软件列表: 2.软件安装: 安装 WinPcap: 打开安装包,单击【Next】 单击【I Agree】 单击【Install】 单击【…...
vector(二)vector模拟实现
vector成员变量是三个迭代器 vector的迭代器底层与string相同是使用 指针实现的 使用的是类模版T*指针 template<class T> class vector { public:typedef T* iterator;typedef const T* const_iterator; private:iterator _start nullptr;iterator _finish nullp…...
【Canvas与电脑桌面】用六角回旋镖铺满一个平面(1920*1080)
【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>六角回旋镖桌面1920x1080</title><style type"text/cs…...
创游系列开心娱乐完整组件
别人分享的一套东西,是个不错的娱乐源码,里面包含了很多小游戏。可以创建房间。 没测试自行研究吧,内含搭建教程。 代码免费下载:百度网盘...
高效驱动之选 ——KP85211ASGA 半桥栅极驱动器 内置互锁死区
KP85211A是一款 225V 耐压,具有 1A 拉电流和 1.5A 灌电流能力的半桥栅极驱动器,专用于驱动功率MOSFET或IGBT。采用高压器件工艺技术,具有良好的电流输出及出色的抗瞬态干扰能力。可保证开关节点 VS 瞬态 -7V 情况下系统正常工作。可支持开关节…...
建投数据获批安全生产许可证
9月1日,建投数据成功获批由北京市住房和城乡建设委员会核发的《安全生产许可证》。该资质的获得,是建投数据能力与实力的展现,更是对其企业规模、管理水平、项目业绩等的肯定。 《安全生产许可证》是国家为了加强安全生产监督管理,…...
MCU9.reg52.h的介绍
1.引用头文件的两种方式 #include <reg52.h> #include "reg52.h" 区别:优先搜索的位置不同! 在keil软件中 #include <reg52.h> 优先搜索软件安装的INC文件夹 #include "reg52.h" 优先搜索当前工程文件夹下的头文件,如果没有,则在软件安装的…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
