5.3 Ceph存储使用#

在ceph-deploy节点上操作

1 RBD 块存储#

(1) RBD介绍
RBD即RADOS Block Device的简称,RBD块存储是最稳定且最常用的存储类型。RBD块设备类似磁盘可以被挂载。RBD块设备具有快照、多副本、克隆和
一致性等特性,数据以条带化的方式存储在Ceph集群的多个OSD中。如下是对Ceph RBD的理解。
1) RBD就是Ceph里的块设备,一个4T的块设备的功能和一个4T的SATA类似,挂载的RBD就可以当磁盘用;
2) resizable
这个块可大可小
3) data striped
这个块在Ceph里面是被切割成若干小块来保存,不然 1PB 的块怎么存的下
4) thin-provisioned
精简置备,1TB的集群是能创建无数1PB的块的。其实就是块的大小和在Ceph中实际占用大小是没有关系的,刚创建出来的块是不占空间,今后用多大空间
才会在Ceph中占用多大空间。举例:你有一个32G的U盘,存了一个2G的电影,那么RBD大小就类似于32G,而2G就相当于在Ceph中占用的空间。

块存储本质:
1) 将裸磁盘或类似裸磁盘(lvm)设备映射给主机使用,主机可以对其进行格式化并存储和读取数据,块设备读取速度快但是不支持共享。
2) ceph可以通过内核模块和librbd库提供块设备支持。客户端可以通过内核模块挂载rbd使用,客户端使用rbd块设备就像使用普通硬盘一样,可以对
其进行格式化然后使用,客户应用也可以通过librbd使用ceph块,典型的是云平台的块存储服务,云平台可以使用rbd作为云的存储后端提供镜像存储、volume块或者客户的系统引导盘等。

使用场景:
1) 云平台 (OpenStack做为云的存储后端提供镜像存储)
2) K8s容器(自动pv供给)
3) map成块设备直接使用,在存储里去申请块,块映射到系统可以识别的盘,比如ls /dev/可以看到这块RBD,可以把它挂载到本机。

(2) RBD常用管理命令

命令

功能

rbd create

创建块设备映像

rbd ls <pool_name>

列出 rbd 存储池中的块设备

rbd info

查看块设备信息

rbd diff

可以统计 rbd 使用量

rbd map

映射块设备

rbd showmapped

查看已映射块设备

rbd remove

删除块设备

rbd resize

更改块设备的大小

(3) RBD工作流程
1) 客户端创建一个pool,并指定pg数量,创建rbd设备并挂载到文件系统;
2) 用户写入数据,ceph进行对数据切块,每个块的大小默认为4M,每个块名字是object+序号;
3) 将每个object通过pg进行副本位置的分配;
4) pg根据crush算法会寻找3个osd,把这object分别保存在这3个osd上存储;
5) osd实际把硬盘格式化为xfs文件系统,object存储在这个文件系统就相当于存储了一个文件rbd0.object1.file。

补充:
rbd块设备在挂载的情况下可以进行快照、基于保护快照的克隆、在线扩容操作。
rbd块设备在非挂载的情况下可以进行快照的回滚操作。

RBD IO工作流程:

ceph对象存储对接hdfs cephrbd存储_d3

(4) 创建RBD设备
1) 创建存储池
格式: ceph osd pool create <pool-name> pg_num [pgp_num]
# ceph osd pool create rbd-pool 256 256
# ceph osd pool ls detail

注:
256 256: 是它的pg number与pgp number的pg数,就是创建一个pool,256个pg,256个pgp,这个会随着容量的增加,pg也会动态的去扩容,生
产上规定pg会用多少,根据osd的数量,文件数量,做一个前期的规划。
# ceph -s
......(省略内容)
progress:
   PG autoscaler decreasing pool 2 PGs from 256 to 32 (17m)
     [=========================...] (remaining: 2m)

PG数量设置计算公式: PG数量 = (OSD数量 * 100)/副本数(默认3)
例如我们的环境: (6 * 100)/3=200,一般设置是结果向上取2的N次方,所以pool指定的pg数量就是256。
需要注意的是,在后续增加PG数量时,还必须增加用于归置PG的PGP数量(pgp_num),PGP的数量应该与PG的数量相等,但在新增POOL时可以不指定
pgp_num,默认会与pg_num保持一致。

