6.Storage Provisioning with Ceph
在本章中,我们将涵盖以下主题:
- 创建一个ceph块设备:
- 创建一个Ceph文件系统:
- 使用RADOS gateway创建一个Ceph对象存储:
- 使用RADOS gateway配置S3和Swift:
存储配置是存储系统管理员的首要任务和最重要的任务,它是将存储分空间以块、文件或对象的形式分配给物理或者虚拟服务器的过程,一个典型的计算机服务器具有有限的本地存储容量,但是根据您的数据存储需求显然是不够的,完美的解决方案,如Ceph对这些服务器提供几乎无限的存储能力,使他们能够存储所有的数据,确保你不耗尽空间。
Ceph除了能提供存储外,还有一个集中存储系统的好处。
Ceph可以提供一个统一的方式存储容量,包括块存储,文件系统,和对象存储。根据您的使用情况,您可以选择一个或多个存储解决方案,如下图所示。现在,让我们详细讨论这些存储类型,并在我们的测试集群中实现它们

RBD:
RBD-原名叫Ceph块设备-为Ceph客户端提供了基于持久性存储,作为一个额外的磁盘使用。
客户可以灵活的使用它们所需要的磁盘,或者是作为裸设备,或者通过格式化它,然后挂载它,RBD使用librbd库连续的在多个OSD存储数据块在Ceph集群中,RRBD是由Ceph的Rados层提供支持,因此,每一个Ceph块设备是分布在多个分布式节点,提供高性能和高可靠性。RBD具有丰富的企业功能如自动精简配置,动态调整大小,快照,写时复制,缓存,其中。RBD协议是完全支持Linux作为主线内核驱动程序;它还支持多种虚拟化平台,如KVM,QEMU,和libvirt,使虚拟机利用Ceph块设备。所有这些特点使RBD成为云平台OpenStack和CloudStack等项目的一个理想的候选。现在我们将学习如何创建一个Ceph块设备和使用它。
- 创建Ceph的块设备,登录到任何的Ceph的监控节点,或者具有Ceph集群管理员权限的一台管理主机,你也可以从配置为任何Ceph客户端的节点创建Ceph RBD,基于安全考虑,你不应该点把管理员秘钥存储到Ceph节点和管理主机之外的主机。
下面的命令将创建一个名称为 ceph-client1-rbd1,大小为10240 MB的RBD设备:
# rbd create ceph-client1-rbd1 --size 10240列出RBD镜像,发出下面的命令:
# rbd ls检查一个RBD镜像的细节,发出如下的命令:
# rbd --image ceph-client1-rbd1 info看看下面的截图,显示了上面命令的执行效果:

默认情况下,RBD镜像是Ceph集群rbd存储池下创建。你可以使用RBD命令-p参数指定其它存储池。下面的命令将给你一个与上一个命令相同的输出,但我们手动指定使用该参数的存储池名。同样,您可以在创建RBD镜像时使用-p参数指定其它存储池
# rbd --image ceph-client1-rbd1 info -p rbd
创建你的第一个Ceph客户端
Ceph是一个存储系统;如果在Ceph集群存储你的数据,将需要一个Ceph客户端,一旦存储空间从Ceph集群分配出来,Ceph客户端就可以通过maps,mount或者ceph 文件系统的方式存储数据。对于对象存储,客户端通过HTTP协议访问Ceph集群实现数据存取。一个典型的生产Ceph集群由两个不同的网络,前端网络与后端网络,也被称为公共网络和集群网络组成。前端网络是Ceph客户端网络提供Ceph客户端的数据存取。所有的Ceph客户端通过前端网络的Ceph集群交互。Ceph客户端不能访问后端网络,而在后端网络Ceph集群主要进行数据的复制和恢复,现在我们将建立第一个Ceph客户端虚拟机,在本书将一直被使用。在安装过程中,我们将创建一个新的客户端虚拟机,就像我们在2章中,Ceph的快速部署。
创建一个包含Ceph客户端的VirtualBox虚拟机:
# VboxManage createvm --name ceph-client1 --ostype RedHat_64 - -register# VBoxManage modifyvm ceph-client1 --memory 1024 --nic1 nat - -nic2 hostonly --hostonlyadapter2 vboxnet1# VBoxManage storagectl ceph-client1 --name "IDE Controller" - -add ide --controller PIIX4 --hostiocache on --bootable on# VBoxManage storageattach ceph-client1 --storagectl "IDE Controller" --type dvddrive --port 0 --device 0 --medium /downloads/CentOS-6.4-x86_64-bin-DVD1.iso# VBoxManage storagectl ceph-client1 --name "SATA Controller" --add sata --controller IntelAHCI --hostiocache on --bootable on# VBoxManage createhd --filename OS-ceph-client1.vdi --size 10240# VBoxManage storageattach ceph-client1 --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium OS-cephclient1. vdi# VBoxManage startvm ceph-client1 --type gui一旦虚拟机完成创建和启动,可以通过如下操作系统安装文档安装CentOS https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterp rise_Linux/6/html/Installation_Guide/index.html.在安装过程中,配 置主机名为ceph-client1。
一旦成功地安装了操作系统,按照如下所述的步骤修改你的网络配置并且重新启动网络服务
编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件,添加如下内容:
ONBOOT=yes BOOTPROTO=dhcp编辑/etc/sysconfig/network-scripts/ifcfg-eth1文件,添加如下内容:
ONBOOT=yes BOOTPROTO=static IPADDR=192.168.57.200 NETMASK=255.255.255.0编辑/etc/hosts文件,添加如下内容:
192.168.57.101 ceph-node1 192.168.57.102 ceph-node2 192.168.57.103 ceph-node3 192.168.57.200 ceph-client1
Mapping RBD设备
在本章的前面,我们创建了一个RBD镜像在Ceph集群,为了使用这个块设备的镜像,我们需要将它映射到客户机。让我们看看如何执行映射操作。 Linux 2.6.32内核版本支持ceph,客户机需要本地可以访问Ceph块设备和文件系统,建议使用Linux内核版本2.6.34或者更新的版本。 检查Linux内核版本以及使用modprobe命令支持RBD的使用,由于这个客户端运行在Linux内核中的旧版本,它不支持Ceph的原生。
# uname –r
# modprobe rbd
看看下面的截图:

为了支持Ceph,我们需要升级Linux内核版本
注意:这个内核的升级只是针对本章做演示的目的。在你的生产环境中,你应该在内核升级前计划。在执行这些步骤到您的生产环境之前,请谨慎做出决定。
安装ELRepo rpm:
# rpm -Uvh http://www.elrepo.org/elrepo-release-6- 6.el6.elrepo.noarch.rpm使用下面的命令安装新内核:
# yum --enablerepo=elrepo-kernel install kernel-ml编辑 /etc/grub.conf, 更新 default = 0, 然后重启机器
一旦重新完机器,需要再检查确认Linux内核版本以及是否支持RBD,就像之前做的那样

授予用户权限访问Ceph集群,我们需要分发秘钥和Ceph配置文件给客户端服务器,Ceph客户端和Ceph集群认证将基于密匙,Ceph的管理员对Ceph集群有完全访问权限,所以为了安全起见,你没必要分发秘钥给其他主机如果它们不需要。按照最佳实践,您应该创建单独的用户并且分配有限制的权限来访问Ceph集群,在接下来的章节,我们将讨论更多关于Ceph用户和秘钥,但是目前,我们将使用管理员用户的秘钥。安装ceph在ceph-node1,推送ceph.conf和ceph.admin.keyring给它。
# ceph-deploy install ceph-client1
# ceph-deploy admin ceph-client1
一旦Ceph集群的配置文件和管理秘钥放在ceph-client1节点,你可以在Ceph集群查询RBD镜像:

Map RBD镜像ceph-client1-rbd1到ceph-client1主机,由于现在的Linux内核的RBD的原生支持,你可以在ceph-client1上执行下面的RBD map命令:
# rbd map --image ceph-client1-rbd1
或者,你可以使用下面的命令来指定RBD镜像的存储池名称也可以达到同样的结果,在我们的例子中,存储池的名字是rbd,正如本章前面所解释的
# rbd map rbd/ceph-client1-rbd1
你可以找到用于此map的操作系统设备名,如下:
# rbd showmapped
下面的截图显示命令执行的的效果

