「读书笔记」《大规模分布式存储系统:原理解析与架构实战》:四

本文涉及的产品
云解析DNS,个人版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 「读书笔记」《大规模分布式存储系统:原理解析与架构实战》:四

4 分布式文件系统

4.1 GFS

4.1.1 系统架构

组件:

  1. GFS Master(主控服务器)
  2. GFS ChunkServer (CS 数据块服务器)
  3. GFS 客户端

GFS 文件被分为固定大小的数据库(chunk),主服务器在创建时分配一个 64 位全局唯一的 chunk 句柄。

chunk 在不同的机器中复制多份,默认为 3 份。

主控服务器 中维护了系统的元数据,包括文件及 chunk 命名空间、文件到 chunk 之间的映射、chunk 位置信息。也负责整个系统的全局控制,如 chunk 租约管理、垃圾回收无用 chunk、chunk 复制等。主控服务器会定期与 CS 通过心跳的方式交换信息。

客户端 是 GFS 提供给应用程序的访问接口,它是一组专用接口,不遵循 POSIX 规范,以库文件的形式提供。客户端访问主控节点,获取与之进行交互的 CS 信息,然后直接访问这些 CS,完成数据存取工作。

❗ 注意:

GFS 中的客户端不缓存文件数据,只缓存主控服务器中获取的元数据。

4.1.2 关键问题

租约机制

GFS 数据追加以记录为单位,每个记录大小为几十 KB 到几 MB 不等,如果每次记录追加都需要请求 Master,Master 会成为瓶颈,因此,GFS 系统中通过租约(lease)机制将 chunk 写操作授权给 ChunkServer。拥有租约授权的为 主 ChunkServer,其他副本所在的 ChunkServer 称为备 ChunkServer。租约授权针对单个 chunk,在租约有效期内,对该 chunk 的写操作都由 主 ChunkServer 负责,从而减轻 Master 的负载。一般来说,租约的有效期比较长,比如 60s,只要没异常,主 ChunkServer 可以不断向 Master 请求延长租约的有效期直到整个 chunk 写满。

GFS 通过对每个 chunk 维护一个版本号来解决,每次给 chunk 进行租约授权或主 ChunkServer 重新延长租约有效期,Master 会将 chunk 的版本号加 1. 如果过程中某个 A chunk 的副本 A2 下线,A2 的版本号会低,从而将 A2 标记为可删除的 chunk,Master 的垃圾回收任务会定时检查,并通知 ChunkServer 将 A2 回收掉。

一致性模型

GFS 主要是为了 追加 (append)而不是 改写(overwrite)而设计的。

追加模型

容错机制

Master 容错

通过操作日志加 checkpoint 的方式进行,并且有一台 「Shadow Master」实时热备。

Master 上保存了三种元数据信息:

  • 命名空间(NameSpace),也就是整个文件系统的目录结构以及 chunk 基本信息;
  • 文件到 chunk 之间的映射
  • chunk 副本的位置信息,每个 chunk 通常有 3 个副本

Master 操作总是先记录操作日志,后修改内存。

远程的实时热备将实时接收 Master 发送的操作日志并在内存中回放这些元数据操作。如果 Master 宕机,还可以秒级切换到实时备机继续提供服务。

Master 需要持久化 命名空间 和 文件到 chunk 之间的映射;chunk 副本的位置信息可以不持久化,因为 chunkserver 维护了这些信息。

ChunkServer 容错

多副本。对于每个 chunk,必须将所有的副本全部写入成功,才视为成功写入。

ChunkServer 会对存储的数据维持校验和。

GFS 以 64MB 为 chunk 大小来划分文件,每个 chunk 又以 block 为单位进行划分,Block 大小为 64KB,每个 Block 对应一个 32 位的校验和。当读取一个 chunk 副本时,ChunkServer 会将读取的数据和校验和进行比较,如果不匹配,就会返回错误,客户端将选择其他 ChunkServer 上的副本。