PG (Placement Group),pg是一个虚拟的概念,用于存放object,PGP(Placement Group for Placement purpose),相当于是pg存放的
一种osd排列组合。举个例子:假设集群有3个osd,即osd1,osd2,osd3,副本数为2,如果pgp=1,那么pg存放的osd的组合就有一种,可能是[osd1,osd2],那么所有的pg主从副本都会存放到osd1和osd2上;如果pgp=2,那么其osd组合可能就两种,可能是[osd1,osd2]和[osd1,osd3],pg的主从
副本会落在[osd1,osd2]或者[osd1,osd3]中,和我们数学中的排列组合很像,所以pg是存放对象的归属组是一种虚拟概念,pgp就是pg对应的osd排列
组合。一般情况下,存储池的pg和pgp的数量设置相等。

pg_num是pg里面包含的object,pgp_num是描述pg的位置,这两个数是一 一对应的。
PG是指定存储池存储对象的归属组有多少个,PGP是存储池PG的OSD分布组合个数;PG的增加会引起PG内的数据进行迁移,迁移到不同的OSD上新生成
的PG中;PGP的增加会引起部分PG的分布变化,但是不会引起PG内对象的变动。

查看pg的分布: ceph pg dump pgs |grep active |awk '{print $1,$19}'

2) 指定存储池使用的存储类型
# ceph osd pool application enable rbd-pool rbd

3) 创建一个10G的块设备
格式: rbd create --size {megabytes} {pool-name}/{image-name}
# rbd create --size 10240 rbd-pool/image01

4) 查看块设备
# rbd ls rbd-pool
# rbd info rbd-pool/image01
rbd image 'image01':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 5e857b2a6d34
block_name_prefix: rbd_data.5e857b2a6d34
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed Nov 17 10:13:20 2021
access_timestamp: Wed Nov 17 10:13:20 2021
modify_timestamp: Wed Nov 17 10:13:20 2021

(5) 节点本地挂载使用块设备
1) 将块设备映射到系统内核
# rbd map rbd-pool/image01
# rbd showmapped   # 只有挂载的节点可以看到
id pool     namespace image   snap device  
0   rbd-pool             image01 -     /dev/rbd0

注:
如果这里报错,根据错误提示执行禁用当前系统内核不支持的feature即可,出现这种错误的原因是OS kernel不支持块设备镜像的一些特性,所以映
射失败。
# rbd feature disable rbd-pool/image01 object-map fast-diff deep-flatten

2) 格式化块设备
# mkfs.xfs /dev/rbd0

3) 挂载
# mount /dev/rbd0 /mnt
# cd /mnt/
# for((i=1;i<=20;i++));do echo $i > $i.txt;done

4) 取消块设备和内核映射
# umount /mnt
# rbd unmap rbd-pool/image01

注: 如果取消块设备报如下错误,可以强制取消块设备的映射
rbd: rbd-pool/image01: mapped more than once, unmapping /dev/rbd0 only
rbd: sysfs write failed
rbd: unmap failed: (16) Device or resource busy

# rbd unmap -o force rbd-pool/image01

(6) 远程挂载使用块设备
1) 在管理节点拷贝配置文件和秘钥到远程节点上
# cd /root/my-cluster/
# ssh root@172.16.1.34 "mkdir -p /etc/ceph/"
# scp ceph.conf ceph.client.admin.keyring root@172.16.1.34:/etc/ceph/

2) 在远程节点上配置ceph源
# cat > /etc/yum.repos.d/ceph.repo << EOF
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/\$basearch
gpgcheck=0
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch
gpgcheck=0
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/SRPMS
gpgcheck=0
EOF

3) 安装Ceph客户端
# yum -y install ceph-common

4) 剩余操作就与节点本地挂载使用块设备一样了

5) 客户端执行相关ceph命令
如果想在客户端去执行相关的ceph命令,需要配置ceph源(和ceph集群版本保持一致),安装ceph-common,将ceph monitor节点上"/etc/ceph/"
目录下的"ceph.client.admin.keyring"秘钥文件和"ceph.conf"配置文件拷到客户端的"/etc/ceph"目录下就可以执行ceph相关命令了。

(7) 快照
快照: 在某个时间点的副本,当系统出现问题,可以通过恢复快照恢复之前副本状态。
1) 创建快照
# rbd snap create rbd-pool/image01@snap01

