Ceph:一个统一的分布式存储系统

什么是Ceph?

Ceph是一个开源的分布式存储系统,它可以提供对象存储、块存储和文件存储三种接口,满足不同场景的数据存储需求。Ceph的设计目标是提供高性能、高可用性和高可扩展性,以及简化的管理和维护。¹²

Ceph的核心组件是RADOS(Reliable Autonomic Distributed Object Store),它是一个基于对象的存储集群,负责数据的分布、复制、恢复和平衡。RADOS通过一个智能算法CRUSH(Controlled Replication Under Scalable Hashing)来计算数据的位置,避免了传统的中心化元数据服务器的瓶颈和单点故障。²³

Ceph在RADOS之上提供了三种存储接口:

  • RBD(RADOS Block Device):提供虚拟化环境下的块设备服务,支持精简配置、快照和克隆等功能。
  • RGW(RADOS Gateway):提供与S3和Swift兼容的对象存储服务,支持多租户、版本控制和生命周期管理等功能。
  • CephFS(Ceph File System):提供POSIX兼容的文件系统服务,支持快照和多客户端并发访问等功能。²³

Ceph有什么优势?

Ceph作为一个统一的分布式存储系统,具有以下优势:

  • 高性能:Ceph通过CRUSH算法实现了数据的均匀分布和并行访问,提高了I/O效率和吞吐量。同时,Ceph也考虑了容灾域的隔离,能够实现跨机房、机架感知等副本放置规则,降低了网络延迟和故障风险。²
  • 高可用性:Ceph通过数据的多副本或纠删码来保证数据的可靠性和一致性,支持灵活地控制副本数和故障域分隔。Ceph也能够自动检测和修复故障节点,实现无缝切换和恢复。Ceph没有单点故障,所有组件都是去中心化和自管理的。²
  • 高可扩展性:Ceph能够支持上千个存储节点的规模,支持TB到PB级别的数据量。Ceph也能够实现在线扩容和缩容,无需停机或迁移数据。Ceph的性能和容量都能够随着节点增加而线性增长。²
  • 特性丰富:Ceph能够支持三种存储接口,满足不同场景的数据存储需求。Ceph也能够支持自定义接口,支持多种语言驱动。Ceph还提供了丰富的管理工具和监控指标,方便用户对集群进行配置、调优和诊断。²

Ceph适合什么场景?

Ceph作为一个统一的分布式存储系统,适合以下场景:

  • 云计算平台:Ceph能够为云计算平台提供稳定、高效和灵活的存储服务,支持虚拟机镜像、对象存储和文件共享等功能。Ceph也能够与OpenStack、Kubernetes等开源云平台进行深度集成,实现云原生的存储体验。²
  • 大数据分析:Ceph能够为大数据分析提供海量、高速和低成本的存储服务,支持多种数据格式和接口,如HDFS、S3等。Ceph也能够与Hadoop、Spark等开源大数据框架进行无缝对接,实现数据的快速处理和分析。²
  • 多媒体内容:Ceph能够为多媒体内容提供可扩展、高性能和安全的存储服务,支持图片、视频、音频等各种格式的数据存储和传输。Ceph也能够提供多租户、版本控制和生命周期管理等功能,实现数据的隔离和优化。²

Ceph的工作流程与原理

Ceph的工作流程与原理可以分为三个层次:客户端层、集群层和存储层。

客户端层

