从 GFS 失败的架构设计来看一致性的重要性(1)

简介: 从 GFS 失败的架构设计来看一致性的重要性(1)

微信图片_20220123181954.jpg


作者简介 陈东明,饿了么北京技术中心架构组负责人,负责饿了么的产品线架构设计以及饿了么基础架 构研发工作。曾任百度架构师,负责百度即时通讯产品的架构设计。具有丰富的大规模系统构 建和基础架构的研发经验,善于复杂业务需求下的大并发、分布式系统设计和持续优化。作者微信公众号dongming_cdm,欢迎关注。


GFS(Google File System)是Google公司开发的一款分布式文件系统。

在2003年,Google 发表一篇论文详细描述了GFS的架构。GFS,MapReduce,Bigt able并称为Google的三架⻢ ⻋,推动了Google的高速发展。其他互联公司和开源领域纷纷模仿,构建自己的系统。可以 这么说,GFS,MapReduce,Bigt able引领了互联网公司的分布式技术的发展。但GFS架构设 计并不是一个完美的架构设计,它有诸多方面的问题,一致性的欠缺就是其中的一个问题。


本文探讨一下GFS架构设计、分析其在一致性方面的设计不足,并且看一下一致性对分布式系统 的重要性。


微信图片_20220123182001.jpg


我们从GFS的接口设计说起。


接口

GFS采用了人们非常熟悉的接口,但是被没有实现如POSIX的标准接口。通常的一些操作包 括:create, delete, open, close, read, write, record append等。create,delete,open,close 和POSIX的接口类似,这里就不强调说了。这里详细讲述一下write, record append提供的语意。

  • write操作可以将任意⻓度len的数据写入到任意指定文件的位置off set
  • record append操作可以原子的将len<=16MB的数据写入到指定文件的末尾


之所以GFS设计这个接口,是因为record append不是简单的offset等于文件末尾的write操作。 record append是具有原子特性的操作,本文后面会详细解释这个原子特性。


write和record append操作都允许多个客户端并发操作。


架构

GFS架构如下图。(摘自GFS的论文)


微信图片_20220123182021.jpg


主要的架构部件有GFS client, GFS master, GFS chunkserver。一个GFS集群包括:一个 master,多个chunkserver,集群可以被多个GFS client访问。


GFS客户端(GFS client)是运行在应用(Application)进程里的代码,通常以SDK形式 存在。


GFS中的文件被分割成固定大小的块(chunk),每个块的⻓度是固定64MB。GFS chunkserver把这些chunk存储在本地的Linux文件系统中,也就是本地磁盘中。通常每个 chunck会被保存3个副本(replica)。一个chunkserver会保存多个块,每个块都会有一个 标识叫做块柄(chunk handle)


GFS 主(mast er)维护文件系统的元数据(met adat a),包括名字空间(namespace, 也就是常规文件系统的中的文件树),访问控制信息,每个文件有哪些chunk构成,chunk 存储在哪个chunkserver上,也就是位置(locat ion)。


微信图片_20220123182036.jpg


在这样的架构下,文件的读写基本过程简化、抽象成如下的过程:


写流程

1.client 向mast er发送creat e请求,请求包含文件路径和文件名。mast er根据文件路径和文件 名,在名字空间里创建一个对象代表这个文件。


2.client 向3个chunkserver发送要写入到文件中的数据,每个chunkserver收到数据后,将数据 写入到本地的文件系统中,写入成功后,发请求给mast er告知mast er一个chunk写入成功, 与此同时告知client 写入成功。


3.mast er收到chunkserver写入成功后,记录这个chunk与机器之间的对应关系,也就是chunk 的位置。


4.client 确认3个chunkserver都写成功后,本次写入成功。


这个写流程是一个高度简化抽象的流程,实际的写流程是一个非常复杂的流程,要考虑到写入 类型(即,是随机写还是尾部追加),还要考虑并发写入,后面我们继续详细的描述写流程, 解释GFS是如何处理不同的写入类型和并发写入的。


微信图片_20220123182049.jpg



读流程

1.应用发起读操作,指定文件路径,偏移量(off set )


2.client 根据固定的chunk大小(也即64MB),计算出数据在第几个chunk上,也就是chunk索 引号(index)


3.client 向mast er发送一个请求,包括文件名和索引号,mast er返回3个副本在哪3台机器上, 也就是副本位置(location of replica)。


4.client 向其中一个副本的机器发送请求,请求包换块柄和字节的读取范围。


5.chunkserver根据块柄和读取范围从本地的文件系统读取数据返回给client


这个读流程未做太多的简化和抽象,但实际的读流程还会做一些优化,这些优化和本文主题关 系不大就不展开了。


微信图片_20220123182103.jpg

相关文章
|
供应链 监控
软件架构一致性问题之软件供应链管理中降低维护成本如何解决
软件架构一致性问题之软件供应链管理中降低维护成本如何解决
159 4
|
缓存 并行计算 Java
软件架构一致性问题之多轮对话场景中出现模型的First Token Time(FTT)变长如何解决
软件架构一致性问题之多轮对话场景中出现模型的First Token Time(FTT)变长如何解决
164 2
|
人工智能 供应链 架构师
软件架构一致性问题之Serverless架构处理架构一致性问题如何解决
软件架构一致性问题之Serverless架构处理架构一致性问题如何解决
142 2
|
供应链 负载均衡 数据库
软件架构一致性问题之分析代码修改的 Scalability如何解决
软件架构一致性问题之分析代码修改的 Scalability如何解决
237 1
|
供应链
软件架构一致性问题之通过减少修改次数降低软件供应链管理的成本如何解决
软件架构一致性问题之通过减少修改次数降低软件供应链管理的成本如何解决
161 0
|
供应链 安全 Java
软件架构一致性问题之通过软件供应链管理提升研发体验如何解决
软件架构一致性问题之通过软件供应链管理提升研发体验如何解决
144 0
|
供应链 Java 中间件
软件架构一致性问题之研发新产品创造价值如何解决
软件架构一致性问题之研发新产品创造价值如何解决
130 0
|
消息中间件 存储 缓存
高并发架构设计三大利器:缓存、限流和降级问题之在数据库层面确保缓存一致性问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之在数据库层面确保缓存一致性问题如何解决
221 0
|
存储 运维 物联网
【专栏】OceanBase 是一款先进的分布式数据库系统,以其分布式架构、高扩展性、高可用性和强一致性特点,应对大规模数据处理挑战
【4月更文挑战第29天】OceanBase 是一款先进的分布式数据库系统,以其分布式架构、高扩展性、高可用性和强一致性特点,应对大规模数据处理挑战。它支持混合负载,适用于金融、电商和物联网等领域,提供高性能、低成本的解决方案。尽管面临技术复杂性、数据迁移和性能优化等问题,通过合理策略可克服挑战。随着技术发展,OceanBase 在数字化时代将持续发挥关键作用。
687 1
|
网络协议 中间件 数据库
Zookeeper学习系列【三】Zookeeper 集群架构、读写机制以及一致性原理(ZAB协议)
Zookeeper学习系列【三】Zookeeper 集群架构、读写机制以及一致性原理(ZAB协议)
707 0