分布式存储 Ceph 的演进经验

从 2004 年到今天,Ceph 的存储后端一直都在演变,从最开始基于 B 树的 EBOFS 演变到今天的 BlueStore,存储后端已经变得非常成熟,新的存储系统不仅能够提供良好的性能,还有着优异的兼容性。我们在这篇文章中将要简单介绍分布式存储 Ceph 的架构以及演进过程中遇到的挑战。

Ceph 架构

分布式文件系统能够聚合多个物理机上的存储空间并对外提供具有大带宽、并行 I/O、水平扩展、容错以及强一致性的数据存储系统。不同的分布式系统可能在设计上稍有不同并且使用不同的术语描述物理机上用于管理存储资源的模块,但是存储后端(Storage backend)一般都被定义为直接管理物理机上存储设备的软件模块;而在 Ceph 中这一模块就是对象存储设备(Object Storage Devices、OSDs):

Ceph 使用如上图所示的架构,它的核心是可靠自主分布式对象存储(Reliable Autonomic Distributed Object Store、RADOS),该模块可以水平扩展出成千上万个 OSDs 提供自愈、自管理并且强一致的副本对象存储服务。

我们可以使用 Ceph 提供的 librados 操作 RADOS 中存储的对象和对象集合,该库提供了易于操作的事务接口,在该接口之上我们可以构建出:

  • RADOS 网关(RGW):类似于 Amazon S3 的对象存储;
  • RADOS 块设备(RBD):类似于 Amazon EBS 的虚拟块设备;
  • CephFS:提供 POSIX 语义的分布式文件系统;

RADOS 中的对象会被存储在逻辑分区中,也就是池(Pool);对象会在池中分片,每个分片单位被称作放置组(Placement Groups、PGs),放置组中的数据会根据配置好的副本数同步到多个 OSD 上,这样可以在单个 OSD 宕机时保证数据的正确性。

RADOS 集群中的每个节点都会为每个本地存储设备运行独立的 OSD 守护进程,这些进程会处理来自 librados 的请求并配合其他 OSD 节点完成数据的拷贝、迁移以及错误恢复等操作,所有的数据都会通过内部的 ObjectStore 接口持久化到本地,我们可以为硬件设备实现不同的接口以满足兼容性的需求。

演进挑战

与其他的分布式文件系统不同,今天 Ceph 的存储后端 BlueStore 绕过了本地的文件系统,直接管理本地的裸设备,这是因为 Ceph 团队的经验说明在本地的文件系统上构建存储后端是一件非常麻烦的事情:

  1. 在本地文件系统上直接构建无额外开销的事务机制是非常复杂的;
  2. 本地文件系统的元数据性能对分布式文件系统的性能有很严重的影响;
  3. 成熟的文件系统有着非常严格的接口,适配新的存储硬件很困难;

高效事务

事务可以通过将一系列操作封装到独立的原子单元来简化应用程序的开发,这一系列操作要么全部执行、要么全不执行,对数据库稍有了解的工程师应该都很了解事务的四个特性,也就是原子性、一致性、隔离性和持久性,我们这里就不展开讨论了。

虽然事务能够极大地简化应用程序开发者的工作并减轻负担,但是想要在本地的文件系统之上支持高效地事务机制是非常有挑战的任务,这篇论文给出了三种实现事务的方法:

  1. 基于文件系统内部的事务机制 — 很多文件系统都在内部实现了事务,这样能够原子地执行一些内部的复合操作,然而因为这些事务机制仅用于内部,所以功能非常受限、甚至不可用,所以也就很难利用文件系统的内部事务;
  2. 在用户空间实现逻辑预写式日志(Write-Ahead Log、WAL)— 虽然这种实现方式可以工作,但是它却会遇到三个比较严重的问题;读-修改-写操作缓慢(Slow Read-Modify-Write)— 基于 WAL 的日志机制会为每个事务执行如下所示的步骤:序列化事务并写入日志、调用 fsync 提交事务、事务操作提交到文件系统,因为每个事务在执行前都需要读取前一个事务执行的结果,即等待三个步骤执行完成,所以这种实现比较低效;非幂等操作(Non-Idempotent Operations)— 部分文件的操作可能不是幂等的,错误恢复重放日志时会导致数据发生错误的结果甚至数据损坏;双写(Double Writes)— 所有数据都会被先写入 WAL 并随后写入文件系统,同时向两个地方写入相同的数据会降低一半的磁盘带宽;
  3. 使用支持事务的键值数据库 — 元数据存储在 RocksDB 中,而对象仍然使用文件系统存储,因为在存储中写入对象需要分别将对象写入文件、将元数据写入 RocksDB 并调用两次 fsync,而部分文件系统(JFS)对每个 fsync 都会触发两次昂贵的 FLUSH CACHE,这也就是一致性带来的高额外开销;