客户端层是Ceph提供给用户的三种存储接口,分别是对象存储、块存储和文件存储。用户可以根据自己的需求,选择合适的接口来存储和访问数据。

  • 对象存储:对象存储是一种以对象为单位的存储方式,每个对象包含一个唯一的标识符、二进制数据和元数据。对象存储适合存储非结构化或半结构化的数据,如图片、视频、音频等。Ceph提供了一个名为RGW(RADOS Gateway)的服务,它可以兼容S3和Swift等主流的对象存储协议,让用户可以通过RESTful API来操作对象。
  • 块存储:块存储是一种以块为单位的存储方式,每个块有一个固定的大小,通常为4KB或8KB。块存储适合存储结构化或顺序的数据,如数据库、虚拟机镜像等。Ceph提供了一个名为RBD(RADOS Block Device)的服务,它可以把Ceph集群中的对象组合成一个虚拟的块设备,让用户可以通过内核驱动或用户态驱动来操作块。
  • 文件存储:文件存储是一种以文件为单位的存储方式,每个文件包含一个路径、二进制数据和属性。文件存储适合存储文本、代码、配置等数据,支持POSIX兼容的语义,如目录结构、权限控制、快照等。Ceph提供了一个名为CephFS(Ceph File System)的服务,它可以把Ceph集群中的对象组织成一个分布式的文件系统,让用户可以通过内核驱动或FUSE驱动来操作文件。

集群层

集群层是Ceph管理和调度数据分布和复制的核心层,它由以下几个组件构成:

  • RADOS:RADOS(Reliable Autonomic Distributed Object Store)是Ceph集群中负责存储数据的基础服务,它把所有的数据都以对象为单位进行管理。RADOS由多个OSD(Object Storage Daemon)组成,每个OSD负责管理一块或多块磁盘上的对象。RADOS也由多个MON(Monitor)组成,每个MON负责维护集群的状态信息,如集群地图、配置参数、授权信息等。
  • CRUSH:CRUSH(Controlled Replication Under Scalable Hashing)是Ceph集群中负责计算数据位置的智能算法,它可以根据数据的标识符和集群地图来确定数据应该放在哪个OSD上。CRUSH算法可以避免使用中心化的元数据服务器,从而消除单点故障和性能瓶颈。CRUSH算法也可以支持多种数据分布和复制策略,如副本数、故障域、权重等。
  • MGR:MGR(Manager)是Ceph集群中负责提供管理和监控功能的服务,它可以收集集群的性能和状态数据,并且提供给用户一些可视化的界面和插件,如Dashboard、Prometheus、Grafana等。
  • MDS:MDS(Metadata Server)是Ceph集群中负责提供文件系统服务的组件,它可以存储和管理文件的元数据,如路径、属性、目录结构等。MDS可以有多个实例,以提高性能和可用性。

存储层

存储层是Ceph集群中负责实际存储数据的物理层,它由以下几个组件构成:

  • OSD:OSD(Object Storage Daemon)是Ceph集群中负责存储对象的进程,它可以运行在任何一台存储节点上,管理一块或多块磁盘上的对象。OSD可以执行读写、复制、恢复、平衡等操作,以保证数据的可靠性和一致性。OSD也可以与MON和MGR进行通信,以汇报自己的状态和接收指令。
  • PG:PG(Placement Group)是Ceph集群中负责划分数据的逻辑单元,它是一个对象的集合,可以看作是一个虚拟的磁盘分区。PG的数量由用户指定,通常为每个OSD100个左右。PG可以映射到一个或多个OSD上,以实现数据的分布和复制。PG也有自己的状态,如active、clean、degraded等,以反映数据的健康状况。
  • Bluestore:Bluestore是Ceph集群中负责存储对象的后端格式,它可以直接把对象写入磁盘,而不需要经过文件系统层。Bluestore可以提高I/O效率和空间利用率,支持压缩、校验和、加密等功能。

举例说明

为了更好地理解Ceph的工作流程与原理,我们可以通过一个简单的例子来进行演示。

假设我们有一个Ceph集群,它由三台存储节点组成,每台节点有两块磁盘。我们在这个集群上创建了一个名为rbd的存储池,它有64个PG,并且每个对象有两个副本。我们在这个存储池中创建了一个名为myblock的块设备,并且把它映射到本地系统上。

Ceph Example

