本章概述
- 块设备
- ceph radosgw(RGW)对象存储网关
- Ceph-FS文件存储
- Ceph集群维护
- Ceph配置文件
- 存储池、PG与CRUSH
- PG的状态
- 数据读写流程
- 存储池操作
- 存储池快照
- 数据压缩
4.1 块设备
RBD(RADOS Block Devices)即为块存储的一种,RBD 通过 librbd 库与 OSD 进行交互,RBD为 KVM 等虚拟化技术和云服务(如 OpenStack 和 CloudStack)提供高性能和无限可扩展性的存储后端,这些系统依赖于 libvirt 和 QEMU 实用程序与 RBD 进行集成,客户端基于librbd 库即可将 RADOS 存储集群用作块设备,不过,用于 rbd 的存储池需要事先启用 rbd功能并进行初始化。例如,下面的命令创建一个名为 myrbd1 的存储池,并在启用 rbd 功能后对其进行初始化
4.1.1 创建RBD
具体 RBD 使用会在第六章详细介绍
创建存储池命令格式:
$ceph osd pool create <poolname> pg_num pgp_num {replicated|erasure}
$ ceph osd pool create myrbd1 64 64 #创建存储池,指定 pg 和 pgp 的数量,pgp 是对存在于 pg 的数据进行组合存储,pgp 通常等于 pg 的值
$ ceph osd pool --help
$ ceph osd pool application enable myrbd1 rbd #对存储池启用 RBD 功能
$ rbd -h
$ rbd pool init -p myrbd1 #通过 RBD 命令对存储池初始化
注意:此时块设备仍不能使用,需要创建镜像image
4.1.2 创建并验证img
rbd 存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用,rbd 命令可用于创建、查看及删除块设备相在的映像(image),以及克隆映像、创建快照、将映像回滚到快照和查看快照等管理操作。
下面的命令能够创建一个名为 myimg1 的映像:
cephadmin@ceph-deploy:~/ceph-cluster$ rbd create myimg1 --size 5G --pool myrbd1
查看指定 rbd 的信息
cephadmin@ceph-deploy:~/ceph-cluster$ rbd --image myimg1 --pool myrbd1 info
创建名为 myimg2 的映像:
cephadmin@ceph-deploy:~/ceph-cluster$ rbd create myimg2 --size 3G --pool myrbd1 --image-format 2 --image-feature layering #后续步骤会使用centos系统挂载 myimg2进行实验,由于centos系统内核较低无法挂载使用,为了后续方便实验演示,因此这里只开启部分特性
除了 layering 其他特性需要高版本内核支持
cephadmin@ceph-deploy:~/ceph-cluster$ rbd --image myimg2 --pool myrbd1 info
4.1.3 客户端使用块存储
4.1.3.1 查看存储状态
cephadmin@ceph-deploy:~/ceph-cluster$ ceph df
其中RAW STORAGE可以看到:
ceph集群有4个node,每个node有3个20G磁盘,因此存储中大小为240G
POOLS可以看到两个存储池:
POOL列:
myrbd1为刚创建的存储池
mypool为3.4.11章节做实验时创建的存储池
MAX AVAIL是指做过三副本计算时候可用的存储空间(一共240G,除以3,可用空间大概为76G)
4.1.3.2 在客户端安装ceph-common
客户端是指使用(挂载)块存储的服务器,这里以一台centos系统的服务器(地址为172.31.7.151)作为客户端
在客户端服务器172.31.7.151上执行以下命令:
1、配置 yum 源,安装ceph-common(在客户端生成/etc/ceph目录)
[root@centos-base ~]# yum install epel-release
[root@centos-base ~]# yum install https://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch/ceph-release-1-1.el7.noarch.rpm -y
注意:由于ceph 高版本不再支持centos,这里只能安装O版(即15.2.x)ceph的yum源。但即使安装O版ceph的yum源,仍然可以挂载p版ceph的块存储
[root@centos-base ~]# yum install ceph-common
2、从部署服务器同步认证文件
客户端访问ceph需要先访问mon,但此时客户端不知道mon节点地址,因此需要将认证文件ceph.conf从部署服务器同步到客户端(ceph.conf文件中有mon节点地址),客户端根据地址访问mon节点,进而访问ceph集群。
另外,客户端访问ceph集群还需要认证文件,由于此时客户端没有创建用户,因此这里暂时使用admin用户的key文件ceph.client.admin.keyring进行认证(注意:生产环境一般不会使用admin用户进行认证)
在ceph-deploy节点172.31.7.120上执行命令
su - cephadmin
cd /home/cephadmin/ceph-cluster
cephadmin@ceph-deploy:~/ceph-cluster$ scp ceph.conf ceph.client.admin.keyring root@172.31.7.151:/etc/ceph/
3、验证
此时,由于客户端有了admin的认证文件,因此可以执行ceph命令查看集群情况,因此admin的key文件非常重要,要保存好该文件。
在客户端服务器172.31.7.151上执行命令:
[root@centos-base ~]# ceph -s
4.1.3.3 客户端映射img
注意:ceph集群存在两个块设备myimg1和myimg2(在4.1.1章节创建)
(1)映射myimg2块设备
在客户端172.31.7.151上进行映射:
[root@centos-base ~]# rbd -p myrbd1 map myimg2 #映射myimg2块设备
查看客户端本地磁盘,可以看到/dev/rbd0
[root@centos-base ~]# fdisk -l
(2)映射myimg1块设备
[root@centos-base ~]# rbd -p myrbd1 map myimg1
由于ceph p版(16.2.x版)仅有部分功能支持centos7,因此这里映射myimg1块设备,会报错。这是因为ceph部分功能不支持centos7,因此无法映射p版ceph的创建块存储。
想要成功映射,需要关闭部分功能特性才可以,在客户端服务器执行命令:
[root@centos-base ~]# rbd feature disable myrbd1/myimg1 object-map fast-diff deep-flatten
关闭后再次执行挂载命令:
[root@centos-base ~]# rbd -p myrbd1 map myimg1
查看客户端服务器本地磁盘:
可以看到/dev/rbd1已经成功映射到本地
4.1.3.4 客户端格式化磁盘并挂载使用
1、磁盘格式化
[root@centos-base ~]# mkfs.ext4 /dev/rbd1
2、挂载磁盘
[root@centos-base ~]# mount /dev/rbd1 /mnt
3、查看本地磁盘
4.1.3.5 客户端验证
1、在客户端向/mnt所在磁盘写入数据
[root@centos-base ~]# dd if=/dev/zero of=/mnt/test bs=1MB count=300
2、在ceph-deploy节点查看ceph存储池信息
4.1.3.6 客户端删除数据
删除数据
[root@centos-base ~]# rm -rf /mnt/test
查看本地数据,/dev/rdb1的磁盘使用量已经下降
但是在ceph-deploy节点查看存储池,存储池的空间没有释放。这是因为删除完成的数据只是标记为已经被删除,但不会从块存储立即清空,因此在删除完成后使用ceph df查看存储池myrbd1并没有回收空间
可以使用以下方法释放空间:
方法一:
如果需要立即在系统层回收空间,在客户端服务器172.31.7.151上执行以下命令:
[root@centos-base ~]# fstrim -v /mnt #这里的/mnt为挂载点,fstrim命令来自于英文词组“filesystem trim”的缩写,其功能是回收文件系统中未使用的快资源。
在ceph-deploy节点查看ceph存储池myrbd1是否被释放
但是这种方式需要在每次删除文件后在执行该命令,使用较为不便。
方法二:
配置挂载选项:即在挂载/dev/rbd1时执行该命令
[root@centos-base ~]# mount -t ext4 -o discard /dev/rbd1 /mnt/ #主要用户SSD,立即触发闲置的块回收
首先需要卸载/mnt,并使用以上命令重新挂载
在客户端服务器执行命令:
[root@centos-base ~]# umount /mnt
[root@centos-base ~]# mount -t ext4 -o discard /dev/rbd1 /mnt/ #注意:磁盘格式化时为ext4格式,这里-t 要指定为ext4。如果磁盘格式化为其他类型,如xfs,则-t 要指定为xfs格式
写入数据
[root@centos-base ~]# dd if=/dev/zero of=/mnt/test bs=1MB count=300
查看客户端服务器/mnt所在磁盘使用情况
在ceph-deploy服务器查看ceph存储池myrbd1情况:
在客户端服务器删除文件
[root@centos-base ~]# rm -rf /mnt/test
查看客户端本地/mnt所在磁盘使用
查看ceph存储池myrbd1使用情况,占用空间已经被回收
4.1.3.7 块存储使用总结
服务端使用ceph块存储
1、创建存储池
2、启用块存储
3、对块存储进行初始化
客户端使用块存储
1、客户端安装ceph-common
2、从服务端(ceph-deploy)复制ceph配置文件(ceph.conf)和认证文件到客户端
3、客户端映射块存储
4、磁盘格式化然后进行挂载
5、客户端文件删除后,ceph存储池空间不会立即回收,需要在挂载时添加-o discard选项
4.2 ceph radosgw(RGW)对象存储网关
RGW 提供的是 REST 接口,客户端通过 http 与其进行交互,完成数据的增删改查等管理操作。
radosgw 用在需要使用 RESTful API 接口访问 ceph 数据的场合,因此在使用 RBD 即块存储得场合或者使用 cephFS 的场合可以不用启用 radosgw 功能。
RGW是客户端访问ceph存储的另外一种不需要挂载的方式
如下图所示:
客户端通过RGW访问存储数据时,需要指定文件名,RGW通过文件名从bucket获取数据,bucket从存储池中获取该文件返回给RGW,然后RGW将结果返回给客户端
4.2.1 部署radosgw服务
如果是在使用 radosgw 的场合,则以下命令将 ceph-mgr1 服务器部署为 RGW 主机:
在ceph-mgr主机172.31.7.124节点执行命令:
1、查看radosgw当前版本
root@ceph-mgr1:~# apt-cache madison radosgw
2、在ceph-mgr1节点上安装radosgw
ubuntu:
root@ceph-mgr1:~# apt install radosgw=16.2.11-1bionic
centos:
yum install ceph-radosgw
3、在ceph-deploy节点172.31.7.120上执行命令
cephadmin@ceph-deploy:~/ceph-cluster$ ceph-deploy --overwrite-conf rgw create ceph-mgr1 #在ceph-mgr1上创建rgw并强制覆盖该节点上的配置文件(一般情况下,如果目标节点已经存在ceph.conf配置文件,安装其他服务时,ceph-deploy不会将配置文件再复制一份过去,因此需要指定--overwrite-conf选项,将目标节点的ceph配置文件强制覆盖)
rgw进程默认端口为7480
4.2.2 验证
1、验证radosgw服务
(1)在ceph-mgr1上查看端口号,radosgw进程已经运行
root@ceph-mgr1:~# ss -ntlp
(2)通过浏览器访问172.31.7.124:7480
由于没有数据且没有开启身份验证,因此只要能够访问当前页面就说明已经启用成功
2、 验证ceph集群状态
cephadmin@ceph-deploy:~/ceph-cluster$ ceph -s #可以看到rgw已经开启
3、验证 radosgw 存储池
初始化完成 radosgw 之后,会初始化默认的存储池如下:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool ls
4.3 Ceph-FS 文件存储
参考链接:https://docs.ceph.com/en/latest/cephfs/
Ceph FS 即 ceph filesystem,可以实现文件系统共享功能,客户端通过 ceph 协议挂载并使用 ceph 集群作为数据存储服务器。(无需格式化,挂载即可使用。类似于nfs)
Ceph FS 需要运行 Meta Data Services(MDS)服务,其守护进程为 ceph-mds,ceph-mds进程管理与 cephFS 上存储的文件相关的元数据,并协调对 ceph 存储集群的访问。
Ceph FS数据读写过程:
在使用Ceph FS进行读写数据时,会先进行认证。如果是读操作,会先到mds检索元数据,然后到ceph存储池读取数据;如果是写操作,会将文件的元数据写入MDS中,再由MDS写入到元数据存储池。
Ceph FS有两个存储池:一个是元数据存储池,用于保存文件的属性信息(文件大小、文件名称、创建时间等);另一个是数据存储池,用于保存数据本身。这是因为Ceph FS在进行数据检索需要用到文件的元数据信息来过滤文件,然后返回给客户端
数据的元数据保存在单独的一个存储池cephfs-metadata(名字可自定义),因此元数据也是基于3副本提高可用性,另外使用专用的MDS服务器在内存缓存元数据信息以提高对客户端的读写响应性能。
4.3.1 部署MDS服务
在指定的 ceph-mds 服务器部署 ceph-mds 服务,可以和其它服务器混用(如 ceph-mon、ceph-mgr)
本次部署将mds和ceph-mgr混用,即将ceph-mds部署在mgr1节点上
1、查看mds版本
root@ceph-mgr1:~# apt-cache madison ceph-mds
2、在mgr1节点上安装mds安装包
ubuntu:
root@ceph-mgr1:~# apt install ceph-mds=16.2.11-1bionic
Centos:
[root@ceph-mgr1 ~]# yum install ceph-mds -y
3、在ceph-deploy节点上部署mds服务
cephadmin@ceph-deploy:~/ceph-cluster$ ceph-deploy mds create ceph-mgr1
4.3.2 验证 MDS 服务
MDS 服务目前还无法正常使用,需要为 MDS 创建存储池用于保存 MDS 的数据。
[ceph@ceph-deploy ceph-cluster]$ ceph mds stat
1 up:standby #当前为备用状态,需要分配 pool 才可以使用。
4.3.3 创建 CephFS metadata 和 data 存储池
使用 CephFS 之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池,如下命令将创建名为 mycephfs 的文件系统,它使用 cephfs-metadata 作为元数据存储池,使用 cephfs-data 为数据存储池。
创建metadata(元数据)存储池:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool create cephfs-metadata 32 32
创建data(数据)存储池
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool create cephfs-data 64 64
4.3.4 创建Ceph FS
1、创建cephfs
cephadmin@ceph-deploy:~/ceph-cluster$ ceph fs new mycephfs cephfs-metadata cephfs-data
2、查看ceph集群状态
cephadmin@ceph-deploy:~/ceph-cluster$ ceph -s #mds已经拉起
3、查看当前cephfs
cephadmin@ceph-deploy:~/ceph-cluster$ ceph fs ls
4、查看指定 cephFS 状态
cephadmin@ceph-deploy:~/ceph-cluster$ ceph fs status mycephfs
4.3.5 验证Ceph FS服务状态
查看ceph fs状态,cephfs 状态现在已经转变为活动状态
4.3.6 客户端挂载cephFS
这里客户端还是使用之前的客户端服务器172.31.7.151,在客户端服务器执行以下命令:
1、在ceph-deploy节点将认证文件复制到该服务器
具体步骤请参考4.1.3.2章节
2、ubuntu 及 centos client 挂载(内核版本 2.6.34 在 3.6.34 及以上)
[root@centos-base ~]# mount -t ceph 172.31.7.121:6789:/ /mnt -o name=admin,secret=AQBmDBtksKF2AxAAxegTCmr+VZU9lN/gAKebhA== #这里是指将cephfs挂载到/mnt目录
参数说明:
172.31.7.121是指mon节点ip地址,这里可以指定任意mon节点的ip地址
secret是指ceph.client.admin.keyring文件中key的值,以下备注部分
cat ceph.client.admin.keyring
[client.admin]
key = AQBmDBtksKF2AxAAxegTCmr+VZU9lN/gAKebhA== #此处为key值
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
3、查看客户端服务器本地磁盘
4、验证
(1)在客户端服务器172.31.7.151上,在/mnt目录下写入数据
[root@centos-base ~]#cd /mnt
[root@centos-base mnt]#echo 123 > 1.txt
[root@centos-base mnt]#cat 1.txt
(2)在另一个客户端服务器172.31.7.155上挂载cephfs,可以直接查看1.txt(cephfs是共享的)
cephfs可以直接挂载,不需要安装ceph-common,这是因为内核中有内置模块,可以直接识别ceph类型的文件系统,因此,直接在另一个客户端172.31.7.155上直接挂载cephfs:
root@ubuntu:~# mount -t ceph 172.31.7.121:6789:/ /mnt -o name=admin,secret=AQBmDBtksKF2AxAAxegTCmr+VZU9lN/gAKebhA==
(3)查看本地磁盘:
查看/mnt目录下是否有1.txt,并查看1.txt的内容
root@ubuntu:~# ls /mnt
root@ubuntu:~# cat /mnt/1.txt
延伸:
查看ceph内置模块
lsmod |grep ceph #查询ceph内置模块
modinfo ceph #查看ceph内置模块信息
Ubuntu:
centos:
modinfo libceph #查看ceph核心模块
4.3.7 Ceph FS数据读写测试
1、在客户端172.31.7.151向cephfs写入数据
[root@centos-base mnt]#dd if=/dev/zero of=/mnt/file bs=1MB count=300
2、查看ceph存储池存储空间
3、在客户端删除数据后,查看ceph存储池空间,已经被释放
rm -rf /mnt/file
4.3.8 命令总结
1、查看存储池信息
$ ceph osd pool ls #只显示存储池:
$ ceph osd lspools #列出存储池并显示 id
$ ceph pg stat #查看 pg 状态
$ ceph osd pool stats #查看所有的 pool 的状态
注意:下图中每个pool下面提示nothing is going on是指磁盘处于最佳状态
$ ceph osd pool stats mypool #查看指定 pool的状态
2、查看集群存储信息
$ ceph df #查看集群存储状态
$ ceph df detail #查看集群存储状态详情
3、查看集群osd信息
$ ceph osd stat #查看 osd 状态
$ ceph osd dump #显示 OSD 的底层详细信息
$ ceph osd tree #显示 OSD 和节点的对应关系
查找OSD对应的磁盘:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd tree #先找到异常OSD的ID,假如id为8的OSD故障
到OSD所在的node节点查看与OSD对应的磁盘,执行命令:
lsblk -f |grep -B1 ceph #获取各个磁盘的ID
ls -lh /var/lib/ceph/osd/ceph-8/block #查看osd8的磁盘ID,然后与各磁盘ID进行比较,可以看到osd8对应的是/dev/sdd这块磁盘,这样就可以找到异常的磁盘进行更换
4、查看集群mon信息
$ ceph mon stat #查看 mon 节点状态:
$ ceph mon dump #查看 mon 节点的 dump 信息
dumped monmap epoch 3
epoch 3 #Ceph OSD 守护进程和 PG 的每个状态改变的历史(称之为"epoch"),osd.N 的失效会导致 osd map 变化,epoch 值也会自动调整
4.4 Ceph集群维护
4.4.1 通过套接字进行单机管理
查看socket文件
node 节点:
[root@ceph-node1 ~]# ll /var/run/ceph/
mon 节点:
root@ceph-mon1:~# ll /var/run/ceph/
mgr节点:
root@ceph-mgr1:~# ll /var/run/ceph/
1、可在 node 节点或者 mon 节点通过 ceph 命令进行单机管理本机的 mon 或者 osd 服务:
(1)先将 admin 认证文件同步到 mon 或者 node 节点:
以mon1为例:
在ceph-deploy节点将认证文件同步到mon1节点:
ceph@ceph-deploy:/home/ceph/ceph-cluster$ scp ceph.client.admin.keyring root@172.31.7.121:/etc/ceph
(2)在mon1节点执行命令
[root@ceph-node1 ~]# ceph --admin-socket /var/run/ceph/ceph-osd.0.asok –help
注意:一般情况下不会使用这种方式修改配置,因为修改的只是当前osd节点的配置,不会对其他的osd生效
(3)同理,可以使用这种方式查询mon 状态
--admin-daemon #该选项是指在 mon 节点获取 daemon 服务帮助
[root@ceph-mon1~]#ceph --admin-daemon /var/run/ceph/ceph-mon.ceph-mon1.asok help
查看mon 状态
[root@ceph-mon1~]# ceph --admin-daemon /var/run/ceph/ceph-mon.ceph-mon1.asok mon_status
查看配置信息:
[root@ceph-mon1~]# ceph --admin-daemon /var/run/ceph/ceph-mon.ceph-mon1.asok config show
4.4.2 Ceph集群的停止或重启
重启之前,要提前设置 ceph 集群不要将 OSD 标记为 out,避免 node 节点关闭服务后被踢出 ceph 集群外:
[ceph@ceph-deploy ceph-cluster]$ ceph osd set noout #关闭服务前设置 noout
[ceph@ceph-deploy ceph-cluster]$ ceph osd unset noout #启动服务后取消 noout
4.4.2.1 关闭顺序
#关闭服务前设置 noout
关闭存储客户端停止读写数据
如果使用了 RGW,关闭 RGW
关闭 cephfs 元数据服务
关闭 ceph OSD
关闭 ceph manager
关闭 ceph monitor
4.4.2.2 启动顺序
启动 ceph monitor
启动 ceph manager
启动 ceph OSD
关闭 cephfs 元数据服务
启动 RGW
启动存储客户端
#启动服务后取消 noout-->ceph osd unset noout
4.4.2.3 添加服务器
1.先添加仓库源
2.安装组件
ceph-deploy install --release pacific ceph-nodex
3.擦除磁盘
ceph-deploy disk zap ceph-nodex /dev/sdx
4.添加 osd:
sudo ceph-deploy osd create ceph-nodex --data /dev/sdx
4.4.2.4 删除osd
把故障的OSD并从 ceph 集群删除
1、把 osd 踢出集群
注意:踢出osd时不要一下全部踢出,要一个一个踢出osd
ceph osd out 1
2、过一段时间
注意:osd被踢出后会进行数据同步,集群cluster网络使用量上涨,通过查看监控,待数据同步完成以后(cluster网络使用量下降)再进行下一个osd的踢出操作
3、在node节点停止 osd.x 进程
4、在node节点删除 osd
ceph osd rm 1
4.4.2.5 删除服务器
停止服务器之前要把服务器的 OSD 先停止并从 ceph 集群删除
1、把 osd 踢出集群
注意:踢出osd时不要一下全部踢出,要一个一个踢出osd
ceph osd out 1
2、过一段时间
注意:osd被踢出后会进行数据同步,集群cluster网络使用量上涨,通过查看监控,待数据同步完成以后(cluster网络使用量下降)再进行下一个osd的踢出操作
3、在node节点停止 osd.x 进程
4、在node节点删除 osd
ceph osd rm 1
5、当前主机的其它磁盘重复以上操作
6、OSD 全部操作完成后下线主机
7、把主机信息从ceph集群清理掉
ceph osd crush rm ceph-node1 #从crush删除ceph-node1
4.5 Ceph配置文件
Ceph 的主配置文件是/etc/ceph/ceph.conf,ceph 服务在启动时会检查 cep.conf,分号”;”和”#”在配置文件中都是注释,ceph.conf 主要由以下配置段组成:
[global] #全局配置
[osd] #osd 专用配置,可以使用 osd.N,来表示某一个 OSD 专用配置,N 为 osd 的编号,如 0、2、1 等。
示例:[osd.1]是指osdID为1的专用配置
[mon] #mon 专用配置,也可以使用 mon.A 来为某一个 monitor 节点做专用配置,其中 A为该节点的名称,ceph-monitor-2、ceph-monitor-1 等,使用命令 ceph mon dump 可以获取节点的名称
示例:[mon.ceph-mon1]是指mon1的专用配置
[client] #是指客户端专用配置。
ceph 文件的加载顺序:
(1)$CEPH_CONF 环境变量
(2)-c 指定的位置 #在启动ceph时通过-c指定文件位置来达到传参数的目的
(3)/etc/ceph/ceph.conf
(4)~/.ceph/ceph.conf
(5)./ceph.conf
4.6 存储池、PG与CRUSH
副本池:replicated,定义每个对象在集群中保存为多少个副本,默认为三个副本,一主两备,实现高可用,副本池是 ceph 默认的存储池类型。
纠删码池(erasure code): 把各对象存储为 N=K+M 个块,其中 K 为数据块数量,M 为编码块数量(用于存储校验码),因此存储池的尺寸为 K+M。类似于磁盘做raid5,磁盘故障后不是通过副本数恢复数据而是通过校验码恢复数据,这种方式用的不多,适用场景是在磁盘有限又想获取最多的磁盘空间时使用
即数据保存在 K 个数据块,并提供 M 个冗余块提供数据高可用,那么最多能故障的块就是M 个,实际的磁盘占用就是 K+M 块,因此相比副本池机制比较节省存储资源,一般采用8+4 机制(默认为2+2),即 8 个数据块+4 个冗余块,那么也就是 12 个数据块有 8 个数据块保存数据,有 4 个实现数据冗余,即 1/3 的磁盘空间用于数据冗余,比默认副本池的三倍冗余节省空间,但是不能出现大于一定数据块故障。
但是不是所有的应用都支持纠删码池,RBD 只支持副本池而 radosgw 则可以支持纠删码池。
4.6.1 副本池IO
将一个数据对象存储为多个副本
在客户端写入操作时,ceph 使用 CRUSH 算法计算出与对象相对应的 PG ID 和 primary OSD
主 OSD 根据设置的副本数、对象名称、存储池名称和集群运行图(cluster map)计算出 PG的各辅助 OSD,然后由 OSD 将数据再同步给辅助 OSD。
ceph数据读写过程:(如下图所示)
上图中左边为Read读取数据过程,右边为Write写入数据过程:
Read读取数据过程:
1. 客户端发送读请求,RADOS 将请求发送到主 OSD。
2. 主 OSD 从本地磁盘读取数据并返回数据,最终完成读请求。
Write写入数据过程:
1. 客户端 APP 请求写入数据,RADOS 发送数据到主 OSD。
2. 主 OSD 识别副本 OSDs,并发送数据到各副本 OSD。
3. 副本 OSDs 写入数据,并发送写入完成信号给主 OSD。
4. 主 OSD 发送写入完成信号给客户端 APP。
下图为数据写入ceph的过程:
数据写入ceph的过程
1、客户端 APP 请求写入数据,RADOS 发送数据到主 OSD。
2、主 OSD 识别副本 OSDs,发送数据到第二副本 OSD。
3、然后再将数据发送给第三副本OSD
4、第二副本 OSDs 写入数据,并发送写入完成信号给主 OSD。
5、第三副本 OSDs 写入数据,并发送写入完成信号给主 OSD。
6、主 OSD 发送写入完成信号给客户端 APP。
4.6.2 纠删码池IO
参考链接:http://ceph.org.cn/2016/08/01/ceph-%E7%BA%A0%E5%88%A0%E7%A0%81%E4%BB%8B%E7%BB%8D/
Ceph 从 Firefly 版本开始支持纠删码,但是不推荐在生产环境使用纠删码池。
纠删码池降低了数据保存所需要的磁盘总空间数量,但是读写数据的计算成本要比副本池高
RGW 可以支持纠删码池,RBD 不支持
纠删码池可以降低企业的前期 TCO 总拥有成本
4.6.2.1 纠删码写
数据将在主 OSD 进行编码然后分发到相应的 OSDs 上去。
1.计算合适的数据块并进行编码
2.对每个数据块进行编码并写入 OSD
创建纠删码池:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool create erasure-testpool 16 16 erasure # erasure是指创建时指定创建的是纠删码池
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd erasure-code-profile get default #获取纠删码池默认配置
可以看到默认k=2,m=2,即两个数据块,两个纠编码块
输出结果说明:
k=2 #k 为数据块的数量,即要将原始对象分割成的块数量,例如,如果 k = 2,则会将一个10kB 对象分割成各为 5kB 的 k 个对象。
m=2 #编码块(chunk)的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示有两个额外的备份,最多可以从当前 pg 中宕机 2 个 OSD,而不会丢失数据。
plugin=jerasure #默认的纠删码池插件
technique=reed_sol_van
写入数据:
cephadmin@ceph-deploy:~/ceph-cluster$ sudo rados put -p erasure-testpool testfile1 /var/log/syslog
验证数据:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd map erasure-testpool testfile1
验证当前 pg 状态:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph pg ls-by-pool erasure-testpool | awk '{print $1,$2,$15}'
测试获取数据
cephadmin@ceph-deploy:~/ceph-cluster$ rados --pool erasure-testpool get testfile1 - #”-”是指将数据在当前终端打印出来
cephadmin@ceph-deploy:~/ceph-cluster$ rados --pool erasure-testpool get testfile1 /tmp/testfile1 #将数据存放在/tmp/testfile1文件中
4.6.2.2 纠删码读
从相应的 OSDs 中获取数据后进行解码。
如果此时有数据丢失,Ceph 会自动从存放校验码的 OSD 中读取数据进行解码。
知识延伸:
问题一:
查看ceph集群信息,提示:1 pool(s) do not have an application enabled
这是由于ceph集群中有应用的pool没有起来,使用以下命令查看详情:
ceph health detail
纠删码池没有拉起,拉起的命令为:
ceph osd pool application enable <pool-name> <app-name>
执行命令:
ceph osd pool application enable erasure-testpool rgw #只有rgw支持纠删码池
再次查看ceph集群信息,恢复正常
问题二:
查看集群信息,提示:clock skew detected on mon.ceph-mon2
解决方法:
在deploy节点修改ceph.conf配置文件
cephadmin@ceph-deploy:~/ceph-cluster$ vim /etc/ceph/ceph.conf #备注部分为新增内容
[global]
fsid = 991e359f-f722-487a-a94d-c0344e4852c3
public_network = 172.31.7.0/24
cluster_network = 192.168.7.0/24
mon_initial_members = ceph-mon1
mon_host = 172.31.7.121
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
mon clock drift allowed = 2 #新增配置
mon clock drift warn backoff = 30 #新增配置
向mon节点重推配置文件
cephadmin@ceph-deploy:~/ceph-cluster$ ceph-deploy --overwrite-conf config push ceph-mon1
cephadmin@ceph-deploy:~/ceph-cluster$ ceph-deploy --overwrite-conf config push ceph-mon2
cephadmin@ceph-deploy:~/ceph-cluster$ ceph-deploy --overwrite-conf config push ceph-mon3
重启三个mon节点的ceph-mon服务
systemctl restart ceph-mon@ceph-mon1
systemctl restart ceph-mon@ceph-mon2
systemctl restart ceph-mon@ceph-mon3
再次查看ceph集群信息,已恢复正常
4.6.3 PG与PGP
PG = Placement Group #归置组
PGP = Placement Group for Placement purpose #归置组的组合,pgp 相当于是 pg 对应osd 的一种排列组合关系(在不同的PG内使用不同组合关系的OSD)。
假如PG=32,PGP=32,那么:
数据最多被拆分为32份(PG),写入到有32种组合关系(PGP)的OSD上。
注意:假设PG=32,那么如果有数据有100G,那么每份数据为3G左右,如果数据有200G,则每份数据为6G左右,因此PG的数量是数据被拆分的颗粒度,PG的数量越多,每个PG的数据量越小,数据恢复就越快,数据同步的时间就越短
归置组(placement group)是用于跨越多 OSD 将数据存储在每个存储池中的内部数据结构。
归置组(PG)在 OSD 守护进程和 ceph 客户端之间生成了一个中间层,CRUSH 算法负责将每个对象动态映射到一个归置组(PG),然后再将每个归置组(PG)动态映射到一个或多个 OSD 守护进程,从而能够支持在新的 OSD 设备上线时进行数据重新平衡。
相对于存储池来说,PG 是一个虚拟组件,它是对象映射到存储池时使用的虚拟层。
可以自定义存储池中的归置组数量。
ceph 出于规模伸缩及性能方面的考虑,ceph 将存储池细分为多个归置组,把每个单独的对象映射到归置组,并为归置组分配一个主 OSD。
存储池由一系列的归置组组成,而 CRUSH 算法则根据集群运行图和集群状态,将个 PG 均匀、伪随机(基于 hash 映射,每次的计算结果够一样)的分布到集群中的 OSD 之上。
如果某个 OSD 失败或需要对集群进行重新平衡,ceph 则移动或复制整个归置组而不需要单独对每个镜像进行寻址。(即一旦磁盘故障或者osd中的磁盘异常,数据会重新同步)
总结:
PG是一个虚拟组建,是逻辑上的概念,属于客户端和OSD之间的一个中间层,将客户端和OSD联系起来。
每个PG都有一个主OSD。
客户端写入数据时,只需要将数据写入PG,而无需关心数据写入到哪个OSD,数据写入OSD的操作,是由PG和OSD进行交互完成的。
PG会被均匀、随机的分部到OSD上,一旦OSD的某个磁盘故障,ceph集群只需移动PG即可进行数据同步。
4.6.4 验证PG和PGP的状态
cephadmin@ceph-deploy:~/ceph-cluster$ ceph pg ls-by-pool mypool | awk '{print $1,$2,$15}'
4.6.5 PG与OSD的关系
ceph 基于 crush 算法将归置组 PG 分配至 OSD
当一个客户端存储对象的时候,CRUSH 算法映射每一个对象至归置组(PG)
4.6.6 PG的分配计算
归置组(PG)的数量是由管理员在创建存储池的时候指定的,然后由 CRUSH 负责创建和使用,PG 的数量是 2 的 N 次方的倍数,每个 OSD 的 PG 不要超出 250 个 PG,官方是每个OSD 100 个 左 右 :https://docs.ceph.com/en/mimic/rados/configuration/pool-pg-config-ref/
即:确保设置了合适的归置组大小,我们建议每个 OSD 大约 100 个,例如,osd 总数乘以 100除以副本数量(即 osd 池默认大小),因此,对于 10 个 osd、存储池为 4 个,我们建议每个存储池大约(100 * 10) / 4 = 256。
1、通常,PG 的数量应该是数据的合理力度的子集。
例如:一个包含 256 个 PG 的存储池,每个 PG 中包含大约 1/256 的存储池数据
2、当需要将 PG 从一个 OSD 移动到另一个 OSD 的时候,PG 的数量会对性能产生影响。
PG 的数量过少,一个 OSD 上保存的数据数据会相对加多,那么 ceph 同步数据的时候产生的网络负载将对集群的性能输出产生一定影响。
PG 过多的时候,ceph 将会占用过多的 CPU 和内存资源用于记录 PG 的状态信息
3、PG 的数量在集群分发数据和重新平衡时扮演者重要的角色作用
在所有 OSD 之间进行数据持久存储以及完成数据分布会需要较多的归置组,但是他们的数量应该减少到实现 ceph 最大性能所需的最小 PG 数量值,以节省 CPU 和内存资源。
一般来说,对于有着超过 50 个 OSD 的 RADOS 集群,建议每个 OSD 大约有 50-100 个PG 以平衡资源使用及取得更好的数据持久性和数据分布,而在更大的集群中,每个 OSD可以有 100-200 个 PG。
至于一个 pool 应该使用多少个 PG,可以通过下面的公式计算后,将 pool 的 PG 值四舍五入到最近的 2 的 N 次幂,如下先计算出 ceph 集群的总 PG 数:
Total OSDs * PGPerOSD/replication factor => total PGs
即:磁盘总数 x 每个磁盘 PG 数/副本数 => ceph 集群总 PG 数(略大于 2^n 次方)
官方的计算公式:
Total PGs = (Total_number_of_OSD * 100) / max_replication_count
单个 pool 的 PG 计算如下:
假设有 100 个 osd,3 副本,5 个 pool
Total PGs =100*100/3=3333
每个 pool 的 PG=3333/5=512,那么创建 pool 的时候就指定 pg 为 512
需要结合数据数量、磁盘数量及磁盘空间计算出 PG 数量,8、16、32、64、128、256等 2 的 N 次方。
一个 RADOS 集群上会存在多个存储池,因此管理员还需要考虑所有存储池上的 PG 分布后每个 OSD 需要映射的 PG 数量。
另外,如果创建存储池时,指定的PG和PGP不是2的整数次方,虽然会创建成功,但会出现告警:
假设创建存储池时的命令如下:
$ ceph osd pool create testpoo2 60 60 #PG和PGP都不是2的整数次方
$ ceph osd pool create testpoo3 40 30
$ ceph osd pool create testpoo4 45 45
会出现以下告警
因此在创建存储池时指定的PG和PGP要是2的整数次方,如8、16、32、64、128、256等 2 的 N 次方。
4.7 PG的状态
PG 的常见在状态如下:
4.7.1 Peering
正在同步状态,同一个 PG 中的 OSD 需要将准备数据同步一致,而 Peering(对等)就是 OSD同步过程中的状态。
4.7.2 Activating
Peering 已经完成,PG 正在等待所有 PG 实例同步 Peering 的结果(Info、Log 等)
4.7.3 Clean
干净态,PG 当前不存在待修复的对象,并且大小等于存储池的副本数,即 PG 的活动集(Acting Set)和上行集(Up Set)为同一组 OSD 且内容一致。
活动集(Acting Set):由 PG 当前主的 OSD 和其余处于活动状态的备用 OSD 组成,当前 PG内的 OSD 负责处理用户的读写请求。
上行集(Up Set):在某一个 OSD 故障时,需要将故障的 OSD 更换为可用的 OSD,并主 PG内部的主 OSD 同步数据到新的 OSD 上,例如 PG 内有 OSD1、OSD2、OSD3,当 OSD3故障后需要用 OSD4 替换 OSD3,那么 OSD1、OSD2、OSD3 就是上行集,替换后 OSD1、OSD2、OSD4 就是 活动集,OSD 替换完成后活动集最终要替换上行集。
4.7.4 Active
就绪状态或活跃状态,Active 表示主 OSD 和备 OSD 处于正常工作状态,此时的 PG 可以正常处理来自客户端的读写请求,正常的 PG 默认就是 Active+Clean 状态。
使用以下命令查看ceph状态:
ceph@ceph-deploy:/home/ceph/ceph-cluster$ ceph pg stat
129 pgs: 129 active+clean; 319 KiB data, 1.1 GiB used, 2.0 TiB / 2.0 TiB avail
4.7.5 Degraded:降级状态
降级状态出现于 OSD 被标记为 down 以后,那么其他映射到此 OSD 的 PG 都会转换到降级状态。
如果此 OSD 还能重新启动完成并完成 Peering 操作后,那么使用此 OSD 的 PG 将重新恢复为 clean 状态。
如果此 OSD 被标记为 down 的时间超过 5 分钟还没有修复,那么此 OSD 将会被 ceph 踢出集群,然后 ceph 会对被降级的 PG 启动恢复操作,直到所有由于此 OSD 而被降级的 PG重新恢复为 clean 状态。
恢复数据会从 PG 内的主 OSD 恢复,如果是主 OSD 故障,那么会在剩下的两个备用 OSD重新选择一个作为主 OSD。
4.7.6 Stale:过期状态
正常状态下,每个主 OSD 都要周期性的向 RADOS 集群中的监视器(Mon)报告其作为主 OSD所持有的所有 PG 的最新统计数据,因任何原因导致某个 OSD 无法正常向监视器发送汇报信息的、或者由其他 OSD 报告某个 OSD 已经 down 的时候,则所有以此 OSD 为主 PG 则会立即被标记为 stale 状态,即他们的主 OSD 已经不是最新的数据了,如果是备份的 OSD发送 down 的时候,则 ceph 会执行修复而不会触发 PG 状态转换为 stale 状态。
4.7.7 undersized
PG 当前副本数小于其存储池定义的值的时候,PG 会转换为 undersized 状态,比如两个备份 OSD 都 down 了,那么此时 PG 中就只有一个主 OSD 了,不符合 ceph 最少要求一个主 OSD 加一个备 OSD 的要求,那么就会导致使用此 OSD 的 PG 转换为 undersized 状态,直到添加备份 OSD 添加完成,或者修复完成。
4.7.8 Scrubbing
scrub 是 ceph 对数据的清洗状态,用来保证数据完整性的机制,Ceph 的 OSD 定期启动 scrub 线程来扫描部分对象,通过与其他副本比对来发现是否一致,如果存在不一致,抛出异常提示用户手动解决,scrub 以 PG 为单位,对于每一个 pg,ceph 分析该 pg 下所有的 object, 产生一个类似于元数据信息摘要的数据结构scrubmap,如对象大小、属性等,它会比较主OSD与副OSD的 scrubmap,来保证是不是有 object 丢失或者不匹配,扫描分为轻量级扫描和深度扫描,轻量级扫描也叫做 light scrubs 或者 shallow scrubs 或者 simply scrubs 即轻量级扫描。
Light scrub(daily)比较 object size 和属性,deep scrub (weekly)读取数据部分并通过checksum(CRC32 算 法 ) 对 比 和 数 据 的 一 致 性 , 深 度 扫 描 过 程 中 的 PG 会 处 于scrubbing+deep 状态。
4.7.9 Recovering
正在恢复态,集群正在执行迁移或同步对象和他们的副本,这可能是由于添加了一个新的OSD 到集群中或者某个 OSD 宕掉后,PG 可能会被 CRUSH 算法重新分配不同的 OSD,而由于 OSD 更换导致 PG 发生内部数据同步的过程中的 PG 会被标记为 Recovering。
4.7.10 Backfilling
正在后台填充态,backfill 是 recovery 的一种特殊场景,指 peering 完成后,如果基于当前权威日志无法对 Up Set(上行集)当中的某些 PG 实例实施增量同步(例如承载这些 PG 实例的 OSD 离线太久,或者是新的 OSD 加入集群导致的 PG 实例整体迁移) 则通过完全拷贝当前 Primary 所有对象的方式进行全量同步,此过程中的 PG 会处于 backfilling。
4.7.11 Backfill-toofull
某个需要被 Backfill 的 PG 实例,其所在的 OSD 可用空间不足,Backfill 流程当前被挂起时PG 给的状态。
4.8 数据读写流程
ceph 读写对象的时候,客户端从 ceph 监视器检索出集群运行图(cluster map),然后客户端访问指定的存储池,并对存储池内 PG 的对象执行读写操作。
存储池的 CRUSH 计算结果和 PG 的数量,是决定 ceph 如何放置数据的关键因素。基于集群的最新运行图,客户端能够了解到集群中的所有监视器和 OSD 以及他们各自当前的状态。
但是客户端仍然不知道对象的保存位置。
客户端在读写对象时,需要提供的是对象标识和存储池名称。
客户端需要在存储池中读写对象时,需要客户端将对象名称、对象名称的 hash 码、存储池中的 PG 数量和存储池名称作为输入信息提供给 ceph,然后由 CRUSH 计算出 PG 的 ID 以及此 PG 针对的主 OSD 即可读写 OSD 中的对象。
具体写操作如下:(数据读写过程可参考2.7章节-文件存储过程)
1、APP 向 ceph 客户端发送对某个对象的请求,此请求包含对象和存储池,然后 ceph 客户端对访问的对象做 hash 计算,并根据此 hash 值计算出对象所在的 PG,完成对象从 Pool至 PG 的映射。
APP 访问 pool ID 和 object ID (比如 pool = pool1,object-id = “name1”)
(1)ceph client 对 objectID 做哈希
ceph client 对hash 值和PG数的二进制(假设有64个pg,即0~63,则63的二进制为0111111)进行与运算,得到 PG 编号(假设为32),(第 2 和第 3 步基本保证了一个 pool 内部的所有 PG 将会被均匀地使用)
(2)ceph client 对 pool ID 取 hash(比如 “pool1” = 3)
(3)ceph client 将 pool ID 和 PG ID 组合在一起(比如 3.32)得到 PG 的完整 ID。
2、然后客户端据 PG、CRUSH 运行图和归置组(placement rules)作为输入参数并再次进行计算,并计算出对象所在的 PG 内的主 OSD ,从而完成对象从 PG 到 OSD 的映射。
Ceph client 从 MON 获取最新的 cluster map。
Ceph client 根据上面的第(2)步计算出该 object 将要在的 PG 的 ID。
Ceph client 再根据 CRUSH 算法计算出 PG 中目标主和备 OSD 的 ID,即可对 OSD 的数据进行读写。
3、客户端开始对主 OSD 进行读写请求(副本池 IO),如果发生了写操作,会有 ceph 服务端完成对象从主 OSD 到备份 OSD 的同步。
4.9 存储池操作
存储池的管理通常包括创建、列出、重命名和删除等操作,管理工具使用 ceph osd pool的子命令及参数,比如 create/ls/rename/rm 等。
4.9.1 常用命令
创建存储池命令格式:
$ceph osd pool create <poolname> pg_num pgp_num {replicated|erasure} #如果不指定任何类型{replicated|erasure},则默认为存储池,创建纠删码池时则要指定erasure
列出存储池:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool ls
查看存储池详细信息
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool ls detail
查看存储池(带有ID)
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd lspools
获取存储池的事件信息:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool stats mypool
重命名存储池:
$ ceph osd pool rename old-name new-name
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool rename erasure-testpool erasure-testpool-new #将纠删码池重命名
显示存储池的用量信息:
$ rados df
4.9.2 存储池的删除
如果把存储池删除会导致把存储池内的数据全部删除,因此 ceph 为了防止误删除存储池设置了两个机制来防止误删除操作。
4.9.2.1 存储池防误删机制
1、机制一:
第一个机制是 NODELETE 标志,需要设置为 false,但是一般情况下该配置默认就是 false
创建一个测试pool:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool create mypool2 32 32。
获取ceph集群当前NODELETE配置
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool get mypool2 nodelete #该配置默认为false,即第一个机制默认允许删除存储池
如果设置为 true 就表示不能删除存储池,可以使用 set 指令重新设置为 fasle,命令如下:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool set mypool2 nodelete true #设置为true
将该配置恢复为默认
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool set mypool2 nodelete false
2、机制二:
第二个机制是集群范围的配置参数 mon allow pool delete,默认值为 false,即监视器不允许删除存储池,可以在特定场合使用 tell 指令临时设置为(true)允许删除,在删除指定的 pool之后再重新设置为 false。
配置监视器允许删除存储池:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph tell mon.* injectargs --mon-allow-pool-delete=true
4.9.2.2 删除存储
1、删除存储池:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool rm mypool2 mypool2 --yes-i-really-really-mean-it #注意删除命令里面要写两次存储池名称,并添加--yes-i-really-really-mean-it选项
2、删除后将误删除机制恢复默认,防止其他人误删除
恢复机制二中的防误删除机制
cephadmin@ceph-deploy:~/ceph-cluster$ ceph tell mon.* injectargs --mon-allow-pool-delete=false
4.9.3 存储池配额
存储池可以设置两个配额,对存储的对象进行限制,一个配额是最大空间(max_bytes),另外一个配额是对象最大数量(max_objects)。
1、获取配额默认配置(默认情况下,两个配合均未做限制)
ceph osd pool get-quota mypool
2、修改对象最大值配额:
ceph osd pool set-quota mypool max_objects 1000
修改后查看配额:
3、修改最大空间的值配额:
ceph osd pool set-quota mypool max_bytes 5368709120 #修改存储池mypool最大空间为5G
查看mypool最大空间配额
4.9.4 存储池可用参数
size:存储池中的对象副本数,默认一主两个备 3 副本。
获取存储池副本数:
ceph osd pool get mypool size
修改存储池副本数
ceph osd pool set mypool size 4 #将存储池副本数由3个修改为4个。
注意:增加副本数的操作将会触发ceph集群的数据同步,因此除非必要,不推荐做这种操作
获取存储池最小副本数
ceph osd pool get mypool min_size
注意:
min_size:提供服务所需要的最小副本数,如果定义 size 为 3,min_size 也为 3,当坏掉一个OSD,而且pool 池中有副本在此块 OSD 上面,那么此 pool 将不提供服务;如果将 min_size定义为 2,当坏掉一个OSD,那么还可以提供服务;如果将 min_size定义为 1,表示只要有一块副本都提供服务。
如果ceph集群中三个OSD中坏掉两个,且min_size设置为2,此时OSD将不提供服务。如果此时想要紧急恢复业务,让OSD提供服务,且对数据进行备份,就需要将min_size设置为1。
查看当前 PG 的数量
ceph osd pool get mypool pg_num
修改PG数量
ceph osd pool set mypool pg_num 64 #将PG数量由32修改为64
注意:增加PG的操作会触发数据的重新分配,数据会重新同步,因此除非必要,不推荐做这种操作
crush_rule:设置 crush 算法规则
ceph osd pool get mypool crush_rule
crush_rule: replicated_rule #默认为副本池
nodelete:控制是否可删除,默认可以
ceph osd pool get mypool nodelete
nodelete: false
nopgchange:控制是否可更改存储池的 pg num 和 pgp num
ceph osd pool get mypool nopgchange
nopgchange: false
ceph osd pool set mypool pg_num 64 #修改指定 pool 的 pg 数量
nosizechange:控制是否可以更改存储池的大小
ceph osd pool get mypool nosizechange
nosizechange: false #默认允许修改存储池大小
ceph osd pool get-quota mypool #查看存储池最大空间和对象最大数量配额
ceph osd pool set-quota mypool max_bytes 21474836480 #修改存储池最大空间为20G
ceph osd pool set-quota mypool max_objects 1000 #修改对象最大数量为1000
noscrub 和 nodeep-scrub:控制是否不进行轻量扫描或是否深层扫描存储池,可临时解决高 I/O 问题
ceph osd pool get mypool noscrub
noscrub: false #查看当前是否关闭轻量扫描数据,默认为不关闭,即开启
ceph osd pool set mypool noscrub true #可以修改某个指定的 pool 的轻量级扫描测量为 true,即不执
行轻量级扫描
注意:当业务高峰期时,可临时关闭扫描,降低磁盘压力,业务高峰期过去以后,将扫描开启,如果不开启,会存在数据不一致的风险
ceph osd pool get mypool nodeep-scrub #查看当前是否关闭深度扫描数据,默认为不关闭,即开启
nodeep-scrub: false
ceph osd pool set mypool nodeep-scrub true #可以修改某个指定的 pool 的深度扫描测量为 true,即不执行深度扫描
注意:当业务高峰期时,可临时关闭扫描,降低磁盘压力,业务高峰期过去以后,将扫描开启,如果不开启,会存在数据不一致的风险
scrub_min_interval:集群存储池的最小清理时间间隔,默认值没有设置,可以通过配置文件中的 osd_scrub_min_interval 参数指定间隔时间。
ceph osd pool get mypool scrub_min_interval
scrub_max_interval:整理存储池的最大清理时间间隔,默认值没有设置,可以通过配置文件中的 osd_scrub_max_interval 参数指定。
ceph osd pool get mypool scrub_max_interval
deep_scrub_interval:深层整理存储池的时间间隔,默认值没有设置,可以通过配置文件中的 osd_deep_scrub_interval 参数指定。
ceph osd pool get mypool deep_scrub_interval
ceph node 的默认配置:
root@ceph-node1:~# ll /var/run/ceph/
root@ceph-node1:~# ceph daemon osd.2 config show | grep scrub
"mds_max_scrub_ops_in_progress": "5",
"mon_scrub_inject_crc_mismatch": "0.000000",
"mon_scrub_inject_missing_keys": "0.000000",
"mon_scrub_interval": "86400",
"mon_scrub_max_keys": "100",
"mon_scrub_timeout": "300",
"mon_warn_pg_not_deep_scrubbed_ratio": "0.750000",
"mon_warn_pg_not_scrubbed_ratio": "0.500000",
"osd_debug_deep_scrub_sleep": "0.000000",
"osd_deep_scrub_interval": "604800.000000", #定义深度清洗间隔,604800 秒=7天
"osd_deep_scrub_keys": "1024",
"osd_deep_scrub_large_omap_object_key_threshold": "200000",
"osd_deep_scrub_large_omap_object_value_sum_threshold": "1073741824",
"osd_deep_scrub_randomize_ratio": "0.150000",
"osd_deep_scrub_stride": "524288",
"osd_deep_scrub_update_digest_min_age": "7200",
"osd_max_scrubs": "1", #定义一个 ceph OSD daemon 内能够同时进行 scrubbing的操作数
"osd_requested_scrub_priority": "120",
"osd_scrub_auto_repair": "false",
"osd_scrub_auto_repair_num_errors": "5",
"osd_scrub_backoff_ratio": "0.660000",
"osd_scrub_begin_hour": "0",
"osd_scrub_begin_week_day": "0",
"osd_scrub_chunk_max": "25",
"osd_scrub_chunk_min": "5",
"osd_scrub_cost": "52428800",
"osd_scrub_during_recovery": "false",
"osd_scrub_end_hour": "0",
"osd_scrub_end_week_day": "0",
"osd_scrub_extended_sleep": "0.000000",
"osd_scrub_interval_randomize_ratio": "0.500000",
"osd_scrub_invalid_stats": "true", #定义 scrub 是否有效
"osd_scrub_load_threshold": "0.500000",
"osd_scrub_max_interval": "604800.000000", #定义最大执行 scrub 间隔,604800秒=7天
"osd_scrub_max_preemptions": "5",
"osd_scrub_min_interval": "86400.000000", # #定义最小执行普通 scrub 间隔,86400秒=1天
"osd_scrub_priority": "5",
"osd_scrub_sleep": "0.000000",
注意:以上参数仅针对osd,可以通过命令进行修改(在管理节点deploy上修改),命令如下:
查询:ceph osd pool get mypool ${参数}
修改:ceph osd pool set mypool ${参数} = ${值}
也可以在ceph.conf文件[osd]的专用配置项进行修改,修改完成后在管理节点把配置文件分发给各node节点,然后在node节点上重启各自node服务
4.10 存储池快照
快照用于读存储池中的数据进行备份与还原,创建快照需要占用的磁盘空间会比较大,取决于存储池中的数据大小,使用以下命令创建快照
4.10.1 创建快照
创建快照可以使用两种方式:
命令格式1:ceph osd pool mksnap {pool-name} {snap-name}
创建快照:
ceph osd pool mksnap mypool mypool-snap
命令格式2:rados -p {pool-name} mksnap {snap-name}
rados -p mypool mksnap mypool-snap2
4.10.2 验证快照
查看快照:
rados lssnap -p mypool
4.10.3 回滚快照
测试上传文件后创建快照,然后删除文件再还原文件,基于对象还原。
回滚快照命令格式:
rados rollback <obj-name> <snap-name> roll back object to snap <snap-name>
1、上传文件
cephadmin@ceph-deploy:~/ceph-cluster$ rados -p mypool put testfile /etc/hosts
查看文件
cephadmin@ceph-deploy:~/ceph-cluster$ rados -p mypool ls
2、创建快照
cephadmin@ceph-deploy:~/ceph-cluster$ ceph osd pool mksnap mypool mypool-snapshot001
查看快照
cephadmin@ceph-deploy:~/ceph-cluster$ rados lssnap -p mypool
3、删除文件
cephadmin@ceph-deploy:~/ceph-cluster$ rados -p mypool rm testfile
文件删除后,再次执行删除命令,提示文件不存在,说明文件已经被删除
4、通过快照恢复文件(注意:这种方式只能通过快照文件恢复)
cephadmin@ceph-deploy:~/ceph-cluster$ rados rollback -p mypool testfile mypool-snapshot001
5、再次执行删除命令,可以正常删除,没有报错,说明通过快照成功恢复文件
4.10.4 删除快照
命令格式:
ceph osd pool rmsnap <poolname> <snap>
查看快照:
cephadmin@ceph-deploy:~/ceph-cluster$ rados lssnap -p mypool
删除快照:
ceph osd pool rmsnap mypool mypool-snap
再次查看快照,删除成功
4.11 数据压缩
开启数据压缩会占用cpu资源,因此不建议开启。
如果使用 bulestore 存储引擎,ceph 支持称为”实时数据压缩”即边压缩边保存数据的功能,该功能有助于节省磁盘空间,可以在 BlueStore OSD 上创建的每个 Ceph 池上启用或禁用压缩,以节约磁盘空间,默认没有开启压缩,需要后期配置并开启。
4.11.1 启用压缩并指定压缩算法
命令格式:
ceph osd pool set <pool name> compression_algorithm snappy #默认算法为 snappy
snappy:该配置为指定压缩使用的算法默认为 sanppy,还有 none、zlib、lz4、zstd 和 snappy等算法,zstd 压缩比好,但消耗 CPU,lz4 和 snappy 对 CPU 占用较低,不建议使用 zlib。
4.11.2 指定压缩模式
命令格式:
ceph osd pool set <pool name> compression_mode aggressive
aggressive:压缩的模式,有 none、aggressive、passive 和 force,默认 none。
none:从不压缩数据。
passive:除非写操作具有可压缩的提示集,否则不要压缩数据。
aggressive:压缩数据,除非写操作具有不可压缩的提示集。
force:无论如何都尝试压缩数据,即使客户端暗示数据不可压缩也会压缩,也就是在所有情况下都使用压缩。
存储池压缩设置参数:
compression_algorithm #压缩算法
compression_mode #压缩模式
compression_required_ratio #压缩后与压缩前的压缩比,默认为.875
compression_max_blob_size: #大于此的块在被压缩之前被分解成更小的 blob(块),此设置将覆盖 bluestore 压缩 max blob*的全局设置。
compression_min_blob_size:#小于此的块不压缩, 此设置将覆盖 bluestore 压缩 min blob*的全局设置。
全局压缩选项,这些可以配置到 ceph.conf 配置文件,作用于所有存储池:
bluestore_compression_algorithm #压缩算法
bluestore_compression_mode #压缩模式
bluestore_compression_required_ratio #压缩后与压缩前的压缩比,默认为.875
bluestore_compression_min_blob_size #小于它的块不会被压缩,默认 0
bluestore_compression_max_blob_size #大于它的块在压缩前会被拆成更小的块,默认 0
bluestore_compression_min_blob_size_ssd #默认 8k
bluestore_compression_max_blob_size_ssd #默认 64k
bluestore_compression_min_blob_size_hdd #默认 128k
bluestore_compression_max_blob_size_hdd #默认 512k
修改压缩算法
[ceph@ceph-deploy ~]$ ceph osd pool set mypool compression_algorithm snappy #设置为snappy压缩算法
[ceph@ceph-deploy ~]$ ceph osd pool get mypool compression_algorithm #查看当前压缩算法
修改压缩模式:
[ceph@ceph-deploy ~]$ ceph osd pool set mypool compression_mode passive #设置为passive压缩模式
[ceph@ceph-deploy ~]$ ceph osd pool get mypool compression_mode #查看当前压缩模式
文章评论