快速元数据操作

本地文件系统中低效地元数据操作对分布式文件系统的影响非常大,当我们使用 readdir 操作在 Ceph 中遍历大的文件目录时,就可以体会到元数据操作对整体性能的影响。

RADOS 集群中的对象会根据文件名的哈希映射到某一个放置组中,这些对象在遍历时也会遵循哈希顺序,当我们在系统中遇到很长的对象名时,可能需要使用扩展属性突破本地文件系统的文件名长度限制,查找这些文件时也需要调用 stat 获取文件的真实文件名进行比对。为了解决系统的缓慢遍历问题,我们使用如下所示的层级结构来存储文件对象:

查找或者遍历文件时,我们会先选择合适的文件夹,再遍历文件夹中的对象,而为了减少 stat 函数的调用,存储后端需要保证每个文件夹中的文件尽可能少;当文件夹中的内容逐渐增加时,我们也需要将其中的内容拆分到多个文件夹中,不过这个内容分割的过程却是极其耗时的。

支持新硬件设备

因为分布式的文件系统的运行基于本地的文件系统,而存储硬件的高速发展会为分布式文件系统带来更多的挑战。为了提高存储设备的容量与性能,HDD、SSD 的提供商通过引入主机管理的 SMR 以及 ZNS 技术对现有的硬件进行改进,这些技术对提高分布式文件系统的性能异常重要,而存储设备的开发商也在开发新的硬件,这也增加了文件系统的适配成本。

总结

传统的分布式文件系统开发者一般都会将本地的文件系统作为它们的存储后端,然后尝试基于本地的文件系统构建更加通用的文件系统,然而因为底层的工具并不能完全兼容,所以这会为项目带来极大的复杂性,这是因为很多开发者认为开发新的文件系统可能需要 10 年的时间才能成熟,然而基于 Ceph 团队的经验,从零开始开发成熟的存储后端并不要那么长的周期。

从作者的角度来看,Ceph 的演进过程其实是合理的,我们在刚开始构建系统时希望尽可能利用现有的工具减少我们的工作量,只有当现有的工具不再趁手时,才应该考虑从零构建复杂的系统,如果 Ceph 从立项开始就从零构建存储后端,可能 Ceph 也不会占领市场并得到今天这样的地位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/316262.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器数据恢复—Storwize V3700存储数据恢复案例

服务器存储数据恢复环境: 某品牌Storwize V3700存储,10块硬盘组建了2组Mdisk加入到一个存储池中,一共创建了1个通用卷来存放数据,主要数据为oracle数据库。 服务器存储故障: 其中一组Mdisk中两块磁盘出现故障离线&…

使用selenium时出现element click intercepted报错的解决办法

win10,python3.8.10。 selenium版本如下(用pip38 show selenium查看): 在定位中,定位了一个按钮(特点:button下还有span然后才是文本),代码如下: from sele…

枚举(enum)/共用体(union)/结构体(struct)---详解

前言 C语言包含内置类型和自定义类型。 其实C语言中有内置类型,包含:char,short,int,long,long long,float,double,long double ,这些是C语言本身支持的现成的类型。 但仅仅只有内置类型是远远不够的,在描述一个复杂对象是无法使用内置类型来…

Linux工具篇 之 vim概念 操作 及基础指令讲解

学校不大 创造神话 讲桌两旁 陨落的王 临时抱佛脚 佛踹我一脚 书山有路勤为径 游戏玩的很起劲 想要计算机学的好,我的博客列表是个宝 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀…

前端学习笔记3

列表、表格与表单​ 列表就是信息资源的一种展示形式。它可以使信息结构化和条理化,并以列表的样式显示出来,以便浏览者能更快捷地获得相应的信息。 3.0 代码访问地址 https://gitee.com/qiangge95243611/java118/tree/master/web/day03 3.1 列表 ​ 列表大致可以分为3类…

怎么给字符串字段加索引?

怎么给字符串字段加索引? 现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是我们今天要讨论的问题。 假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的: …

如何实现直播声卡反向给手机充电功能呢?

在数字化时代的浪潮中,声卡作为多媒体系统的核心组件,扮演着声波与数字信号相互转换的关键角色。它不仅能够将来自各类音源的原始声音信号转换为数字信号,进而输出到各类声响设备,更能够通过音乐设备数字接口(MIDI)发出合成乐器的…

STM32点灯大师(点了一颗LED灯,轮询法)