2) 列出创建的快照
# rbd snap list rbd-pool/image01
SNAPID NAME   SIZE   PROTECTED TIMESTAMP              
     4 snap01 10 GiB             Sun Nov 21 21:38:34 2021

3) 查看快照详细信息
# rbd info rbd-pool/image01@snap01
rbd image 'image01':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 1
id: 5f6066b25e5f
block_name_prefix: rbd_data.5f6066b25e5f
format: 2
features: layering, exclusive-lock
op_features:
flags:
create_timestamp: Sun Nov 21 20:33:30 2021
access_timestamp: Sun Nov 21 20:33:30 2021
modify_timestamp: Sun Nov 21 20:33:30 2021
protected: False

注:
比使用"rbd info rbd-pool/image01"命令多了一个"protected:"。

4) 还原快照
# rm -f /mnt/*   # 删除挂载目录中的数据,方便测试
# umount /mnt
# rbd unmap rbd-pool/image01
# rbd snap rollback rbd-pool/image01@snap01
Rolling back to snapshot: 100% complete...done.

注:
还原快照前需先取消挂载和内核映射,否则会出错。
Rolling back to snapshot: 0% complete...failed.
rbd: rollback failed: (30) Read-only file system

5) 重新映射并挂载验证
# rbd map rbd-pool/image01
# mount /dev/rbd0 /mnt/
# ls -l /mnt/   # 发现删除的数据都被还原了

6) 删除指定快照
# rbd snap remove rbd-pool/image01@snap01

(8) 克隆
克隆: 基于指定的块设备克隆出相同的一份出来
1) 创建一个块设备并挂载(写入数据,方便测试)
# rbd create --size 10240 rbd-pool/image02
# rbd feature disable rbd-pool/image02 object-map fast-diff deep-flatten
# rbd map rbd-pool/image02
# mkfs.xfs /dev/rbd1
# mkdir -p /data/
# mount /dev/rbd1 /data/
# for((i=60;i<=70;i++));do echo $i > /data/$i.txt;done

2) 创建快照
# rbd snap create rbd-pool/image02@snap01

5.3 Ceph存储使用#

在ceph-deploy节点上操作

1 RBD 块存储#

(1) RBD介绍
RBD即RADOS Block Device的简称,RBD块存储是最稳定且最常用的存储类型。RBD块设备类似磁盘可以被挂载。RBD块设备具有快照、多副本、克隆和
一致性等特性,数据以条带化的方式存储在Ceph集群的多个OSD中。如下是对Ceph RBD的理解。
1) RBD就是Ceph里的块设备,一个4T的块设备的功能和一个4T的SATA类似,挂载的RBD就可以当磁盘用;
2) resizable
这个块可大可小
3) data striped
这个块在Ceph里面是被切割成若干小块来保存,不然 1PB 的块怎么存的下
4) thin-provisioned
精简置备,1TB的集群是能创建无数1PB的块的。其实就是块的大小和在Ceph中实际占用大小是没有关系的,刚创建出来的块是不占空间,今后用多大空间
才会在Ceph中占用多大空间。举例:你有一个32G的U盘,存了一个2G的电影,那么RBD大小就类似于32G,而2G就相当于在Ceph中占用的空间。

块存储本质:
1) 将裸磁盘或类似裸磁盘(lvm)设备映射给主机使用,主机可以对其进行格式化并存储和读取数据,块设备读取速度快但是不支持共享。
2) ceph可以通过内核模块和librbd库提供块设备支持。客户端可以通过内核模块挂载rbd使用,客户端使用rbd块设备就像使用普通硬盘一样,可以对
其进行格式化然后使用,客户应用也可以通过librbd使用ceph块,典型的是云平台的块存储服务,云平台可以使用rbd作为云的存储后端提供镜像存储、volume块或者客户的系统引导盘等。

使用场景:
1) 云平台 (OpenStack做为云的存储后端提供镜像存储)
2) K8s容器(自动pv供给)
3) map成块设备直接使用,在存储里去申请块,块映射到系统可以识别的盘,比如ls /dev/可以看到这块RBD,可以把它挂载到本机。

(2) RBD常用管理命令

命令

功能

rbd create

创建块设备映像

rbd ls <pool_name>

