我们已经完成了 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 排列组合。
其名字为 mypool,PGs 数量设置为 64,设置 PGs 的同时还需要设置,PGP(通常PGs和PGP的值是相同的)
cd /etc/ceph ceph osd pool create mypool 64 64
ceph osd pool ls 或 rados lspools 或 ceph osd lspools
ceph osd pool get mypool size
ceph osd pool get mypool pg_num ceph osd pool get mypool pgp_num
ceph osd pool set mypool pg_num 128 ceph osd pool set mypool pgp_num 128
ceph osd pool set mypool size n
(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
(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
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
cd /etc/ceph/ ceph-deploy mds create mode01 node02 node03
ssh root@node01 systemctl status ceph-mds@node01 ssh root@node02 systemctl status ceph-mds@node02 ssh root@node03 systemctl status ceph-mds@node03
ceph 文件系统至少需要两个 rados 池,一个用于存储数据,一个用于存储元数据。此时数据池就类似于文件系统的共享目录。
ceph osd pool create cephfs_data 128 #创建数据Pool ceph osd pool create cephfs_metadata 128 #创建元数据Pool #创建 cephfs, 命令格式:ceph fs new
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
语法格式: ceph fs authorize client. 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
mkdir /etc/ceph
scp lxp.keyring lisi.keyring client:/etc/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
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
方式一:基于内核
语法格式: 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的工具)
scp ceph.conf ceph.client.admin.keyring client:/etc/ceph/
yum install -y ceph-fuse
cd /opt/ mkdir data cd /etc/ceph ceph-fuse -m node01:6789,node02:6789,node03:6789 /opt/data/
挂载时,如果挂载点不为空会挂载失败,指定 -o nonempty 可以忽略
之后就可以进行数据的读写操作,这种方法不限制权限
ceph osd pool create RBD-Pool名 PG数据 #创建RBD存储用的Pool ceph osd pool create rbd-xy101 64
rbd ls -l -p rbd-xy101
ceph osd pool application enable RBD-Pool名 rbd #将Pool转换为RBD模式 ceph osd pool application enable rbd-xy101 rbd
rbd pool init -p RBD-Pool名 #RBD初始化 rbd pool init -p rbd-xy101
rbd create -p RBD-Pool名 --image 镜像名 --size 镜像大小 #创建RBD镜像 rbd create RBD-Pool名/镜像名 --size 镜像大小 rbd create -p rbd-xy101 --image rbd-demo1.img --size 10G
(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
客户端使用 RBD 有两种方式:
本例主要是使用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/
(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
对 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
快照分层支持用快照的克隆生成新镜像,这种镜像与直接创建的镜像几乎完全一样,支持镜像的所有操作。唯一不同的是克隆镜像引用了一个只读的上游快照,而且此快照必须要设置保护模式。
快照克隆
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
通常情况下通过快照克隆而得到的镜像会保留对父快照的引用,这时候不可以删除该父快照,否则会有影响。
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 #在删除掉快照后,查看子镜像依然存在
(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