配置操作: 一、使用CubeMX配置到大致的操作 1.1 选择芯片 1.2 选择引脚(根据电路图) 1.3 配置gpio口 1.4 配置系统 1.5文件项目操作 最后就是点击 二、点击CubeMX生成的代码,并且修改代码 2.1 看看效果 2.2 写代码

架构师技能:技术深度硬实力透过问题看本质--深入分析nginx偶尔502错误根因

以架构师的能力标准去分析每个问题,过后由表及里分析问题的本质,复盘总结经验,并把总结内容记录下来。当你解决各种各样的问题,也就积累了丰富的解决问题的经验,解决问题的能力也将自然得到极大的提升。励志做架构师的…

Linux|awk 特殊模式“BEGIN 和 END”

引言 在本文[1],我们将介绍Awk的更多特性,特别是两个特殊的模式:BEGIN和END。 这些独特的功能在我们努力扩展和深入探索构建复杂Awk操作的多种方法时,将大有裨益。 实例 让我们从Awk系列的开篇回顾开始,回想一下&#…

2024抖音AI图文带货班:在这个赛道上 乘风破浪 拿到好效果

课程目录 1-1.1 AI图文学习指南 1.mp4 2-1.2 图文带货的新机会 1.mp4 3-1.3 2024年优质图文新标准 1.mp4 4-1.4 图文如何避免违规 1.mp4 5-1.5 优质图文模板解析 1.mp4 6-2.1 老号重启 快速破局 1.mp4 7-2.2 新号起号 不走弯路 1.mp4 8-2.3 找准对标 弯道超车 1.mp4 9…

DRF学习之三大认证

一、认证 1、自定义认证 在前面说的 APIView 中封装了三大认证,分别为认证、权限、频率。认证即登录认证,权限表示该用户是否有权限访问接口,频率表示用户指定时间内能访问接口的次数。整个请求最开始的也是认证。 (1&#xff…

Qt : 在QTreeWidget中添加自定义右键菜单

一、引言 如图,我们需要在一个QTreeWidget 控件中添加了自定义右键菜单。 二、思路 如何做到的呢,很简单。浅浅记录和分享一下。 继承QTreeWidget,定义一个子类CustomTreeWidget ,在重写contextMenuEvent 事件即可。 三、代…

基于 Spring Boot 博客系统开发(二)

基于 Spring Boot 博客系统开发(二) 本系统是简易的个人博客系统开发,为了更加熟练地掌握SprIng Boot 框架及相关技术的使用。🌿🌿🌿 基于 Spring Boot 博客系统开发(一)&#x1f4…

PHP 错误 Unparenthesized `a ? b : c ? d : e` is not supported

最近在一个新的服务器上测试一些老代码的时候得到了类似上面的错误: [Thu Apr 25 07:37:34.139768 2024] [php:error] [pid 691410] [client 192.168.1.229:57183] PHP Fatal error: Unparenthesized a ? b : c ? d : e is not supported. Use either (a ? b : …

语音识别的基本概念

语音识别的基本概念​​​​​​​ ​​​​​​​ 言语是一种复杂的现象。人们很少了解它是如何产生和感知的。天真的想法常常是语音是由单词构成的,而每个单词又由音素组成。不幸的是,现实却大不相同。语音是一个动态过程,没有明确区分的…

Baidu comate智能编程助手评测

Baidu comate智能编程助手评测 作者:知孤云出岫 目录 一. 关于comate产品 二. 关于comate产品体验 三. 关于实际案例. 四. 关于baidu comate编程助手的实测体验感悟 五. …

如何快速申请SSL证书实现HTTPS访问?

申请SSL证书最简单的方法通常涉及以下几个步骤,尽量简化了操作流程和所需专业知识: 步骤一:选择适合的SSL证书类型 根据您的网站需求,选择最基础的域名验证型(DV SSL)证书,它通常只需验证域名所…

从 MySQL 到 ClickHouse 实时数据同步 —— Debezium + Kafka 表引擎

目录 一、总体架构 二、安装配置 MySQL 主从复制 三、安装配置 ClickHouse 集群 四、安装 JDK 五、安装配置 Zookeeper 集群 六、安装配置 Kafaka 集群 七、安装配置 Debezium-Connector-MySQL 插件 1. 创建插件目录 2. 解压文件到插件目录 3. 配置 Kafka Connector …

Profinet转Modbus网关接称重设备与1200PLC通讯

Profinet转Modbus网关(XD-MDPN100)是一种能够实现Modbus协议和Profinet协议之间转换的设备。Profinet转Modbus网关可提供单个或多个RS485接口,使用Profinet转Modbus网关将称重设备与西门子1200 PLC进行通讯,可以避免繁琐的编程和配…