一旦RBD Map到操作系统,我们应该建立一个文件系统上使它可用。它现在将被用作一个额外的磁盘或者作为一个块设备使用:
# fdisk -l /dev/rbd0
# mkfs.xfs /dev/rbd0
# mkdir /mnt/ceph-vol1
# mount /dev/rbd0 /mnt/ceph-vol1
看看下面的截图:

放一些数据在Ceph RBD上
# dd if=/dev/zero of=/mnt/ceph-vol1/file1 count=100 bs=1M
看看下面的截图:

调整Ceph RBD大小:
Ceph支持精简配置,物理存储空间不会被真正占用在你开始往块设备里边写数据的之前,你可以增加或减少Ceph RBD的大小在Ceph集群这一端,但是需要底层文件系统支持,先进的文件系统如XFS,BTRFS,ZFS支持一定程度上的更改大小,你需查阅这些文件系统的文档了解更改大小的更多细节。
增加或减少Ceph RBD 镜像大小,使用--size
# rbd resize rbd/ceph-client1-rbd1 --size 20480

现在,Ceph的RBD镜像的大小被改变了,通过执行下面的命令检查新的大小是否已被内核识别
# xfs_growfs -d /mnt/ceph-vol1

从客户机上,使用文件系统增加存储空间,从客户端的角度来看,容量调整大小是一个操作系统文件系统的特性,你应该阅读对应的文件系统文档来调整分区,同时XFS文件系统也支持在线调整大小。
Ceph RBD 快照
Ceph对快照功能完全支持,快照是一个RBD镜像在某一个时间点的只读副本,你可以通过创建快照保护备份当前数据也可以通过恢复快照找到之前的原始数据。
为了测试CEPH RBD的快照功能,让我们在格式化并且挂载RBD镜像上创建一个文件
# echo "Hello Ceph This is snapshot test" > /mnt/cephvol1/
snaptest_file

现在我们的文件系统有2个文件。让我们基于之前创建的RBD镜像创建一个快照,使用rbd snap create <pool-name>/<image-name>@<snap-name>的语法格式执行如下命令:
# rbd snap create rbd/ceph-client1-rbd1@snap1
列出一个RBD镜像的快照,使用rbd snap ls <pool-name>/<image-name>语法格式执行如下命令:
# rbd snap ls rbd/ceph-client1-rbd1

为了测试快照恢复功能,让我们从文件系统中删除文件:
# cd /mnt/ceph-vol1
# rm -f file1 snaptest_file

接着,我们将通过恢复快照获取在上边最后一步被删除了的文件
回滚操作将覆盖当前版本的RBD镜像与快照数据,请小心执行该操作
语法格式rbd snap rollback
# rbd snap rollback rbd/ceph-client1-rbd1@snap1
一旦快照回滚操作完成后,需要重新挂载Ceph RBD文件系统以刷新文件系统的状态,就应该可以得到你之前删除了的文件。
# umount /mnt/ceph-vol1
# mount /dev/rbd0 /mnt/ceph-vol1