4.1.3 Master 设计

Master 内存占用

每个 chunk 的元数据小于 64 字节。那么 1PB 数据的 chunk 元数据大小不超过 1PB * 3 / 64MB * 64 = 3GB

Master 还对命名空间进行了压缩,每个文件在文件命名空间的元数据也不超过 64 字节。因此 Master 内存容量不会成为 GFS 的系统瓶颈。

负载均衡

创建副本有 3 种情况:

  1. chunk 创建
  2. chunk 复制(re-replication)
  3. 负载均衡(rebalancing)

如何选择 chunk 副本的初始位置:

  1. 新副本所在的 ChunkServer 的磁盘利用率低于平均水平
  2. 限制每个 ChunkServer 「最近」创建的数量
  3. 每个 chunk 的所有副本不能在同一个机架。

垃圾回收

延迟删除的机制。在元数据中将文件改名为一个隐藏的名字,并且包含一个删除时间戳(默认 3 天)。

垃圾回收一般在服务低峰期执行,如凌晨 1:00.

快照

使用标准的写时复制机制生成快照,「快照」只是增加 GFS 中 chunk 的引用计数,表示这个 chunk 被快照文件引用了,等到客户端修改 这个 chunk 时,才需要在 ChunkServer 中拷贝 chunk 的数据生成新的 chunk,后续的修改操作落到新生成的 chunk 上。

做快照,首先需要停止这个文件的写服务(通过租约机制收回),接着增加这个文件的所有 chunk 的引用计数,以后修改这些 chunk 时会拷贝生成新的 chunk。

4.1.4 ChunkServer 设计

保证 ChunkServer 尽可能均匀地分布在不同的磁盘中。删除 chunk 时可以只将对应的 chunk 文件移动到每个磁盘的回收站,以后新建 chunk 可以重用。

4.1.5 讨论

典型优势:大大降低成本,由于基础设施成本低,Gmail 服务能够免费给用户提供更大的容量。

4.2 Taobao File System

2007 年之前淘宝图片存储系统使用 NetApp 存储系统。

TFS:Blob 存储系统。

TFS 架构设计考虑以下 2 个问题:

  • Metadata 信息存储。图片数量巨大,单机放不下所有的元数据信息。
  • 减少图片读取的 IO 次数。

设计思路:多个逻辑图片文件共享一个物理文件

4.2.1 系统架构

TFS 不维护文件目录树,每个小文件使用一个 64 位的编号表示。

一个 TFS 集群由:

  • 2 个 NameServer 节点(一主一备)
  • 多个 DataServer 节点

NameServer 通过 心跳对 DataServer 进行检测。

每个 DataServer 会运行多个 dsp 进程,一个 dsp 对应一个挂载点,这个挂载点一般对应一个独立磁盘,从而管理多块磁盘。

在 TFS 中,将大量的小文件(实际数据文件)合并成一个大文件,这个大文件称为块(Block),每个 Block 拥有集群内唯一的编号(块 ID),通过 块 ID,文件编号 可以唯一确定一个文件。Block 数据大小一般为 64 MB,默认 3 份。

追加流程

TFS 是写少读多的,那么每次写操作都经过 NameNode 也不会有问题。

另外,TFS 不需要支持 GFS 的多客户端并发追加操作,同一时刻每个 Block 只能有一个写操作,多个客户端的写操作会被串行化。

NameServer

功能:

  1. Block 管理,包括创建、删除、复制、重新均衡;
  2. DataServer 管理,包括心跳、DataServer 加入及退出;
  3. 管理 Block 与所在 DataServer 之间的映射关系

与 GFS 相比,TFS NameServer:

  1. 不需要保存文件目录树信息;
  2. 不需要维护文件与 Block 之间的映射关系

4.2.2 讨论

  1. 图片去重:MD5 或 SHA1
  2. 图片更新于删除

4.3 Fackbook Haystack

  1. 目录(Directory)
  2. 存储(Store)
  3. 缓存(Cache)

