从谷歌 GFS 架构设计聊开去
伟人说:“人多力量大。”
尼古拉斯赵四说:“没有什么事,是一顿饭解决不了的!!!如果有,那就两顿。”
研发说:“需求太多,人手不够。”
专家说:“人手不够,那就协调资源,攒人头。”
释义:一人拾柴火不旺,众人拾柴火焰高。一人难挑千斤担,众人能移万座山。
运维说:“一台机器不够;一个服务扛不住压力。”
专家说:“一台机器不够,那就多申请几台;一个服务扛不住压力,那就多部署几个。”
释义:一箭易断,十箭难折。一根线容易断,万根线能拉船。
从事互联网开发时间久了,参加大大小小的会议,时不时总会讨论或争执类似“人手不够、机器不够、服务扛不住”等一类的资源问题,但是到最后解决方案,貌似都是进行资源协调。如果人手不够,就协调资源攒人头;如果机器不够,就协调资源加几台;如果一个服务扛不住压力,那就协调资源多部署几个。
所有的一切都离不开:攒、加 ... ... ,总之就是考虑如何从 1 到 N 。
拜读 GFS 的论文,熟读 N 篇系列文章,静下来想想 GFS 架构设计,多少都透了着一丝“众人拾柴火焰高、人多就是力量大”的想法,接下来就一起对 GFS 认识认识。
认识
到底是个啥?GFS 是一个把大量廉价的普通机器,聚在一起,充分让每台廉价的机器发挥光和热,具有高可用、高性能、高可靠、可扩展的分布式文件系统。
解剖
善于发现美。如上图所示,GFS 架构的参与角色,主要分为 GFS master(主服务器)、GFS chunkserver(块存储服务器)、GFS client(客户端)。
我们姑且认为 GFS master 是古代的皇上,统筹全局,运筹帷幄。主要负责掌控管理所有的文件系统的元数据,包括文件和块的命名空间,从文件到块的映射,每个块所在的节点位置(说白了,要维护哪个文件存在哪些文件服务器上的元数据信息);并且定期通过心跳机制与每一个 GFS chunkserver 通信,向其发送指令并收集其状态。
我们姑且认为 GFS chunkserver 是宰相,因为宰相肚子里面能撑船,主要提供 chunks 数据块的存储服务,以文件的形式存储于 chunkserver 上,能够海纳百川,有容乃大。
我们姑且认为 GFS client 是使者,对外提供一套类似传统文件系统的 API 接口,对内主要与皇帝通信来获取元数据;然后直接和宰相交互来进行所有的数据操作。
好奇
背后如何运转?懵懂 GFS 架构设计的参与角色主要有皇上、诸多宰相、诸多使者构成,但是他们之间是如何协作运转的呢?
我要写入一个文件,GFS 架构背后流转是咋回事?如上图所示,主要分为 7 大步骤进行。
第一步:GFS client 向 GFS master 查询待写入的 chunk 的 GFS chunkserver(宰相)信息;
释义:使者请求皇上要发起写数据操作,皇上会告诉使者找哪几个宰相去办理。
第二步:GFS master 返回 GFS chunkserver 列表,其中返回的 chunkserver 分为 1 主 2 从;
释义:皇上告诉使者去找 Primary 主宰相 + AB 两个从宰相(主宰相有话语权,从宰相听从主宰相的命令)。
第三步:GFS client 将数据发送至 GFS chunkserver,chunkserver 会缓存这些数据,此时数据并不落盘;
释义:使者把数据发送给所有宰相,宰相先把数据缓存一下,并不塞到肚子里。
第四步:GFS client 向主 GFS chunkserver 发起同步写入请求;
释义:使者告诉 Primary 主宰相可以把数据吞到肚子里了;
第五步:主 GFS chunkserver 将数据写入本地磁盘并通知其他从 GFS chunkserver 将数据数据落盘;
释义:Primary 主宰相开始把数据吞到肚子里,并通知 AB 两个从宰相将数据吞到肚子里;
第六步:主 GFS chunkserver 等待所有从 GFS chunkserver 的数据处理响应;
释义:Primary 主宰相等待 AB 两个从宰相数据处理响应结果;
第七步:主 GFS chunkserver 给 GFS 客户端返回数据写入成功响应。
释义:Primary 主宰相告诉使者本次的数据写入成功了。
结论:想要谁存找皇上;数据存储找宰相;1主两从存三份。
我要读取一个文件,GFS 架构背后又是怎么流转的呢?懵懂了写文件的运转流程,那读文件的流转就相对简单了不少。
第一步:GFS client 从本地缓存,看文件存储在哪些 chunk-server 上;
使者从自己缓存中找找文件是由哪些宰相负责;
第二步:如果 GFS client 本地缓存没有找到,就向 GFS master 查询文件所在位置;
使者从自己缓存中找不到文件是由哪些宰相负责,就请求皇上查询有哪些宰相负责存储;
第三步:GFS master 返回 GFS chunkserver 列表给 GFS client;
皇上返回存储文件的宰相列表给使者;
第四步:从返回的 chunk-server 里读文件,返回给 GFS client。
使者找离自己最近的宰相发出读请求,然后宰相内容返回给使者。
结论:要最快查缓存;缓存没有找皇上;数据就找近宰相。
反思
架构这么设计为什么?是不是在耍流氓!
GFS master 为什么是单点?简单就是美!
GFS chunk 块大小为什么选择 64M 呢?
GFS 的高可用、高性能、高可靠是怎么保证的?
最后,再多说两句。谷哥“三驾马车”的出现,才真正把我们带入了大数据时代,而 GFS 作为其中一架宝车,能够把大量廉价的普通机器,聚在一起,充分让每台廉价的机器发挥光和热,不但降低了运营成本,而且经受了业界实际生产的考验,本次只是 GFS 管中窥豹,只见得其中一斑,GFS 背后还有很多值得我们学习的地方,慢慢去体会。
好了,如果感觉这篇文章有点意思,请多多分享转发吧。