列出 rbd 存储池中的块设备

rbd info

查看块设备信息

rbd diff

可以统计 rbd 使用量

rbd map

映射块设备

rbd showmapped

查看已映射块设备

rbd remove

删除块设备

rbd resize

更改块设备的大小

(3) RBD工作流程
1) 客户端创建一个pool,并指定pg数量,创建rbd设备并挂载到文件系统;
2) 用户写入数据,ceph进行对数据切块,每个块的大小默认为4M,每个块名字是object+序号;
3) 将每个object通过pg进行副本位置的分配;
4) pg根据crush算法会寻找3个osd,把这object分别保存在这3个osd上存储;
5) osd实际把硬盘格式化为xfs文件系统,object存储在这个文件系统就相当于存储了一个文件rbd0.object1.file。

补充:
rbd块设备在挂载的情况下可以进行快照、基于保护快照的克隆、在线扩容操作。
rbd块设备在非挂载的情况下可以进行快照的回滚操作。

RBD IO工作流程:

ceph对象存储对接hdfs cephrbd存储_d3

(4) 创建RBD设备
1) 创建存储池
格式: ceph osd pool create <pool-name> pg_num [pgp_num]
# ceph osd pool create rbd-pool 256 256
# ceph osd pool ls detail

注:
256 256: 是它的pg number与pgp number的pg数,就是创建一个pool,256个pg,256个pgp,这个会随着容量的增加,pg也会动态的去扩容,生
产上规定pg会用多少,根据osd的数量,文件数量,做一个前期的规划。
# ceph -s
......(省略内容)
progress:
   PG autoscaler decreasing pool 2 PGs from 256 to 32 (17m)
     [=========================...] (remaining: 2m)

PG数量设置计算公式: PG数量 = (OSD数量 * 100)/副本数(默认3)
例如我们的环境: (6 * 100)/3=200,一般设置是结果向上取2的N次方,所以pool指定的pg数量就是256。
需要注意的是,在后续增加PG数量时,还必须增加用于归置PG的PGP数量(pgp_num),PGP的数量应该与PG的数量相等,但在新增POOL时可以不指定
pgp_num,默认会与pg_num保持一致。

PG (Placement Group),pg是一个虚拟的概念,用于存放object,PGP(Placement Group for Placement purpose),相当于是pg存放的
一种osd排列组合。举个例子:假设集群有3个osd,即osd1,osd2,osd3,副本数为2,如果pgp=1,那么pg存放的osd的组合就有一种,可能是[osd1,osd2],那么所有的pg主从副本都会存放到osd1和osd2上;如果pgp=2,那么其osd组合可能就两种,可能是[osd1,osd2]和[osd1,osd3],pg的主从
副本会落在[osd1,osd2]或者[osd1,osd3]中,和我们数学中的排列组合很像,所以pg是存放对象的归属组是一种虚拟概念,pgp就是pg对应的osd排列
组合。一般情况下,存储池的pg和pgp的数量设置相等。

pg_num是pg里面包含的object,pgp_num是描述pg的位置,这两个数是一 一对应的。
PG是指定存储池存储对象的归属组有多少个,PGP是存储池PG的OSD分布组合个数;PG的增加会引起PG内的数据进行迁移,迁移到不同的OSD上新生成
的PG中;PGP的增加会引起部分PG的分布变化,但是不会引起PG内对象的变动。

查看pg的分布: ceph pg dump pgs |grep active |awk '{print $1,$19}'

2) 指定存储池使用的存储类型
# ceph osd pool application enable rbd-pool rbd

3) 创建一个10G的块设备
格式: rbd create --size {megabytes} {pool-name}/{image-name}
# rbd create --size 10240 rbd-pool/image01

4) 查看块设备
# rbd ls rbd-pool
# rbd info rbd-pool/image01
rbd image 'image01':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 5e857b2a6d34
block_name_prefix: rbd_data.5e857b2a6d34
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed Nov 17 10:13:20 2021
access_timestamp: Wed Nov 17 10:13:20 2021
modify_timestamp: Wed Nov 17 10:13:20 2021

(5) 节点本地挂载使用块设备
1) 将块设备映射到系统内核
# rbd map rbd-pool/image01
# rbd showmapped   # 只有挂载的节点可以看到
id pool     namespace image   snap device  
0   rbd-pool             image01 -     /dev/rbd0

