目录

Ceph 简介

ceph的构成

        ceph 集群基础:

                 Monitor(ceph-mon):ceph 监视器

                 Managers(ceph-mgr)的功能:

                Ceph OSDs(对象存储守护程序 ceph-osd):

                 MDS(ceph 元数据服务器,ceph-mds):

                Ceph 的管理节点:

 元数据的保存方式

                xattr 扩展属性

                omap(object map 对象映射):

                filestore与leveldb

                bluestore 与 rocksdb

CRUSH 算法简介


Ceph 简介

        Ceph 是一个开源的分布式存储系统,包括对象存储、块设备、文件系统

        ceph 是一个对象(object)式存储系统,它把每一个待管理的数据流(文件等数据)切分为一到多个固定大小(默认 4 兆)的对象数据,并以其为原子单元(原子是构成元素的最小单元)完成数据的读写。

        对象数据的底层存储服务是由多个存储主机(host)组成的存储集群,该集群也被称之为

RADOS(reliable automatic distributed object store)存储集群,即可靠的、自动化的、分布式的

对象存储系统。

ceph的构成

  • Pool:存储池、分区,存储池的大小取决于底层的存储空间。

  • PG(placement group):一个 pool 内部可以有多个 PG 存在,pool 和 PG 都是抽象的逻辑概念,一个 pool 中有多少个 PG 可以通过公式计算。

  • OSD(Object Storage Daemon):每一块磁盘叫做 osd,多个 osd 组成一个主机

  • librados 是 RADOS 存储集群的 API,支持 C/C++/JAVA/python/ruby/php 等编程语言客户端调用。

分布式存储系统之Ceph(理论详解)-编程之家

 

        存储池要先创建才能往 ceph 保存数据,文件在向 ceph 保存之前要先进行一致性 hash 计算,计算后会把文件保存在某个对应的 PG 的,某个文件一定属于某个 pool 的 PG,在通过 PG保存在 OSD 上。数据对象在写到主 OSD 之后再同步到从 OSD 以实现数据的高可用。

存储过程:

第一步:把文件对象映射给 PG

第二步: 把文件对象映射到OSD,

第三步:通过 OSD 写入到硬盘

监视器 mon 维护 OSD 和 PG 的集群状态,

分布式存储系统之Ceph(理论详解)-编程之家

 

        ceph 集群基础:

分布式存储系统之Ceph(理论详解)-编程之家

 

