一.资源池 Pool 管理
我们已经完成了 Ceph 集群的部署,但是我们如何向 Ceph 中存储数据呢?首先我们需要在 Ceph
中定义一个 Pool 资源池。Pool 是 Ceph 中存储 Object 对象抽象概念。我们可以将其理解为 Ceph
存储上划分的逻辑分区,Pool 由多个 PG 组成;而 PG 通过 CRUSH 算法映射到不同的 OSD 上;
同时 Pool 可以设置副本 size 大小,默认副本数量为 3。
Ceph 客户端向 monitor 请求集群的状态,并向 Pool 中写入数据,数据根据 PGs 的数量,通过
CRUSH 算法将其映射到不同的 OSD 节点上,实现数据的存储。 这里我们可以把 Pool 理解为存
储 Object 数据的逻辑单元;当然,当前集群没有资源池,因此需要进行定义。
PG (Placement Group),pg 是一个虚拟的概念,用于存放 object,PGP(Placement Group for
Placement purpose),相当于是 pg 存放的一种 osd 排列组合。
1.创建一个 Pool 资源池
其名字为 mypool,PGs 数量设置为 64,设置 PGs 的同时还需要设置,PGP(通常PGs和PGP的值是相同的)
cd /etc/ceph
ceph osd pool create mypool 64 64
2.查看集群 Pool 信息
ceph osd pool ls 或
rados lspools 或
ceph osd lspools
3.查看资源池副本的数量(默认3)
ceph osd pool get mypool size
4.查看 PG 和 PGP 数量
ceph osd pool get mypool pg_num
ceph osd pool get mypool pgp_num
5.修改 pg_num 和 pgp_num 的数量为 n
ceph osd pool set mypool pg_num 128
ceph osd pool set mypool pgp_num 128
6.修改 Pool 副本数量
ceph osd pool set mypool size n
7.修改默认副本数为 2
(1)修改配置文件 ceph.conf
vim ceph.conf
......
osd_pool_default_size = 2
(2)推送 ceph.conf 配置文件给所有 mon 节点
ceph-deploy --overwrite-conf config push node01 node02 node03
(3)所有 mon 节点重启 ceph-mon 服务
systemctl restart ceph-mon.target
8.删除 Pool 资源池
(1)删除存储池命令存在数据丢失的风险,Ceph 默认禁止此类操作,需要管理员先在 ceph.conf
配置文件中开启支持删除存储池的操作
cd /etc/ceph
vim ceph.conf
......
[mon]
mon_allow_pool_delete = true
(2)推送 ceph.conf 配置文件给所有 mon 节点
ceph-deploy --overwrite-conf config push node01 node02 node03
(3)所有 mon 节点重启 ceph-mon 服务
systemctl restart ceph-mon.target
(4)执行删除 Pool 命令
ceph osd pool rm pool01 pool01 --yes-i-really-really-mean-it
拓展:一个Pool应该包含多少PG数?
OSD总数 小于 5 个,官方推荐 PG数 为 128
5 ~ 10 个,官方推荐 PG数 为 512
10 ~ 50 个,官方推荐 PG数 为 1024
大于 50 个,参考公式 PG数=( Target PGs per OSD ) x ( OSD # ) x ( %Data ) / ( Size )Target PGs per OSD :表示每个OSD对应的PG数(如近期不扩容OSD数量可设置为100,如近期要扩容OSD数量可设置为200)
OSD # :表示当前OSD总数
%Data :当前Pool预计会占用Ceph总存储空间的百分比
Size :当前Pool的副本数
举例:现有新建的Ceph集群,OSD不扩容,共60个OSD,Pool占用总空间50%,3个副本: 100 x 60 x 50% / 3 = 1000 -> 取最接近2的次方值 1024
二.CephFS 文件系统存储服务
1.服务端操作
(1)在管理节点创建 mds 服务
cd /etc/ceph/
ceph-deploy mds create mode01 node02 node03
(2)查看各个节点的 mds 服务
ssh root@node01 systemctl status ceph-mds@node01
ssh root@node02 systemctl status ceph-mds@node02
ssh root@node03 systemctl status ceph-mds@node03
(3)创建存储池,启用 ceph 文件系统
ceph 文件系统至少需要两个 rados 池,一个用于存储数据,一个用于存储元数据。此时数据池就类似于文件系统的共享目录。
ceph osd pool create cephfs_data 128 #创建数据Pool
ceph osd pool create cephfs_metadata 128 #创建元数据Pool
#创建 cephfs,
命令格式:ceph fs new <FS_NAME> <CEPHFS_METADATA_NAME> <CEPHFS_DATA_NAME>
ceph fs new mycephfs cephfs_metadata cephfs_data #启用ceph,元数据Pool在前,数据Pool在后
ceph fs ls #查看cephfs
ceph fs status mycephfs
总共180个G内存,为什么只有80个G可用;
原因是有两个副本文件,数据保存要有两份,所以总空间要除以二
(4)查看mds状态,一个up,其余两个待命,目前的工作的是node01上的mds服务
ceph -s
ceph mds stat
(5)创建用户 CephFS
语法格式:
ceph fs authorize <fs_name> client.<client_id> <path-in-cephfs> rw
举例:
账户为 client.lxp,用户 name 为 lxp,lxp 对ceph文件系统的 / 根目录(注意不是操作系统的根目录)有读写权限
ceph fs authorize mycephfs client.lxp / rw | tee /etc/ceph/lxp.keyring
账户为 client.lisi,用户 name 为 lisi,lisi 对文件系统的 / 根目录只有读权限,
ceph fs authorize mycephfs client.lisi / r | tee /etc/ceph/lisi.keyring
2.客户端操作
(1)客户端要在 public 网络内
(2)在客户端创建工作目录
mkdir /etc/ceph
(3)在 ceph 的管理节点给客户端拷贝账号的秘钥环文件
scp lxp.keyring lisi.keyring client:/etc/ceph/
(4)在客户端安装 ceph 软件包
cd /opt
wget https://download.ceph.com/rpm-nautilus/el7/noarch/ceph-release-1-1.el7.noarch.rpm --no-check-certificate
rpm -ivh ceph-release-1-1.el7.noarch.rpm
yum install -y ceph
(5)在客户端制作秘钥文件
cd /etc/ceph
ceph-authtool -n client.lxp -p lxp.keyring > lxp.key
#把 lxp 用户的秘钥导出到 lxp.key
ceph-authtool -n client.lisi -p lisi.keyring > lisi.key
#把 lisi 用户的秘钥导出到 lisi.key
(6)客户端挂载
方式一:基于内核
语法格式:
mount -t ceph node01:6789,node02:6789,node03:6789:/ <本地挂载点目录> -o name=<用户名>,secret=<秘钥>
mount -t ceph node01:6789,node02:6789,node03:6789:/ <本地挂载点目录> -o name=<用户名>,secretfile=<秘钥文件>
mount -t ceph node01:6789,node02:6789,node03:6789:/ /opt/lxp/ -o name=lxp,secretfile=lxp.key
lxp之后就可以进行数据的写入操作
mount -t ceph node01:6789,node02:6789,node03:6789:/ /opt/lisi/ -o name=lisi,secretfile=lisi.key
lisi只有读的权限,而没有写的权限
方式二:基于 fuse 工具(ceph的工具)
(1)在 ceph 的管理节点给客户端拷贝 ceph 的配置文件 ceph.conf 和管理员账号的秘钥环文件 ceph.client.admin.keyring
scp ceph.conf ceph.client.admin.keyring client:/etc/ceph/
(2)在客户端安装 ceph-fuse
yum install -y ceph-fuse
(3)客户端挂载
cd /opt/
mkdir data
cd /etc/ceph
ceph-fuse -m node01:6789,node02:6789,node03:6789 /opt/data/
挂载时,如果挂载点不为空会挂载失败,指定 -o nonempty 可以忽略
之后就可以进行数据的读写操作,这种方法不限制权限
三. Ceph 块存储系统 RBD 接口
1、创建一个名为 rbd-xy101 的专门用于 RBD 的存储池
ceph osd pool create RBD-Pool名 PG数据 #创建RBD存储用的Pool
ceph osd pool create rbd-xy101 64
rbd ls -l -p rbd-xy101
2、将存储池转换为 RBD 模式
ceph osd pool application enable RBD-Pool名 rbd #将Pool转换为RBD模式
ceph osd pool application enable rbd-xy101 rbd
3、初始化存储池
rbd pool init -p RBD-Pool名 #RBD初始化
rbd pool init -p rbd-xy101
4、创建镜像
rbd create -p RBD-Pool名 --image 镜像名 --size 镜像大小 #创建RBD镜像
rbd create RBD-Pool名/镜像名 --size 镜像大小
rbd create -p rbd-xy101 --image rbd-demo1.img --size 10G
5、镜像管理
(1)查看存储池下存在哪些镜像
rbd ls -l -p RBD-Pool名 #查看Pool中的镜像列表
rbd ls -l rbd-xy101
(2)查看镜像的详细信息
rbd info -p RBD-Pool名 --image 镜像名 #查看镜像的详细信息
rbd info -p rbd-xy101 --image rbd-demo1.img
rbd image 'rbd-demo.img':
size 10 GiB in 2560 objects
#镜像的大小与被分割成的条带数
order 22 (4 MiB objects)
#条带的编号,有效范围是12到25,对应4K到32M,而22代表2的22次方,这样刚好是4M
snapshot_count: 0
id: 5fc98fe1f304
#镜像的ID标识
block_name_prefix: rbd_data.5fc98fe1f304
#名称前缀
format: 2
#使用的镜像格式,默认为2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
#当前镜像的功能特性
op_features:
#可选的功能特性
flags:
(3)修改镜像大小
rbd resize -p rbd-xy101 --image rbd-demo1.img --size 20G
rbd info -p rbd-xy101 --image rbd-demo1.img
#使用 resize 调整镜像大小,一般建议只增不减;
如果是减少的话需要加选项 --allow-shrink;减的话可能会造成数据丢失
rbd resize -p rbd-xy101 --image rbd-demo1.img --size 5G --allow-shrink
(4)删除镜像
直接删除镜像
rbd rm|remove -p RBD-Pool名 --image 镜像名 #直接删除镜像
rbd rm -p rbd-xy101 --image rbd-demo1.img
rbd remove rbd-xy101/rbd-demo1.img
rbd rm rbd-xy101/rbd-demo1.img
推荐使用 trash 命令,这个命令删除是将镜像移动至回收站,如果想找回还可以恢复
rbd trash move -p RBD-Pool名 --image 镜像名 #临时删除镜像
rbd trash move rbd-xy101/rbd-demo1.img
rbd trash list -p RBD-Pool名 #查看被临时删除的镜像列表和镜像恢复ID
rbd trash list -p rbd-xy101
rbd trash restore RBD-Pool名/镜像恢复ID #恢复被临时删除的镜像
rbd trash restore rbd-xy101/2a95569660592
rbd ls -l rbd-xy101
6、Linux客户端使用
客户端使用 RBD 有两种方式:
- 通过内核模块KRBD将镜像映射为系统本地块设备,通常设置文件一般为:/dev/rbd*
- 另一种是通过librbd接口,通常KVM虚拟机使用这种接口。
本例主要是使用Linux客户端挂载RBD镜像为本地磁盘使用。开始之前需要在所需要客户端节点上面安装ceph-common软件包,因为客户端需要调用rbd命令将RBD镜像映射到本地当作一块普通硬盘使用。并还需要把ceph.conf配置文件和授权keyring文件复制到对应的节点。
(1)在管理节点创建并授权一个用户可访问指定的 RBD 存储池
ceph auth get-or-create client.<用户名> osd "allow * pool=<存储池名>" mon "allow r" > /etc/ceph/<用户名>.keyring
ceph auth get-or-create client.osd-mount osd "allow * pool=rbd-xy101" mon "allow r" > ceph.client.osd-mount.keyring
(2)修改RBD镜像特性
rbd feature disable rbd-xy101/rbd-demo1.img object-map, fast-diff, deep-flatten
(3)将用户的keyring文件和ceph.conf文件发送到客户端的/etc/ceph目录下
scp ceph.client.osd-mount.keyring ceph.conf client:/etc/ceph/
7、客户端操作
(1)安装 ceph-common 软件包
//linux客户端操作
#安装 ceph-common 软件包
yum install -y ceph-common
(2)执行客户端映射
语法格式
rbd map <存储池名>/<镜像名称> --keyring /etc/ceph/<用户名>.keyring --user <用户名>
rbd map rbd-xy101/rbd-demo1.img --keyring ceph.client.osd-mount.keyring --user osd-mount
(3)查看映射状态
rbd showmapped
rbd device list
(4)格式化并挂载
语法格式:
mkfs -t xfs /dev/rbd0 ##针对xfs文件系统
mkdir /opt/rbd/
mount /dev/rbd0 /opt/rbd/
umount /opt/rbd #解挂
rbd unmap rbd-xy101/rbd-demo1.img #取消映射
(5)在线扩容
在管理节点调整镜像的大小
rbd resize <存储池名>/<镜像名称> --size 20G
在客户端刷新设备文件(扩容镜像后在线刷新)
xfs_growfs /dev/rbd0 #刷新xfs文件系统容量
resize2fs /dev/rbd0 #刷新ext4类型文件系统容量
xfs_growfs /dev/rbd0
df -hT
8.快照管理
对 rbd 镜像进行快照,可以保留镜像的状态历史,另外还可以利用快照的分层技术,通过将快照克隆为新的镜像使用。
在管理节点对镜像创建快照
rbd snap create -p rbd-xy101 --image rbd-demo1.img --snap rbd-demo1.snap1
可简写为:
rbd snap create rbd-xy101/rbd-demo1.img@rbd-demo1.snap1
列出指定镜像所有快照
rbd snap list -p rbd-xy101 --image rbd-demo1.img
#用json格式输出:
rbd snap list rbd-demo/rbd-demo1.img --format json --pretty-format
回滚镜像到指定
在回滚快照之前,需要将镜像取消镜像的映射,然后再回滚。
#在客户端操作 取消映射
rm -rf /opt/rbd/*
umount /opt/rbd
rbd unmap rbd-xy101/rbd-demo1.img#在管理节点操作
rbd snap rollback rbd-xy101/rbd-demo1.img@rbd-demo1.snap1
rbd snap rollback <存储池名>/<镜像名称>@<快照名称>
#在客户端重新映射并挂载
rbd map rbd-xy101/rbd-demo1.img --keyring ceph.client.osd-mount.keyring --user osd-mount
mount /dev/rbd0 /opt/rbd/
ls /opt/rbd #发现数据还原回来了
限制镜像可创建快照数
rbd snap limit set rbd-xy101/rbd-demo1.img --limit 3
解除限制
rbd snap limit clear rbd-xy101/rbd-demo1.img
删除快照
#删除指定快照:
rbd snap rm rbd-xy101/rbd-demo1.img@demo1_snap1
#删除所有快照:
rbd snap purge rbd-xy101/rbd-demo1.img
9.快照分层
快照分层支持用快照的克隆生成新镜像,这种镜像与直接创建的镜像几乎完全一样,支持镜像的所有操作。唯一不同的是克隆镜像引用了一个只读的上游快照,而且此快照必须要设置保护模式。
快照克隆
1)将上游快照设置为保护模式:rbd snap protect rbd-xy101/rbd-demo1.img@rbd-demo1.snap666
2)克隆快照为新的镜像rbd clone rbd-xy101/rbd-demo1.img@rbd-demo1.snap666 --dest rbd-xy101/rbd-demo666.img
rbd ls -l -p rbd-xy101 #查看
3)命令查看克隆完成后快照的子镜像
rbd children myrbd/demon1.img@666.snap1
10.快照展平
通常情况下通过快照克隆而得到的镜像会保留对父快照的引用,这时候不可以删除该父快照,否则会有影响。
rbd snap rm rbd-xy101/rbd-demo1.img@rbd-demo1.snap666
#报错 snapshot '666.snap1' is protected from removal.
如果要删除快照但想保留其子镜像,必须先展平其子镜像,展平的时间取决于镜像的大小
1) 展平子镜像rbd flatten rbd-xy101/rbd-demo666.img
2)取消快照保护
rbd snap unprotect rbd-xy101/rbd-demo1.img@rbd-demo1.snap666
3)删除快照
rbd snap rm rbd-xy101/rbd-demo1.img@rbd-demo1.snap666
rbd ls -l -p rbd-demo #在删除掉快照后,查看子镜像依然存在
11.镜像导入导出
(1)导出镜像
rbd export rbd-xy101/rbd-demo666.img /opt/rbd-demo666.img
(2)导入镜像
client节点
#取消挂载、映射
umount /opt/rbd
rbd unmap rbd-xy101/rbd-demo1.img
admin节点
#清除镜像下的所有快照,并删除镜像
rbd snap rm rbd-xy101/rbd-demo1.img --snap rbd-demo1.snap1 #删除快照
rbd rm rbd-xy101/rbd-demo1.img
rbd rm rbd-xy101/rbd-demo666.img #删除镜像
#导入镜像
rbd import /opt/rbd-demo666.img rbd-xy101/rbd-demo666.img
rbd ls -l -p rbd-xy101
admin节点
CentOS7默认情况下只支持layering和striping特性,需要将其它的特性关闭
bd feature disable rbd-xy101/rbd-demo666.img object-map, fast-diff, deep-flatten
rbd info rbd-xy101/rbd-demo666.img #查看镜像详细情况
client节点重新做映射、挂载
rbd map rbd-xy101/rbd-demo666.img --keyring ceph.client.osd-mount.keyring --user osd-mount
rbd showmapped #查看
mount /dev/rbd0 /opt/rbd/
ls /opt/rbd