注:
如果这里报错,根据错误提示执行禁用当前系统内核不支持的feature即可,出现这种错误的原因是OS kernel不支持块设备镜像的一些特性,所以映
射失败。
# rbd feature disable rbd-pool/image01 object-map fast-diff deep-flatten

2) 格式化块设备
# mkfs.xfs /dev/rbd0

3) 挂载
# mount /dev/rbd0 /mnt
# cd /mnt/
# for((i=1;i<=20;i++));do echo $i > $i.txt;done

4) 取消块设备和内核映射
# umount /mnt
# rbd unmap rbd-pool/image01

注: 如果取消块设备报如下错误,可以强制取消块设备的映射
rbd: rbd-pool/image01: mapped more than once, unmapping /dev/rbd0 only
rbd: sysfs write failed
rbd: unmap failed: (16) Device or resource busy

# rbd unmap -o force rbd-pool/image01

(6) 远程挂载使用块设备
1) 在管理节点拷贝配置文件和秘钥到远程节点上
# cd /root/my-cluster/
# ssh root@172.16.1.34 "mkdir -p /etc/ceph/"
# scp ceph.conf ceph.client.admin.keyring root@172.16.1.34:/etc/ceph/

2) 在远程节点上配置ceph源
# cat > /etc/yum.repos.d/ceph.repo << EOF
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/\$basearch
gpgcheck=0
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch
gpgcheck=0
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/SRPMS
gpgcheck=0
EOF

3) 安装Ceph客户端
# yum -y install ceph-common

4) 剩余操作就与节点本地挂载使用块设备一样了

5) 客户端执行相关ceph命令
如果想在客户端去执行相关的ceph命令,需要配置ceph源(和ceph集群版本保持一致),安装ceph-common,将ceph monitor节点上"/etc/ceph/"
目录下的"ceph.client.admin.keyring"秘钥文件和"ceph.conf"配置文件拷到客户端的"/etc/ceph"目录下就可以执行ceph相关命令了。

(7) 快照
快照: 在某个时间点的副本,当系统出现问题,可以通过恢复快照恢复之前副本状态。
1) 创建快照
# rbd snap create rbd-pool/image01@snap01

2) 列出创建的快照
# rbd snap list rbd-pool/image01
SNAPID NAME   SIZE   PROTECTED TIMESTAMP              
     4 snap01 10 GiB             Sun Nov 21 21:38:34 2021

3) 查看快照详细信息
# rbd info rbd-pool/image01@snap01
rbd image 'image01':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 1
id: 5f6066b25e5f
block_name_prefix: rbd_data.5f6066b25e5f
format: 2
features: layering, exclusive-lock
op_features:
flags:
create_timestamp: Sun Nov 21 20:33:30 2021
access_timestamp: Sun Nov 21 20:33:30 2021
modify_timestamp: Sun Nov 21 20:33:30 2021
protected: False

注:
比使用"rbd info rbd-pool/image01"命令多了一个"protected:"。

4) 还原快照
# rm -f /mnt/*   # 删除挂载目录中的数据,方便测试
# umount /mnt
# rbd unmap rbd-pool/image01
# rbd snap rollback rbd-pool/image01@snap01
Rolling back to snapshot: 100% complete...done.

注:
还原快照前需先取消挂载和内核映射,否则会出错。
Rolling back to snapshot: 0% complete...failed.
rbd: rollback failed: (30) Read-only file system

5) 重新映射并挂载验证
# rbd map rbd-pool/image01
# mount /dev/rbd0 /mnt/
# ls -l /mnt/   # 发现删除的数据都被还原了

6) 删除指定快照
# rbd snap remove rbd-pool/image01@snap01

(8) 克隆
克隆: 基于指定的块设备克隆出相同的一份出来
1) 创建一个块设备并挂载(写入数据,方便测试)
# rbd create --size 10240 rbd-pool/image02
# rbd feature disable rbd-pool/image02 object-map fast-diff deep-flatten
# rbd map rbd-pool/image02
# mkfs.xfs /dev/rbd1
# mkdir -p /data/
# mount /dev/rbd1 /data/
# for((i=60;i<=70;i++));do echo $i > /data/$i.txt;done

2) 创建快照
# rbd snap create rbd-pool/image02@snap01