一个 ceph 集群的组成部分:

        1、若干的 Ceph OSD(对象存储守护程序) 实际的服务器

        2、两个或以上的 Ceph 管理器 managers,运行 Ceph 文件系统客户端时,还需要高可用的 Ceph Metadata Server(文件系统元数据服务器)。负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率,当前性能 指标和系统负载等。 可以兼容普罗米修斯

        3、RADOS cluster:由多台 host 存储服务器组成的 ceph 集群。 RADOS (Reliable, Autonomic Distributed Object Store) 是Ceph的核心之一,作为Ceph分布式文件系统的一个子项目,特别为Ceph的需求设计,能够在动态变化和异质结构的存储设备机群之上提供一种稳定、可扩展、高性能的单一逻辑对象(Object)存储接口和能够实现节点的自适应和自管理的存储系统

        4、OSD(Object Storage Daemon):每台存储服务器的磁盘组成的存储空间

        5、Mon(Monitor):ceph 的监视器,维护 OSD 和 PG 的集群状态,一个 ceph 集群至少要有一个mon,可以是一三五七等等这样的奇数个。

                 Monitor(ceph-mon):ceph 监视器

        在一个主机上运行的一个守护进程,用于维护集群状态映射(maintains maps of the cluster state),比如 ceph 集群中有多少存储池、每个存储池有多少 PG 以及存储池和 PG 的映 射关系等, monitor map, manager map, the OSD map, the MDS map, and the CRUSH map,这 些映射是 Ceph 守护程序相互协调所需的关键群集状态,此外监视器还负责管理守护程序和 客户端之间的身份验证(认证使用 cephX 协议)。通常至少需要三个监视器才能实现冗余和高 可用性

                 Managers(ceph-mgr)的功能:

        在一个主机上运行的一个守护进程,Ceph Manager 守护程序(ceph-mgr)负责跟踪运 行时指标和 Ceph 集群的当前状态,包括存储利用率,当前性能指标和系统负载。Ceph Manager 守护程序还托管基于python 的模块来管理和公开 Ceph 集群信息,包括基于 Web 的 Ceph 仪表板和 REST API。高可用性通常至少需要两个管理器。

                Ceph OSDs(对象存储守护程序 ceph-osd):

        提供存储数据,一个磁盘就是一个 OSD,因此一个服务器的 OSD 不能超过磁盘的总数, OSD 用于处理 ceph 集群数据复制,恢复,重新平衡,并通过检查其他 Ceph OSD 守护程序的 心跳来向 Ceph 监视器和管理器提供一些监视信息。通常至少需要 3 个 Ceph OSD 才能实现 冗余和高可用性。

                 MDS(ceph 元数据服务器,ceph-mds):

        代表 ceph文件系统(NFS/CIFS)存储元数据,(即 Ceph块设备和 Ceph对象存储不使用 MDS)

                Ceph 的管理节点:

        1、ceph 的常用管理接口是一组命令行工具程序,例如 rados、ceph、rbd 等命令,ceph 管理员可以从某个特定的 ceph-mon 节点执行管理操作

        2、推荐使用部署专用的管理节点对 ceph 进行配置管理、升级与后期维护,方便后期权限管理,管理节点的权限只对管理人员开放,可以避免一些不必要的误操作的发生。

 元数据的保存方式

        Ceph 对象数据的元数据信息放在哪里呢? 对象数据的元数据以 key-value 的形式存在, 在RADOS 中有两种实现:xattrs 和 omap:

        ceph 可选后端支持多种存储引擎,比如 filestore,kvstore,memstore,目前是以 kvstore 的 形式存储对象数据的元数据信息。

                xattr 扩展属性

        是将元数据保存在对象对应文件数据中并保存到系统磁盘上,这要求支持对象存储的 本地文件系统(一般是 XFS)支持扩展属性。元数据和数据放一起

                omap(object map 对象映射):

        omap:是 object map 的简称,是将元数据保存在本地文件系统之外的独立 key-value 存储 系统中,在使用 filestore 时是 leveldb,在使用 bluestore 时是 rocksdb,由于 filestore 存 在功能问题(需要将磁盘格式化为 XFS 格式)及元数据高可用问题等问题,因此在目前 ceph 主要使用 bluestore。

                filestoreleveldb

        ceph 早期基于 filestore 使用 google 的 levelDB 保存对象的元数据,LevelDb 是一个持久化存 储的 KV 系统,和 Redis 这种内存型的 KV 系统不同,LevelDb 不会像 Redis 一样将数据放在内存从而占用大量的内存空间,而是将大部分数据存储到磁盘上,但是需要把磁盘上的 levelDB 空间格式化为文件系统(XFS).

        FileStore 将数据保存到与 Posix 兼容的文件系统(例如 Btrfs、XFS、Ext4)。在 Ceph 后端使用传 统的 Linux 文件系统尽管提供了一些好处,但也有代价,如性能、 对象属性与磁盘本地文 件系统属性匹配存在限制等

filestore 数据写入的过程

        1、先把要写入的数据全部封装成一个事务,其整理作为一条日志,写入日志磁盘(一般把 日志放在 ssd 上提高性 能),这个过程叫日志的提交(journalsubmit)。

        2、把数据写入对象文件的磁盘中(也就是 OSD 的磁盘中),这个过程叫日志的应用(journal apply)。这个过程不一定写入磁盘,有可能缓存在本地文件系统的 page cache 中。 当系统在日志提交的过程中出错,系统重启后,直接丢弃不完整的日志条目,该条日志对应 的实际对象数据并没有修改,数据保证了一致性。当日志在应用过程中出错,由于日志已写 入到磁盘中,系统重启后,重放(replay)日志,这样保证新数据重新完整的写入,保证了 数据的一致性