当你不再需要快照,你可以使用使用rbd snap rm <pool-name>/<image-name>@<snap-name>语法格式,删除快照不会删除Ceph RBD 镜像当前的数据
# rbd snap rm rbd/ceph-client1-rbd1@snap1
如果你的RBD镜像包含多个快照,你想一个命令删除所有的快照,你可以利用purge子命令。它的语法格式rbd snap purge <pool-name>/<image-name>,以下是删除所有快照的命令:
# rbd snap purge rbd/ceph-client1-rbd1
rbd rm <RBD_image_name> -p <Image_pool_name>语法格式是用来删除一个RBD镜像,如下:
# rbd rm ceph-client1-rbd1 -p rbd
Ceph RBD 克隆
Ceph存储集群可以基于RBD快照创建支持Copy-on-write(COW)的克隆。在Ceph中也被称为分布式分层快照。Ceph的这种分层特征允许客户端创建Ceph RBD的多个即时克隆。这个功能在云计算和虚拟化平台,如OpenStack,CloudStack,QEMU/KVM是非常有用的,在这些平台中CephRBD镜像以快照形式包含操作系统/虚拟机映像,这个快照被克隆多次为了形成新的虚拟机/实例,快照是只读的,但COW克隆是完全可写的;此功能提供了更大的灵活性对于使用Ceph云平台是非常有用的。下图显示了RBD,RBD快照,COW 快照克隆的关系,在 这本书接下来的章节,我们会发现大量基于COW快照克隆的OpenStack实例
每一个克隆的镜像(子镜像)存储其父快照的引用来读取镜像数据,因此,父快照应该在它被用于克隆之前被保护。At the time of data writing on COW-cloned,在COW-cloned镜像写入的时候,它存储新的数据引用本身,COW-cloned 镜像和RBD几乎一样
他们是相当灵活的,类似于RBD,即,它们都是可写的,可调整大小,可以创建新的快照,并且可以进一步克隆。
RBD镜像的类型定义了它支持的特征。在Ceph, 一个 RBD 镜像包括两种类型: format-1 and format-2,RBD 镜像的两种类型(format-1 and format-2)支持RBD的快照功能特性,尽管如此,COW 克隆特性仅仅在format-2被支持,format-1是RBD 镜像默认使用格式。 出于演示的目的,我们将首先创建一个包含format-2的RBD镜像,然后创建快照,保护它的快照,最后,从中创建COW的克隆:
创建一个 format-2 格式的RBD 镜像:
# rbd create ceph-client1-rbd2 --size 10240 --image-format 2
创建这个镜像的克隆:
# rbd snap create rbd/ceph-client1-rbd2@snapshot_for_clone要创建一个COW克隆,需要先保护这个快照,这是一个重要的步骤,我们应该保护快照,因为快照如果被删除,所有连接的COW克隆将被破坏。
# rbd snap protect rbd/ceph-client1-rbd2@snapshot_for_clone克隆快照需要父存储池,RBD镜像,和快照的名称。对于一个孩子来说,它需要存储池和RBD镜像的名字:
按照如下的语法格式
rbd clone <pool-name>/<parent-image>@<snapname> <pool-name>/<child-image-name>,执行如下的命令:# rbd clone rbd/ceph-client1-rbd2@snapshot_for_clone rbd/cephclient1- rbd3创建克隆是一个快速的过程。一旦完成,可以查看新的镜像信息。可以发现它的父存储池、镜像和快照的信息显示。
# rbd --pool rbd --image ceph-client1-rbd3 info

此时,你要一个克隆的RBD镜像,取决于其父镜像快照。如果使克隆的RBD镜像独立于其父镜像,你需要flatten这个镜像,这其中包括将数据从父快照复制到子镜像,完成flatten过程所需的时间取决于父快照中的数据的大小。一旦flatten过程完成后,我们克隆的RBD镜像及父快照之间就没有关系了。让我们真正来执行下flatten:
1.要启动flatten进程,使用以下命令:
# rbd flatten rbd/ceph-client1-rbd3
在完成flatten过程后,如果你检查镜像信息,会注意到父映像/快照名称被释放了,这使得我们克隆的镜像成为一个独立的镜像。

2.如果你不再需要父镜像快照,你也可以删除它。删除快照之前,你首先要取消其保护,我们使用以下命令:
# rbd snap unprotect rbd/ceph-client1-rbd2@snapshot_for_clone
3.一旦快照是未受保护状态,就可以使用如下命令删除它
# rbd snap rm rbd/ceph-client1-rbd2@snapshot_for_clone
Ceph文件系统
Ceph文件系统也被称为cephfs,它是POSIX兼容的分布式文件系统,使用Ceph RADOS储存数据。部署实施一个Ceph分布式文件系统,你需要一个运行Ceph存储集群以及至少一个分布式元数据服务器(MDS),为了演示的目的,我们将使用我们部署在3章的元数据服务器,我们能以两种方式使用Ceph文件系统,通过安装cephfs使用本地内核驱动程序和利用Ceph FUSE,我们将逐一看到这两种方式