从谷歌 GFS 架构设计聊开去的更多相关文章
- IM 去中心化概念模型与架构设计
今天打算写写关于 IM 去中心化涉及的架构模型变化和设计思路,去中心化的概念就是说用户的访问不是集中在一个数据中心,这里的去中心是针对数据中心而言的. 站在这个角度而言,实际上并非所有的业务都能做去中 ...
- 升讯威微信营销系统开发实践:(1)功能概要与架构设计( 完整开源于 Github)
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...
- .NET Core实战项目之CMS 第九章 设计篇-白话架构设计
前面两篇文章给大家介绍了我们实战的CMS系统的数据库设计,源码也已经上传到服务器上了.今天我们就好聊聊架构设计,在开始之前先给大家分享一下这几天我一直在听的<从零开始学架构>里面关于架构设 ...
- 一套海量在线用户的移动端IM架构设计实践分享(含详细图文)(转)
1.写在前面 1.1.引言 如果在没有太多经验可借鉴的情况下,要设计一套完整可用的移动端IM架构,难度是相当大的.原因在于,IM系统(尤其是移动端IM系统)是多种技术和领域知识的横向应用综合体:网络编 ...
- 瓜子IM智能客服系统的数据架构设计(整理自现场演讲)
本文由ITPub根据封宇在[第十届中国系统架构师大会(SACC2018)]现场演讲内容整理而成. 1.引言 瓜子业务重线下,用户网上看车.预约到店.成交等许多环节都发生在线下.瓜子IM智能客服系统的目 ...
- Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析
Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...
- Java生鲜电商平台-优惠券系统的架构设计与源码解析
Java生鲜电商平台-优惠券系统的架构设计与源码解析 电商后台:实例解读促销系统 电商后台系统包括商品管理系统.采购系统.仓储系统.订单系统.促销系统.维权系统.财务系统.会员系统.权限系统等,各系统 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- 解构C#游戏框架uFrame兼谈游戏架构设计
1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...
随机推荐
- LeetCode37 使用回溯算法实现解数独,详解剪枝优化
本文始发于个人公众号:TechFlow,原创不易,求个关注 数独是一个老少咸宜的益智游戏,一直有很多拥趸.但是有没有想过,数独游戏是怎么创造出来的呢?当然我们可以每一关都人工设置,但是显然这工作量非常 ...
- 逐浪CMS全面升级为.NET Core 3.0性能大提升
微软发布了.Net Core 3.0正式版,逐浪CMS也在第一时间做了全面升级,并做了一系列的优化和调整,性能大幅提升,并解决了一些历史遗留问题,添加了一些新的功能.如后台固有小程序功能做了升级,功能 ...
- nohub 将程序永久运行下去
今天看了一遍文章,一直以为将程序制成sh脚本,通过crontab来间隔执行以为是真的不断执行,后来才发现是错误的,每隔一段时间都会执行一次,都会占用一个进程,难怪一看进程几十来个同样名字的进程在运行 ...
- Simulink仿真入门到精通(二) Simulink模块
2.1 Simulink模块的组成要素 用户构建系统模型时无需直接面对成千上万行的代码,而是通过模块化图形界面以模块化的方式构建,能够使理解变得容易,让大脑减负.通过层次化模块分布将系统功能模块化,而 ...
- Flask 请求中间件、错误处理、标签、过滤器、CBV
目录 一.请求中间件 二.请求中间件额外方法(重写源码) 三.请求错误处理 四.请求标签.过滤器 五.CBV写法 基础版 常用版 一.请求中间件 中间件: 1 before_first_request ...
- Ubuntu下搭建.Net Core环境并发布MVC项目
支撑环境 1. Windows 10 1809 12月更新版本(其他版本应该也行,但建议不低于1809,过低的版本可能无法安装子系统ubuntu18.04 LTS) 2. ubuntu 18.04 L ...
- npm和yarn使用
npm和yarn使用 他们都属于js包管理工具,都可以安装包或者模块yarn 是由facebook.google等联合开发推出的 区别: npm 下载包的话 比如npm install,它是按照包的排 ...
- Spring框架——继承 - 依赖 - 命名空间
Spring 继承 子 bean 可以继承⽗ bean 的属性值. <bean id="user" class="com.sunjian.entity.User&q ...
- STL篇--list容器
list容器: 1.list 容器 的本质就是双向环形链表,最后一个节点刻意做成空节点,符合容器的左闭右开的原则2.list 的迭代器 是一个智能指针,其实就是一个类,通过操作符重载模拟各种操作(++ ...
- 物联网 软硬件系统 树莓派 单片机 esp32 小程序 网页 开发 欢迎相互交流学习~
物联网软硬件开发 知识分享 多年学生项目开发经验 物联网 软硬件系统 树莓派 单片机 esp32 小程序 网页 开发 欢迎相互交流学习~ http://39.105.218.125:9000/