filestore 日志的三个阶段

        日志的提交(journal submit):日志写入日志磁盘。 日志的应用(journal apply):日志对应的修改更新到对象的磁盘文件中。这个过程不一定写入 磁盘,有可能缓存在本地文件系统的 page cache 中。 日志的同步(journal sync 或者 journal commit):确定日志对应的修改操作已经刷到磁盘中

                bluestore rocksdb

        由于 levelDB 依然需要需要磁盘文件系统的支持,后期 facebok 对 levelDB 进行改进为 RocksDB,RocksDB 将对象数据的元数据保存在 RocksDB,但是 RocksDB 的数据又放在哪里呢?放在内存怕丢失,放在本地磁盘但是解决不了高可用,ceph 对象数据放在了每个 OSD 中,那么就在在当前 OSD 中划分出一部分空间,格式化为 BlueFS 文件系统用于保存 RocksDB 中的元数据信息(称为 BlueStore),并实现元数据的高可用, BlueStore 最大的特点是构建在裸磁盘设备之上,并且对诸如 SSD 等新的存储设备做了很多 优化工作。

#RocksDB:rocksdb 是 facebook 基于 leveldb 开发的一款 kv 数据库,BlueStore 将元数据全部 存放至 RocksDB 中,这些元数据包括存储预写式日志、数据对象元数据、Ceph 的 omap 数 据信息、以及分配器的元数据 。

#BlueRocksEnv
:这是 RocksDB 与 BlueFS 交互的接口;RocksDB 提供了文件操作的接口 EnvWrapper(Env 封装器),可以通过继承实现该接口来自定义底层的读写操作,BlueRocksEnv 就是继承自 EnvWrapper 实现对 BlueFS 的读写。

#BlueFS:BlueFS是BlueStore针对RocksDB开发的轻量级文件系统,用于存放RocksDB产生的.sst 和.log 等文件。 

#BlockDecive:BlueStore 抛弃了传统的 ext4、xfs 文件系统,使用直接管理裸盘的方式;BlueStore 支持同时使用多种不同类型的设备,在逻辑上 BlueStore 将存储空间划分为三层:慢速(Slow) 空间、高速(DB)空间、超高速(WAL)空间,不同的空间可以指定使用不同的设备类型, 当然也可使用同一块设备

        BlueStore 的设计考虑了 FileStore 中存在的一些硬伤,抛弃了传统的文件系统直接管理裸设 备,缩短了 IO 路径,同时采用 ROW 的方式,避免了日志双写的问题,在写入性能上有了极大的提高。

CRUSH 算法简介

        Controllers replication under scalable hashing #可控的、可复制的、可伸缩的一致性 hash 算法

        Ceph 使用 CURSH 算法来存放和管理数据,它是 Ceph 的智能数据分发机制。Ceph 使用 CRUSH 算法来准确计算数据应该被保存到哪里,以及应该从哪里读取,和保存元数据不同,是CRUSH 按需计算出元数据,因此它就消除了对中心式的服务器/网关的需求,它使得 Ceph 客户端能够计算出元数据,该过程也称为CRUSH 查找,然后和 OSD 直接通信。

        1.如果是把对象直接映射到 OSD 之上会导致对象与 OSD 的对应关系过于紧密和耦合,当 OSD 由于故障发生变更时将会对整个 ceph 集群产生影响。

        2.于是 ceph 将一个对象映射到 RADOS 集群的时候分为两步走: 首先使用一致性 hash 算法将对象名称映射到 PG 然后将 PG ID 基于 CRUSH 算法映射到 OSD 即可查到对象

        3.以上两个过程都是以”实时计算”的方式完成,而没有使用传统的查询数据与块设备的对应 表的方式,这样有效避免了组件的”中心化”问题,也解决了查询性能和冗余问题。使得 ceph 集群扩展不再受查询的性能限制。

        4.这个实时计算操作使用的就是 CRUSH 算法 Controllers replication under scalable hashing #可控的、可复制的、可伸缩的一致性 hash 算 法。CRUSH 是一种分布式算法,类似于一致性 hash 算法,用于为 RADOS 存储集群控制数据的 分配

分布式存储系统之Ceph(理论详解)-编程之家