4.4 内容分发网络

4.4.1 CDN 架构

相关文章
|
1天前
|
监控 安全 数据安全/隐私保护
ERP系统中的组织架构与权限管理解析
【7月更文挑战第25天】 ERP系统中的组织架构与权限管理解析
12 2
|
1月前
|
前端开发 Java 开发工具
Java医院绩效考核系统源码:关于医院绩效考核系统的技术架构、系统功能、如何选择医院绩效考核管理系统
系统开发环境 开发语言:java 技术架构:B/S架构 开发工具:maven、Visual Studio Code 前端框架:avue 后端框架:springboot、mybaits 数 据 库:MySQL
35 4
Java医院绩效考核系统源码:关于医院绩效考核系统的技术架构、系统功能、如何选择医院绩效考核管理系统
|
19天前
|
Kubernetes Cloud Native 微服务
企业级容器部署实战:基于ACK与ALB灵活构建云原生应用架构
这篇内容概述了云原生架构的优势,特别是通过阿里云容器服务Kubernetes版(ACK)和应用负载均衡器(ALB)实现的解决方案。它强调了ACK相对于自建Kubernetes的便利性,包括优化的云服务集成、自动化管理和更强的生态系统支持。文章提供了部署云原生应用的步骤,包括一键部署和手动部署的流程,并指出手动部署更适合有技术背景的用户。作者建议在预算允许的情况下使用ACK,因为它能提供高效、便捷的管理体验。同时,文章也提出了对文档改进的建议,如添加更多技术细节和解释,以帮助用户更好地理解和实施解决方案。最后,展望了ACK未来在智能化、安全性与边缘计算等方面的潜在发展。水文一篇,太忙了,见谅!
|
1天前
|
存储 设计模式 前端开发
软件架构设计的原则与模式:构建高质量系统的基石
【7月更文挑战第26天】软件架构设计是构建高质量软件系统的关键。遵循高内聚、低耦合、单一职责等设计原则,并灵活运用分层架构、微服务架构、客户端-服务器架构等设计模式,可以帮助我们设计出更加灵活、可扩展、可维护的软件系统。作为开发者,我们应该不断学习和实践这些原则与模式,以提升自己的架构设计能力,为团队和用户提供更加优秀的软件产品。
|
26天前
|
消息中间件 Java API
解析Java微服务架构:从零构建高性能系统
解析Java微服务架构:从零构建高性能系统
|
5天前
|
存储 搜索推荐 API
在单系统内架构形态中,什么是起步时的domain设计
在单系统内架构形态中,什么是起步时的domain设计
|
1月前
|
Kubernetes 测试技术 持续交付
深入理解微服务架构及其在现代后端系统中的应用
本文将深入探讨微服务架构的核心概念、设计原则以及如何在现代后端系统中实现和优化它。我们将从微服务的定义开始,逐步展开讨论其优势、面临的挑战,以及如何克服这些挑战。同时,文章还会涉及微服务与容器化技术、持续集成/持续部署(CI/CD)的协同作用,以及微服务架构的未来发展趋势。读者将获得对微服务架构全面而深刻的理解,并能够识别在实施过程中可能遇到的陷阱和解决方案。
68 1
|
15天前
|
前端开发 Linux Shell
技术心得:基于AR9331(MIPS架构)分析系统启动过程(uboot)
技术心得:基于AR9331(MIPS架构)分析系统启动过程(uboot)
|
1月前
|
设计模式 运维 供应链
探讨微服务架构如何降低系统复杂度
探讨微服务架构如何降低系统复杂度
36 1
|
1月前
|
监控 API 数据库
构建高效后端:微服务架构的实战指南
【6月更文挑战第14天】在数字化浪潮下,后端开发面临着前所未有的挑战和机遇。本文将深入探讨微服务架构的设计理念、实现方式及其在现代软件开发中的重要性,为读者提供一份全面而实用的微服务实战手册。
35 2

推荐镜像

更多