这里我们还是基于之前ceph-deploy部署的环境进行测试。直接的部署参考链接:
之前机器环境参考下面的截图
1.存储池的介绍
之前在介绍ceph资源划分和存储过程描述的时候,没有介绍存储池的概念,这边我们来介绍一下:
1.关于存储池的概念
Ceph 存储系统支持“池”概念,存储池是Ceph中一些对象的逻辑分组。它不是一个连续的分区,而是一个逻辑概念,类似LVM中的卷组(Volume Group)。
Ceph 客户端从监视器获取一张集群运行图(集群内的所有监视器、 OSD 、和元数据服务器节点分布情况),并把对象写入存储池poll。存储池的 size
存储池至少可设置以下参数:
- 对象的所有权/访问权限;
- 归置组数量;以及,
- 使用的 CRUSH 规则集。
如果你开始部署集群时没有创建存储池, Ceph 会用默认存储池存数据。存储池提供的功能:
- 自恢复力: 你可以设置在不丢数据的前提下允许多少 OSD 失效,对多副本存储池来说,此值是一对象应达到的副本数。典型配置存储一个对象和它的一个副本(即 size = 2 ),但你可以更改副本数;对纠删编码的存储池来说,此值是编码块数(即纠删码配置里的 m=2
- 归置组: 你可以设置一个存储池的归置组数量。典型配置给每个 OSD 分配大约 100 个归置组,这样,不用过多计算资源就能得到较优的均衡。配置了多个存储池时,要考虑到这些存储池和整个集群的归置组数量要合理。
- CRUSH 规则: 当你在存储池里存数据的时候,与此存储池相关联的 CRUSH 规则集可控制 CRUSH 算法,并以此操纵集群内对象及其副本的复制(或纠删码编码的存储池里的数据块)。你可以自定义存储池的 CRUSH 规则。
- 快照: 用 ceph osd pool mksnap 创建快照的时候,实际上创建了某一特定存储池的快照。
- 设置所有者: 你可以设置一个用户 ID 为一个存储池的所有者。
要把数据组织到存储池里,你可以列出、创建、删除存储池,也可以查看每个存储池的利用率。
2.存储池存储数据过程和建议
PG 映射到 OSD
每个存储池都有很多归置组, CRUSH 动态的把它们映射到 OSD 。 Ceph 客户端要存对象时, CRUSH 将把各对象映射到某个归置组。
把对象映射到归置组在 OSD 和客户端间创建了一个间接层。由于 Ceph 集群必须能增大或缩小、并动态地重均衡。如果让客户端“知道”哪个 OSD 有哪个对象,就会导致客户端和 OSD 紧耦合;相反, CRUSH 算法把对象映射到归置组、然后再把各归置组映射到一或多个 OSD ,这一间接层可以让 Ceph 在 OSD 守护进程和底层设备上线时动态地重均衡。下列图表描述了 CRUSH 如何将对象映射到归置组、再把归置组映射到 OSD 。
有了集群运行图副本和 CRUSH 算法,客户端就能精确地计算出到哪个 OSD 读、写某特定对象。
在生产中,一个Pool里设置的PG数量是预先设置的,PG的数量不是随意设置,需要根据OSD的个数及副本策略来确定,线上尽量不要更改PG的数量,PG的数量的变更将导致整个集群动起来(各个OSD之间copy数据),大量数据均衡期间读写性能下降严重;
预先规划Pool的规模,设置PG数量;一旦设置之后就不再变更;后续需要扩容就以 Pool 为维度为扩容,通过新增Pool来实现(Pool通过 crushmap实现故障域隔离);
3.存储池相关命令介绍
#列出集群中的存储池,在新安装好的集群上,只有一个 rbd 存储池。但是ceph-deploy安装的没有创建创建存储池
[root@ceph-deploy ~]# ceph osd lspools
#在ceph集群中创建一个pool,下面的test-pool是你自己定义的存储池名称,第一个128是指PG,第二个128是指PGP,
具体两者的区别可以参考下面的我后面的解释
[root@ceph-deploy ~]# ceph osd pool create test-pool 128 128
pool 'test-pool' created
#设置存储池配额,存储池配额可设置最大字节数、和/或每存储池最大对象数。要取消配额,设置为 0 。
(集群名字需要重复两次),注意如果你给自建的存储池创建了定制的规则集,你不需要存储池时最好删除它。
如果你曾严格地创建了用户及其权限给一个存储池,但存储池已不存在,最好也删除那些用户。
/etc/ceph/ceph.conf里添加或修改如下一行mon allow pool delete = true
然后执行
systemctl restart ceph-mon.target重启ceph-mon服务
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool
#显示集群中pool的详细信息
[root@ceph-deploy ~]# rados df
POOL_NAME USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED RD_OPS RD WR_OPS WR
test-pool 0 B 0 0 0 0 0 0 0 0 B 0 0 B
total_objects 0
total_used 3.7 GiB
total_avail 86 GiB
total_space 90 GiB
#给一个pool创建一个快照,前面test-pool是存储池名,后面test-pool-snap是你自己指定的快照名
[root@ceph-deploy ~]# ceph osd pool mksnap test-pool test-pool-snap
created pool test-pool snap test-pool-snap
#删除pool的快照
[root@ceph-deploy ~]# ceph osd pool rmsnap test-pool test-pool-snap
#查看存储池中PG的数量
[root@ceph-deploy ~]# ceph osd pool get test-pool pg_num
pg_num: 128
#设置存储池的副本数为3
[root@ceph-deploy ~]# ceph osd pool set test-pool size 3
#设置data池能接受写操作的最小副本为2
[root@ceph-deploy ~]# ceph osd pool set test-pool min_size 2
#要获取对象副本数,执行命令:
[root@ceph-deploy ~]# ceph osd dump | grep 'replicated size'
存储池中PG和PGP概念的区别和理解:
- PG是指定存储池存储对象的目录有多少个,PGP是存储池PG的OSD分布组合个数
- PG的增加会引起PG内的数据进行分裂,分裂到相同的OSD上新生成的PG当中
- PGP的增加会引起部分PG的分布进行变化,但是不会引起PG内对象的变动
简单理解就是我们把PG的值理解成一个口袋,然后口袋里面装的是对象数据,然后OSD就相当于一个箱子。对象数据装入口袋,口袋装入箱子。现在对象数据的量是固定的,如果PG设为1个,也就是对象数据都会放在一个口袋里,然后放在箱子里,如果PG数量增加了,那么其实加的是口袋的数量,也就是之前可能一个箱子内放的是一个口袋,现在放了两个口袋,但是对象数据的量是固定的啊,所以就会根据算法,把对象数据放到新的口袋,但是这种变化是在一个箱子内部的,并不是跨箱子的。然后PGP的值可以理解成口袋的分布的一个指定。这样可能不好理解,你可以这样理解,本身一共有12个口袋,然后PGP的值是6,那么这12个口袋就会均匀的分布在6个箱子里面,每个箱子两个,这个时候如果把PGP设为12个,那么就会自动的从每个箱子里拿出一共口袋,放到新的箱子里来。这种变化是跨箱子的。
确定pg_num取值是强制性的,因为不能自动计算。下面是几个常用的值:
•少于5 个OSD 时可把pg_num设置为128•OSD
数量在5 到10 个时,可把pg_num设置为512•OSD
数量在10 到50 个时,可把pg_num设置为4096•OSD
数量大于50 时,你得理解权衡方法、以及如何自己计算pg_num取值
2.块设备的快速入门
1.安装ceph客户端
Ceph块设备,以前称为RADOS块设备,为客户机提供可靠的、分布式的和高性能的块存储磁盘。RADOS块设备利用librbd库并以顺序的形式在Ceph集群中的多个osd上存储数据块。RBD是由Ceph的RADOS层支持的,因此每个块设备都分布在多个Ceph节点上,提供了高性能和优异的可靠性。RBD有Linux内核的本地支持,这意味着RBD驱动程序从过去几年就与Linux内核集成得很好。除了可靠性和性能之外,RBD还提供了企业特性,例如完整和增量快照、瘦配置、写时复制克隆、动态调整大小等等。RBD还支持内存缓存,这大大提高了其性能:
任何普通的Linux主机(RHEL或基于debian的)都可以充当Ceph客户机。客户端通过网络与Ceph存储集群交互以存储或检索用户数据。CephRBD支持已经添加到Linux主线内核中,从2.6.34和以后的版本开始
#我们之间在之前的ceph-deploy节点上演示客户端挂载块设备,如果是其他节点,执行的命令都一样,我们先安装ceph
[root@ceph-deploy ~]# ceph-deploy install ceph-deploy
#接下来用 ceph-deploy 把 Ceph 配置文件和 ceph.client.admin.keyring 拷贝到 ceph-deploy节点上。
[root@ceph-deploy ~]# ceph-deploy admin ceph-deploy
#上面命令,ceph-deploy 工具会把密钥环复制到 /etc/ceph 目录,要确保此密钥环文件有读权限。我们可以执行下面命令
[root@ceph-deploy ~]#chmod +r /etc/ceph/ceph.client.admin.keyring
2.环境检查
#检查内核版本是否符合要求
需要注意:
1、linux内核从2.6.32版本开始支持ceph
2、建议使用2.6.34以及以上的内核版本
[root@ceph-deploy ceph]# uname -r
4.4.248-1.el7.elrepo.x86_64
#检查环境是否支持RBD
[root@ceph-deploy ceph]# modprobe rbd
[root@ceph-deploy ceph]# echo $?
0
3.客户端创建块设备及映射和取消映射删除块设备
#默认创建块设备,会直接创建在rbd池中,但使用deploy 安装后,该rbd池并没有创建。所以我们这里创建rbd存储池,并初始化
[root@ceph-deploy ~]# ceph osd pool create rbd
[root@ceph-deploy ~]# rbd pool init rbd
#下面命令会创建一个名为test-rbd1,大小为10G的块设备镜像。这里--image-feature的作用是在创建块设备的时候指明需要的特性。
不然后面可能出一下报错。上面讲了默认块存储建子啊rbd池中,这里可以通过-p参数改变池
[root@ceph-deploy ~]# rbd create --size 10240 test-rbd1 --image-feature layering
#列出现在集群中有哪些rbd设备镜像
[root@ceph-deploy ~]# rbd ls
test-rbd1
#查看创建后的块设备的信息
[root@ceph-deploy ~]# rbd --image test-rbd1 info
rbd image 'test-rbd1':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
id: 5e7b6b8b4567
block_name_prefix: rbd_data.5e7b6b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Tue Jan 12 15:35:57 2021
#通过下面命令把创建好的块设备镜像映射到本地。
[root@ceph-deploy ~]# rbd map --image test-rbd1
#映射过程中我们发现以下报错。
rbd: sysfs write failed
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (110) Connection timed out
#按报错提示,我们执行下面命令,发现出错的原因
[root@ceph-deploy ~]# dmesg |tail
[535525.898069] libceph: mon0 172.31.46.63:6789 feature set mismatch, my 106b84a842a42 < server's 40106b84a842a42, missing 400000000000000
[535525.898128] libceph: mon0 172.31.46.63:6789 missing required protocol features
#解决过程如下
1.修改Ceph配置文件/etc/ceph/ceph.conf(集群中每个节点都要改),在global section下,增加
#查看是否取消成功,如没有任何输出则表示取消映射成功
[root@ceph-deploy ~]# rbd showmapped
#删除块设备并检查
[root@ceph-deploy ~]# rbd rm test-rbd1
Removing image: 100% complete...done.
[root@ceph-deploy ~]# rbd ls
3.文件系统的快速入门
这里我们还是ceph的部署管理节点演示如何使用的ceph的文件存储。
#CephFs需要用到MDS服务,所以我们这里需要在集群中部署mds服务,我们这里选择部署在node1节点上
[manager@ceph-deploy my-cluster]$ ceph-deploy mds create node1
#一个 Ceph 文件系统需要至少两个 RADOS 存储池,一个用于数据、一个用于元数据。配置这些存储池时需考虑:
- 为元数据存储池设置较高的副本水平,因为此存储池丢失任何数据都会导致整个文件系统失效。
- 为元数据存储池分配低延时存储器(像 SSD ),因为它会直接影响到客户端的操作延时。
可以不拷贝到客户机上,客户机挂载时只需使用上面key里面的内容即可
#一般Ceph我们都启用了Ceph 认证所有挂载的时候需要name 和secret ceph.client.cephfs.keyring文件信息,可通过下面的命令检查是否开启的验证,cephx表示开启
了验证
把ceph 服务器上生成的cephfskey复制到客户端,因为我就是在部署管理节点进行演示的,所以不用复制,然后通过下面的命令指定key进行fuse客户端挂载。
不指定key文件挂载(默认回去/etc/ceph/目录下找 对应的用户名key文件)
[root@ceph-deploy ~]# ceph-fuse --keyring /home/manager/my-cluster/ceph.client.cephfs.keyring --name client.cephfs -m 172.31.46.63:6789 /cephfs2
#fuse客户端开机挂载,可以执行下面命令,因为 keyring文件包含了用户名,所以fstab不需要指定用了
[root@ceph-deploy ~]# echo "id=cephfs,keyring=/home/manager/my-cluster/ceph.client.cephfs.keyring /cephfs2 fuse.ceph defaults 0 0 _netdev" >> /etc/fstab