我们可以用以下步骤来描述这个例子中Ceph的工作流程与原理:

  • 当我们创建块设备时,Ceph会把块设备切分成多个固定大小的对象,并且给每个对象分配一个唯一的标识符。
  • 当我们写入数据到块设备时,Ceph会把数据写入到对应的对象中,并且给每个对象添加一些元数据,如版本号、时间戳等。
  • 当我们读取数据从块设备时,Ceph会从对应的对象中读取数据,并且根据元数据来判断数据是否有效和一致。
  • 当Ceph存储或读取对象时,它会通过CRUSH算法来计算对象应该放在哪个PG上,并且PG应该放在哪个OSD上。CRUSH算法会根据对象的标识符和集群地图来进行计算,并且考虑到副本数、故障域、权重等因素。
  • 当Ceph需要复制或恢复对象时,它会通过RADOS协议来进行通信和协调,并且保证数据在不同OSD上的一致性。RADOS协议会根据PG的状态和版本号来选择主副本和从副本,并且通过心跳、日志、校验和等机制来检测和修复故障。
  • 当Ceph需要平衡或迁移对象时,它会通过MON和MGR来进行监控和管理,并且根据集群的负载和容量来调整数据的分布。MON和MGR会定期收集OSD的状态和性能数据,并且更新集群地图和配置参数。当集群发生变化时,MON和MGR会通知客户端和OSD,让它们重新计算数据的位置。

例子一:在单机上部署一个简单的Ceph集群

有时候我们需要测试一些基本的命令或功能,或者学习一下Ceph的基本概念和操作,但是没有多余的硬件资源。这时候,我们可以在一台机器上部署一个简单的Ceph集群,只需要做一些调整。

我们需要一台机器,虚拟或物理,有两个CPU核心,4GB内存,至少两个或三个磁盘(另外一个磁盘用于操作系统)。我们可以使用libvirt来管理这台虚拟机,并且创建其他磁盘:

$ cd /var/lib/libvirt/images/
$ qemu-img create -f qcow2 osd1.qcow2 100G
$ qemu-img create -f qcow2 osd2.qcow2 100G
$ qemu-img create -f qcow2 osd3.qcow2 100G

这些磁盘是薄配置的,它们只占用实际使用的空间。然后,我们把这些磁盘附加到虚拟机上。我们有两种方法:第一种是使用virsh attach-disk命令:

$ sudo virsh attach-disk ceph /var/lib/libvirt/images/osd1.qcow2 vdb --persistent --subdriver qcow2
$ sudo virsh attach-disk ceph /var/lib/libvirt/images/osd1.qcow2 vdc --persistent --subdriver qcow2
$ sudo virsh attach-disk ceph /var/lib/libvirt/images/osd3.qcow2 vdd --persistent --subdriver qcow2

第二种是使用virt-manager界面

有了Linux系统和三个磁盘之后,我们就可以开始安装Ceph了。我们可以使用cephadm这个新工具来部署基于容器的Ceph集群。除了这个包之外,我们还需要Podman来管理容器,ceph-common来使用常用的Ceph命令,以及ceph-base来使用一些更高级的工具。

$ sudo dnf install cephadm podman ceph-common ceph-base -y

然后,我们可以使用cephadm来初始化一个新的集群,并且指定一个监视器节点:

$ sudo cephadm bootstrap --mon-ip 192.168.122.10

这里的IP地址是虚拟机的公网地址,可以通过ip a命令查看。这个命令会在虚拟机上启动一个监视器容器和一个管理器容器,并且生成一些配置文件和密钥。我们可以把这些文件复制到本地目录,方便后续操作:

$ sudo mkdir -p /etc/ceph
$ sudo cp /etc/ceph/ceph.conf /etc/ceph/ceph.client.admin.keyring /etc/ceph/ceph.mon.keyring /etc/ceph/

然后,我们可以使用cephadm来添加其他两个磁盘作为OSD节点:

$ sudo cephadm shell -- ceph orch daemon add osd ceph:vdb
$ sudo cephadm shell -- ceph orch daemon add osd ceph:vdc

这个命令会在虚拟机上启动两个OSD容器,并且把磁盘格式化为bluestore格式。我们可以使用ceph status命令来查看集群的状态:

$ sudo cephadm shell -- ceph status
  cluster:
    id:     2a3c6f7b-0a9f-11ec-8c5a-525400e1c9f4
    health: HEALTH_OK
 
  services:
    mon: 1 daemons, quorum ceph (age 6m)
    mgr: ceph.owxqzv(active, since 6m)
    osd: 2 osds: 2 up (since 5m), 2 in (since 5m)
 
  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   2.0 GiB used, 198 GiB / 200 GiB avail
    pgs:     1 active+clean
 
  io:
    client:   0 B/s rd, 0 B/s wr, 0 op/s rd, 0 op/s wr

我们可以看到,我们已经成功部署了一个简单的Ceph集群,有一个监视器节点和两个OSD节点。我们也可以使用ceph osd tree命令来查看数据的分布情况:

$ sudo cephadm shell -- ceph osd tree
ID CLASS WEIGHT   TYPE NAME       STATUS REWEIGHT PRI-AFF 
-1       0.19529 root default                             
-3       0.09765     host ceph                           
 0   hdd 0.09765         osd.0       up  1.00000 1.00000 
-5       0.09765     host localhost                       
 1   hdd 0.09765         osd.1       up  1.00000 1.00000 

我们可以看到,每个OSD节点有一个权重,表示它们存储数据的比例。默认情况下,权重和磁盘容量成正比。我们也可以看到,每个OSD节点属于一个主机和一个根节点,这些都是CRUSH算法的概念,用于控制数据的分布和复制策略。

到此为止,我们已经完成了在单机上部署一个简单的Ceph集群的例子。我们可以使用这个集群来测试一些基本的命令或功能,或者学习一下Ceph的基本概念和操作。

例子二:在Ceph集群上创建一个块设备

Ceph提供了RBD服务来支持虚拟化环境下的块设备服务,支持精简配置、快照和克隆等功能。我们可以在Ceph集群上创建一个块设备,并且把它映射到本地系统上,就像一个普通的磁盘一样。

首先,我们需要安装rbd-nbd工具,它可以把Ceph的块设备映射为一个网络块设备:

$ sudo dnf install rbd-nbd -y

然后,我们需要创建一个存储池,它是Ceph中存储数据的逻辑单元。我们可以指定存储池的名称、类型、副本数等参数:

$ sudo cephadm shell -- ceph osd pool create rbd 64 64 replicated
pool 'rbd' created

这里,我们创建了一个名为rbd的存储池,它有64个PG(Placement Group),是数据分布的基本单元。它也是一个复制类型的存储池,每个对象有两个副本。

接下来,我们需要在存储池中创建一个块设备,我们可以指定块设备的名称、大小等参数:

$ sudo cephadm shell -- rbd create rbd/myblock --size 10G

这里,我们创建了一个名为myblock的块设备,它有10GB的大小。我们可以使用rbd ls命令来查看存储池中的块设备:

$ sudo cephadm shell -- rbd ls rbd
myblock

接下来,我们需要把块设备映射到本地系统上,我们可以使用rbd map命令来实现:

$ sudo cephadm shell -- rbd map rbd/myblock
/dev/nbd0

这里,我们把块设备映射为一个网络块设备/dev/nbd0。我们可以使用lsblk命令来查看本地系统上的磁盘:

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    252:0    0   20G  0 disk 
├─vda1 252:1    0    1G  0 part /boot
└─vda2 252:2    0   19G  0 part /
nbd0   43:0     0   10G  0 disk 

我们可以看到,我们已经成功地把Ceph的块设备映射到本地系统上。我们可以对它进行格式化、挂载、读写等操作,就像一个普通的磁盘一样。

到此为止,我们已经完成了在Ceph集群上创建一个块设备的例子。我们可以使用这个块设备来存储虚拟机镜像或其他数据。

总结

Ceph是一个统一的分布式存储系统,它可以提供对象存储、块存储和文件存储三种接口,满足不同场景的数据存储需求。Ceph的设计目标是提供高性能、高可用性和高可扩展性,以及简化的管理和维护。Ceph适合云计算平台、大数据分析和多媒体内容等场景,是一个值得关注和学习的开源项目。

参考资料

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值