- 优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统
- Ceph 的统一体现在可以提供文件系统、块存储和对象存储,分布式体现在可以动态扩展
- Ceph 俨然已经发展为一整套存储解决方案,上层能够提供对象存储(RGW)、块存储(RBD)和CephFS,可以说是一套适合各种场景,非常灵活,非常有可发挥空间的存储解决方案
组件
基本组件
Monitor:一个 Ceph 集群需要多个 Monitor 组成的小集群,它们通过 Paxos 同步数据,用来保存 OSD 的元数据。
OSD:全称 Object Storage Device,也就是负责响应客户端请求返回具体数据的进程,一个 Ceph 集群一般都有很多个 OSD。主要功能用于数据的存储,当直接使用硬盘作为存储目标时,一块硬盘称之为 OSD,当使用一个目录作为存储目标的时候,这个目录也被称为 OSD。
MDS:全称 Ceph Metadata Server,是 CephFS 服务依赖的元数据服务,对象存储和块设备存储不需要该服务。
Object:Ceph 最底层的存储单元是 Object 对象,一条数据、一个配置都是一个对象,每个 Object 包含 ID、元数据和原始数据。
Pool:Pool 是一个存储对象的逻辑分区,它通常规定了数据冗余的类型与副本数,默认为3副本。对于不同类型的存储,需要单独的 Pool,如 RBD。
PG:全称 Placement Grouops,是一个逻辑概念,一个 OSD 包含多个 PG。引入 PG 这一层其实是为了更好的分配数据和定位数据。每个 Pool 内包含很多个 PG,它是一个对象的集合,服务端数据均衡和恢复的最小单位就是 PG。
- pool 是 ceph 存储数据时的逻辑分区,它起到 namespace 的作用
- 每个 pool 包含一定数量(可配置)的 PG
- PG 里的对象被映射到不同的 Object 上
- pool 是分布到整个集群的
FileStore与BlueStore:FileStore 是老版本默认使用的后端存储引擎,如果使用 FileStore,建议使用 xfs 文件系统。BlueStore 是一个新的后端存储引擎,可以直接管理裸硬盘,抛弃了 ext4 与 xfs 等本地文件系统。可以直接对物理硬盘进行操作,同时效率也高出很多。
RADOS:全称 Reliable Autonomic Distributed Object Store,是 Ceph 集群的精华,用于实现数据分配、Failover 等集群操作。
Librados:Librados 是 Rados 提供库,因为 RADOS 是协议很难直接访问,因此上层的 RBD、RGW 和 CephFS 都是通过 librados 访问的,目前提供 PHP、Ruby、Java、Python、C 和 C++ 支持。
CRUSH:CRUSH 是 Ceph 使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。
RBD:全称 RADOS Block Device,是 Ceph 对外提供的块设备服务,如虚拟机硬盘,支持快照功能。
RGW:全称是 RADOS Gateway,是 Ceph 对外提供的对象存储服务,接口与 S3 和 Swift 兼容。
CephFS:全称 Ceph File System,是 Ceph 对外提供的文件系统服务。
块存储
典型设备
磁盘阵列,硬盘,主要是将裸磁盘空间映射给主机使用的。
Ceph的块存储是基于对象存储来实现的,实现原理也非常简单。从我们普通用户的角度来看,块设备其实就是一个线性的存储空间,可以理解为一个大数组。由于是线性空间,其实这个块设备在集群层面完全可以以对象的方式存储。最简单的方式就是一个块设备对应一个对象。
但是如果一个块设备对应一个对象,那么会出现数据过于集中的情况。因此,在Ceph中将块设备切割为4MB大小的对象,并且将块数据分散在这些对象中。Ceph的处理方式也非常简单,对象名称通过块设备名称和LBA组合的方式生成,这样就可以保证对象名称的唯一性。而当用户访问块设备是,根据访问的偏移就可以定位到具体的对象。
当然,上述是简单介绍了一下基本原理。其实Ceph的块设备有很多参数,比如分割对象大小,条带化等等。可以根据业务模式调整这些参数,从而提升块存储的性能。
优点
- 通过 Raid 与 LVM 等手段,对数据提供了保护。
- 多块廉价的硬盘组合起来,提高容量。
- 多块磁盘组合出来的逻辑盘,提升读写效率。
缺点
- 采用 SAN 架构组网时,光纤交换机,造价成本高。
- 主机之间无法共享数据。
使用场景
- Docker 容器、虚拟机磁盘存储分配。
- 日志存储
- 文件存储
…
文件存储
典型设备
FTP、NFS 服务器,为了克服块存储文件无法共享的问题,所以有了文件存储,在服务器上架设 FTP 与 NFS 服务器,就是文件存储。
文件系统整体架构并没有太大的差异,其底层依赖的还是RADOS集群的对象存储。文件系统最大的特点在于对维护文件系统的目录结构,因此在Ceph中通过一个元数据集群(MDS)实现对文件元数据的管理。
为了比较清楚的理解文件系统的架构,我们给出如图所示的架构图。这里重点强调MDS集群的作用。当客户端访问文件系统的时候,需要先与MDS交互。以写数据为例,首先需要与MDS交互确认文件存在,并且获得访问权。
当然,如果文件不存在,则需要在MDS创建文件。同时再MDS上还维护这文件的元数据,包括文件创建时间、大小和扩展属性等等内容。
为了方便用户使用,Cephfs在客户端有多中实现形态。最常见的是在Linux内核中实现了一个客户端文件系统。该文件系统类似NFS的客户端文件系统,其位于VFS之下。普通用户可以通过挂载(mount)的方式实现对Ceph文件系统的挂载,然后就像访问本地文件系统一样访问Ceph文件系统。
除此之外,用户该可以通过动态库或者fuse实现的文件系统对Ceph文件系统进行访问。
优点
- 造价低,随便一台机器就可以了
- 方便文件可以共享
缺点
- 读写速率低
- 传输速率慢
使用场景
- 日志存储
- 有目录结构的文件存储
- …
对象存储
典型设备
内置大容量硬盘的分布式服务器(swift, s3);多台服务器内置大容量硬盘,安装上对象存储管理软件,对外提供读写访问功能。
虽然RADOS本身提供的是对象存储服务,但是其提供的只是基础的对象访问能力,而且只能通过Ceph客户端访问。为了提供类似AWS的S3的特性和Swift对象存储的特性,Ceph实现了一个对象存储网关。
对象存储网关(Rados Gateway,简称RGW)实际上实现的是一个接口协议的转换。通过RGW我们在客户端可以通过通用的http协议访问对象存储,而且在存储网关中实现了很多特性。比如对象的属性、ACL和多租户等等。
优点
- 具备块存储的读写高速。
- 具备文件存储的共享等特性
使用场景:(适合更新变动较少的数据)
- 图片存储
- 视频存储
- …
特点:
1、高性能:
a. 摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。
b.考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
c. 能够支持上千个存储节点的规模,支持TB到PB级的数据。
2、高可用性:
a. 副本数可以灵活控制。
b. 支持故障域分隔,数据强一致性。
c. 多种故障场景自动进行修复自愈。
d. 没有单点故障,自动管理。
3、高可扩展性:
a. 去中心化。
b. 扩展灵活。
c. 随着节点增加而线性增长。
4、特性丰富:
a. 支持三种存储接口:块存储、文件存储、对象存储。
b. 支持自定义接口,支持多种语言驱动。
要把存储池当 CephFS 用,你必须把它加入元数据服务器。
$ ceph mds add_data_pool cephfs_data_ssd
RADOS原理, RADOS的整体软件架构如图所示,最底层负责消息的收发,通常是以太网,基于TCP/IP协议。然后是集群对象管理和本地对象管理,集群对象管理负责分布式对象的管理,保证对象数据的可靠性,本地对象管理负责逻辑对象数据与磁盘物理数据的对应关系。另外就是元数据集群,其中维护着各种Map信息,包括MonMap、CrushMap、PGMap和OSDMap。
MonMap是对元数据集群的描述,其中包括元数据集群各个物理节点的IP地址等信息。如本专栏创建的集群的Mon信息。
可以 通过 ceph mon dump来查看MonMap内容。
SDMap是集群中OSD物理节点的信息,包括IP地址、OSD权重和版本等内容。PGMap描述了数据PG与OSD的对应关系。PG在Ceph中成为放置组,它是Ceph存储池的逻辑单元,可以理解为存储池的逻辑分区。
客户端在初始化是会拉取最新的元数据信息,并缓存到客户端。当客户端对某个对象读写数据的时候,根据对象的名称可以计算出一个哈希值。然后,通过对哈希值与PG组取模运算,得到对应所处于的PG。最后根据PG与OSD的映射关系,可以定位到具体的OSD。
crushMap可以调整集群的映射图,以实现对节点的磁盘存储资源的合理管控,例如实现合理的磁盘分组和故障域划分,以避免磁盘或者节点损坏带来的风险。
PG与OSD的对应关系是通过Crush算法计算得到的。这个映射关系通常是稳定的,但也是不稳定的,因为任何故障都会导致映射关系的变化,比如磁盘故障、服务器故障或者网卡故障等等。
可以看到从逻辑上来看,RADOS集群及组件并不复杂。但实际情况并非如此,RADOS集群的具体实现还是比较复杂的,这主要与其要处理的各种异常情况相关。
元数据的可靠性也是通过多副本保证的。在生产环境下,Ceph存储系统建议元数据服务器的数量最少为3台。也就是说元数据会同时存储在3台服务器上。这样,即使出现某一台服务宕机或者其它故障,仍然可以通过其它服务器访问元数据。
元数据的一致性保证与数据略有不同,它是通过一个名为Paxos的分布式一致性协议来保证的。关于该部分内容本文不再详细介绍,更详细的内容请参考《Paxos算法实例解析之Ceph Monitor》一文。
容灾方面:
1、创建机柜
ceph osd crush add-bucket rack1 rack
ceph osd crush add-bucket rack2 rack
2、将rack移动到root下
ceph osd crush move rack1 root=default
ceph osd crush move rack2 root=default
3、将主机移动到机柜中
ceph osd crush move node1 rack=rack1
ceph osd crush move node2 rack=rack2
4、创建rule(默认 firstn ,indep 更适合纠删码存储池)
ceph osd crush rule create-simple testrule default rack firstn
5、修改已经创建pool的rule
luminus 以后版本设置pool规则的语法是
ceph osd pool set demo crush_rule testrule
6、创建pool
ceph osd pool create demo 64 replicated testrule
7、在ceph.conf中加入防止集群重启crush map被重置
osd crush update on start = false
关于文件系统,对象存储,块儿存储的区别
块存储
提供的是不带文件系统裸磁盘,使用之前需先进行初始化。我们比较常见的块存储形式是我们的Windows硬盘或手机存储空间,数据是按字节来存储和访问的。
块存储使用时,文件系统在客户端,例如Windows系统,我们可以在Windows桌面查看我们存储的内容,但是对于硬盘里的内容和格式,我们是一无所知的,只有借助客户端的文件系统才能查看。
通俗的来说,就如上图,数据就像每个瓜子一样,堆放在存储仓里。瓜子就是每个数据块,这个存储舱就是磁盘。块存储只关心瓜子的进来和出去,不关心瓜子粒之间的关系和用途。
由于块存储只负责数据读取和写入,因此具有有高带宽、低延迟的优势,但是扩展能力有限,适用于对响应时间要求高的系统。比如数据库、ERP等企业核心应用的存储等。DAS、SAN这两种存储设备属于块存储类型,
对象存储、文件存储和块存储区别为:存储设备不同、特点不同、缺点不同。
客户端的使用
在客户端使用rbd设备时,一般有两种方法。
- kernel rbd。就是创建了rbd设备后,把rbd设备map到内核中,形成一个虚拟的块设备,这时这个块设备同其他通用块设备一样,一般的设备文件为/dev/rbd0,后续直接使用这个块设备文件就可以了,可以把/dev/rbd0格式化后mount到某个目录,也可以直接作为裸设备使用。这时对rbd设备的操作都通过kernel rbd操作方法进行的。
- librbd方式。就是创建了rbd设备后,这时可以使用librbd、librados库进行访问管理块设备。这种方式不会map到内核,直接调用librbd提供的接口,可以实现对rbd设备的访问和管理,但是不会在客户端产生块设备文件。
一、存储设备不同
1、对象存储:对象存储的对应存储设备为swift,键值存储。
2、文件存储:文件存储的对应存储设备为FTP、NFS服务器。
3、块存储:块存储的对应存储设备为cinder,硬盘。
二、特点不同
1、对象存储:对象存储的特点是具备块存储的高速以及文件存储的共享等特性。
2、文件存储:文件存储的特点是一个大文件夹,大家都可以获取文件。
3、块存储:块存储的特点是分区、格式化后,可以使用,与平常主机内置硬盘的方式完全无异。
三、缺点不同
1、对象存储:对象存储的缺点是不兼容多种模式并行。
2、文件存储:文件存储的缺点是传输速率低。
3、块存储:块存储的缺点是不能共享数据。
设置多活mds
[root@master0 ~]# ceph fs set cephfs max_mds 2
[root@master0 ~]# ceph fs status
cephfs - 1 clients
======
RANK STATE MDS ACTIVITY DNS INOS
0 active cephfs.master2.morfxe Reqs: 0 /s 10 13
1 active cephfs.master0.yfxcan Reqs: 0 /s 10 13
POOL TYPE USED AVAIL
cephfs.cephfs.meta metadata 1577k 947G
cephfs.cephfs.data data 0 947G
STANDBY MDS
cephfs.master1.yizgfn
MDS version: ceph version 15.2.16 (d46a73d6d0a67a79558054a3a5a72cb561724974) octopus (stable)
配置命令:
ceph对象分片,目前貌似只有rbd对象会按照默认4M的大小进行分片,对象存储和ceph文件系统,不进行分片;分片后,元数据是要保存到rocksDb中的,读取的时候,还是需要访问rocksDb的
ceph config dump将转储集群的整个配置数据库。
ceph config get 将转储特定守护程序或客户端的配置(例如,mds.a),存储在监视器的配置数据库中。
ceph config set 将在监视器的配置数据库中设置一个配置选项。
ceph config show 将显示正在运行的守护程序的报告运行配置。如果还有正在使用的本地配置文件或选项已在命令行或运行时被覆盖,则这些设置可能与监视器存储的设置不同。选项值的来源作为输出的一部分报告。
ceph config assimilate-conf -i -o 将从输入文件中提取配置文件并将任何有效选项移动到监视器的配置数据库中。任何无法识别、无效或无法由监视器控制的设置都将在存储在 输出文件中的简短配置文件中返回。此命令对于从旧配置文件转换到基于监视器的集中配置很有用。