Ceph 实战:RBD 块存储与 CephFS 文件系统

概览:在上一篇搭好的 Nautilus 集群上把存储真正用起来

RBD 创建 / 映射 / 挂载 / 扩容 → 集群告警处理 → CephFS 部署与两种挂载方式

RBD 块存储

块存储是存储区域网络中使用的一个数据存储类型。在这种类型中,数据以块的形式存储在卷里,卷会挂载到节点上。可以为应用程序提供更大的存储容量,并且可靠性和性能都更高。

RBD协议,也就是Ceph块设备 (Ceph Block Device)。RBD除了可靠性和性能之外,还支持完整和增量式快照,精简的配置,写时复制(copy-on-write)式克隆。并且支持全内存式缓存。

目前CEPH RBD支持的最大镜像为16EB,镜像可以直接作为磁盘映射到物理裸机,虚拟机或者其他主机使用,KVM和Xen完全支持RBD,VMware等云厂商也支持RBD模式

1,创建资源池Pool

1
2
3
4
5
ceph osd pool create fengqing 64 64
#fengqing 为 pool 名称
#pg为64个 (pg和pgp数量需要一致)
#pgp为64个
#我们不需要指定副本,默认就为三个副本

2,查看pool池

1
ceph osd lspools

image-20220512135926490

1
2
3
4
ceph osd pool get fengqing pg_num
ceph osd pool get fengqing pgp_num
ceph osd pool get fengqing
#查看到pool详细状态

image-20220512140111435

3,查看副本数量

1
2
3
4
5
6
7
[root@ceph01 ceph-deploy]# ceph osd pool get fengqing size
size: 3
#副本数量可以修改的,比如我们修改一下osd副本数量
[root@ceph01 ceph-deploy]# ceph osd pool set fengqing size 2
set pool 1 size to 2
[root@ceph01 ceph-deploy]# ceph osd pool get fengqing size
size: 2

4,RBD创建和映射

在创建镜像前我们还需要修改一下features值

在Centos7内核上,rbd很多特性都不兼容,目前3.0内核仅支持layering。所以我们需要删除其他特性

  • layering: 支持分层

  • striping: 支持条带化 v2

  • exclusive-lock: 支持独占锁

  • object-map: 支持对象映射(依赖 exclusive-lock)

  • fast-diff: 快速计算差异(依赖 object-map)

  • deep-flatten: 支持快照扁平化操作

  • journaling: 支持记录 IO 操作(依赖独占锁)

  • 关闭不支持的特性一种是通过命令的方式修改,还有一种是在ceph.conf中添加rbd_default_features = 1来设置默认 features(数值仅是 layering 对应的 bit 码所对应的整数值)。

    features编码如下

    例如需要开启layering和striping,rbd_default_features = 3 (1+2)

    1
    2
    3
    4
    5
    6
    7
    属性               BIT码
    layering 1
    striping 2
    exclusive-lock 4
    object-map 8
    fast-diff 16
    deep-flatten 32

    设置方式如下(改默认值对新建 image 生效;已建的 image 用 feature disable 逐个关)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@ceph01 ~]# cd /root/ceph-deploy
    [root@ceph01 ceph-deploy]# echo "rbd_default_features = 1" >>ceph.conf
    [root@ceph01 ceph-deploy]# ceph-deploy --overwrite-conf config push ceph01 ceph02 ceph03
    #也可以在 image 创建后逐个手动关闭特性(只对该 image 生效,新建的 image 依然按默认值来)。
    rbd feature disable fengqing/fengqing-rbd.img deep-flatten
    rbd feature disable fengqing/fengqing-rbd.img fast-diff
    rbd feature disable fengqing/fengqing-rbd.img object-map
    rbd feature disable fengqing/fengqing-rbd.img exclusive-lock
    #需要按照从后往前的顺序,一条条删除
1
2
3
#RBD创建就是通过rbd命令来进行创建,例子如下
[root@ceph01 ceph-deploy]# rbd create -p fengqing --image fengqing-rbd.img --size 15G
[root@ceph01 ceph-deploy]# rbd create -p fengqing --image fengqing1-rbd.img --size 15G

5,查看rbd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@ceph01 ceph-deploy]# rbd -p fengqing ls
fengqing-rbd.img
[root@ceph01 ceph-deploy]# rbd info -p fengqing --image fengqing-rbd.img
rbd image 'fengqing-rbd.img':
size 15 GiB in 3840 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 11cd9ca6add7
block_name_prefix: rbd_data.11cd9ca6add7
format: 2
features: layering
op_features:
flags:
create_timestamp: Thu May 12 13:51:54 2022
access_timestamp: Thu May 12 13:51:54 2022
modify_timestamp: Thu May 12 13:51:54 2022
[root@ceph01 ceph-deploy]# rbd info fengqing/fengqing-rbd.img
rbd image 'fengqing-rbd.img':
size 15 GiB in 3840 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 11cd9ca6add7
block_name_prefix: rbd_data.11cd9ca6add7
format: 2
features: layering
op_features:
flags:
create_timestamp: Thu May 12 13:51:54 2022
access_timestamp: Thu May 12 13:51:54 2022
modify_timestamp: Thu May 12 13:51:54 2022

6,删除rbd

1
2
[root@ceph01 ceph-deploy]# rbd rm fengqing/fengqing1-rbd.img
Removing image: 100% complete...done.

7,块文件挂载

接下来我们要进行rbd的挂载 (这里不建议分区,如果分区,后续扩容比较麻烦,容易存在丢数据的情况。在分区不够的情况下建议多块rbd)

1
2
3
4
[root@ceph01 ceph-deploy]# rbd map fengqing/fengqing-rbd.img
/dev/rbd0
#fengqing 为pool名称,当然可以通过-p
#fengqing-rbd.img 为rbd文件名称
1
2
3
4
5
#上面已经生成了块设备,我们还可以通过下面的命令进行查看
[root@ceph01 ceph-deploy]# rbd device list
id pool namespace image snap device
0 fengqing fengqing-rbd.img - /dev/rbd0
##可以看到pool名称,img名称,以及设备信息
1
2
3
#同样我们可以通过fdisk命令看到,现在块设备就相当于我们在服务器上插入了一块硬盘,挂载即可使用
#在下面我们可以看到一块 /dev/rbd0 磁盘(fdisk 按 10^9 计显示约 16.1GB,即 15GiB)
fdisk -l

image-20220512143705437

这里不建议进行分区

接下来进行格式化操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@ceph01 ceph-deploy]# mkfs.ext4 /dev/rbd0
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=1024 blocks, Stripe width=1024 blocks
983040 inodes, 3932160 blocks
196608 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
120 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

现在就可以进行挂载使用了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@ceph01 ceph-deploy]# mkdir /mnt/fengqing
[root@ceph01 ceph-deploy]# mount /dev/rbd0 /mnt/fengqing
[root@ceph01 ceph-deploy]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.6M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 36G 2.2G 33G 7% /
/dev/vda1 1014M 192M 823M 19% /boot
tmpfs 379M 0 379M 0% /run/user/0
tmpfs 1.9G 52K 1.9G 1% /var/lib/ceph/osd/ceph-0
/dev/rbd0 15G 41M 14G 1% /mnt/fengqing
[root@ceph01 ceph-deploy]# cd /mnt/fengqing/
[root@ceph01 fengqing]# ls
lost+found
[root@ceph01 fengqing]# touch fengqing.txt
[root@ceph01 fengqing]# echo "helloword" >fengqing.txt
[root@ceph01 fengqing]# cat fengqing.txt
helloword

8,RBD扩容

目前我们的rbd大小为15个G,这里我们演示将它扩展到30G。在不丢数据的情况下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@ceph01 fengqing]# rbd -p fengqing ls
fengqing-rbd.img
[root@ceph01 fengqing]# rbd info fengqing/fengqing-rbd.img
rbd image 'fengqing-rbd.img':
size 15 GiB in 3840 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 11cd9ca6add7
block_name_prefix: rbd_data.11cd9ca6add7
format: 2
features: layering
op_features:
flags:
create_timestamp: Thu May 12 13:51:54 2022
access_timestamp: Thu May 12 13:51:54 2022
modify_timestamp: Thu May 12 13:51:54 2022
[root@ceph01 fengqing]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.6M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 36G 2.2G 33G 7% /
/dev/vda1 1014M 192M 823M 19% /boot
tmpfs 379M 0 379M 0% /run/user/0
tmpfs 1.9G 52K 1.9G 1% /var/lib/ceph/osd/ceph-0
/dev/rbd0 15G 41M 14G 1% /mnt/fengqing

接下来使用resize参数进行扩容

1
2
3
4
5
[root@ceph01 fengqing]# rbd resize fengqing/fengqing-rbd.img --size 30G
Resizing image: 100% complete...done.
#fengqing为pool名称
#fengqing-rbd.img为镜像文件
#--size 为扩容后镜像大小

查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@ceph01 fengqing]# rbd info fengqing/fengqing-rbd.img
rbd image 'fengqing-rbd.img':
size 30 GiB in 7680 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 11cd9ca6add7
block_name_prefix: rbd_data.11cd9ca6add7
format: 2
features: layering
op_features:
flags:
create_timestamp: Thu May 12 13:51:54 2022
access_timestamp: Thu May 12 13:51:54 2022
modify_timestamp: Thu May 12 13:51:54 2022

扩容之后我们的设备是已经扩容上去,但是我们的文件系统并没有扩容上

1
2
fdisk -l
df -h

image-20220512144618531

接下来我们需要使用resize2fs对文件系统进行扩容

关于resize2fs解释:
调整ext2ext3ext4文件系统的大小,它可以放大或者缩小没有挂载的文件系统的大小。如果文件系统已经挂载,它可以扩大文件系统的大小,前提是内核支持在线调整大小
此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@ceph01 fengqing]# resize2fs /dev/rbd0
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/rbd0 is mounted on /mnt/fengqing; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 4
The filesystem on /dev/rbd0 is now 7864320 blocks long.
[root@ceph01 fengqing]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.6M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 36G 2.2G 33G 7% /
/dev/vda1 1014M 192M 823M 19% /boot
tmpfs 379M 0 379M 0% /run/user/0
tmpfs 1.9G 52K 1.9G 1% /var/lib/ceph/osd/ceph-0
/dev/rbd0 30G 44M 28G 1% /mnt/fengqing

我们可以到挂载的目录进行查看,之前创建的数据也还在

1
2
3
4
[root@ceph01 fengqing]# cat fengqing.txt
helloword
[root@ceph01 fengqing]# pwd
/mnt/fengqing

对于扩容一般会涉及三方面的内容: 1.底层存储(rbd resize) 2.磁盘分区的扩容 (例如mbr分区) 3.Linux文件系统的扩容
所以这里不建议在rbd块设备进行分区

CEPH警告处理

1,警告处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#当我们osd有数据写入时,我们在查看ceph集群。发现ceph集群目前有警告这时候我们就需要处理这些警告
[root@ceph01 fengqing]# ceph -s
cluster:
id: cae384c6-2be0-4bee-8f76-2f02941d71ee
health: HEALTH_WARN
application not enabled on 1 pool(s)
943 slow ops, oldest one blocked for 1677 sec, mon.ceph02 has slow ops
clock skew detected on mon.ceph02

services:
mon: 3 daemons, quorum ceph01,ceph02,ceph03 (age 28m)
mgr: ceph01(active, since 4h), standbys: ceph03
osd: 3 osds: 3 up (since 4h), 3 in (since 4h)

data:
pools: 1 pools, 64 pgs
objects: 69 objects, 141 MiB
usage: 3.3 GiB used, 27 GiB / 30 GiB avail
pgs: 64 active+clean

io:
client: 510 B/s rd, 0 op/s rd, 0 op/s wr

当我们创建pool资源池后,必须制定它使用ceph应用的类型 (ceph块设备、ceph对象网关、ceph文件系统)
如果我们不指定类型,集群health会提示HEALTH_WARN

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#我们可以通过ceph health detail命令查看ceph健康详情的信息
[root@ceph01 fengqing]# ceph -s
cluster:
id: cae384c6-2be0-4bee-8f76-2f02941d71ee
health: HEALTH_WARN
application not enabled on 1 pool(s)
943 slow ops, oldest one blocked for 1677 sec, mon.ceph02 has slow ops
clock skew detected on mon.ceph02

services:
mon: 3 daemons, quorum ceph01,ceph02,ceph03 (age 28m)
mgr: ceph01(active, since 4h), standbys: ceph03
osd: 3 osds: 3 up (since 4h), 3 in (since 4h)

data:
pools: 1 pools, 64 pgs
objects: 69 objects, 141 MiB
usage: 3.3 GiB used, 27 GiB / 30 GiB avail
pgs: 64 active+clean

io:
client: 510 B/s rd, 0 op/s rd, 0 op/s wr

[root@ceph01 fengqing]# ceph health detail
HEALTH_WARN application not enabled on 1 pool(s); 1033 slow ops, oldest one blocked for 1827 sec, mon.ceph02 has slow ops; clock skew detected on mon.ceph02
POOL_APP_NOT_ENABLED application not enabled on 1 pool(s)
application not enabled on pool 'fengqing'
use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.
SLOW_OPS 1033 slow ops, oldest one blocked for 1827 sec, mon.ceph02 has slow ops
MON_CLOCK_SKEW clock skew detected on mon.ceph02
mon.ceph02 clock skew 946.677s > max 0.05s (latency 0.00234324s)

三条告警的处理:application 告警按下面的 enable 分类解决;slow ops 和 clock skew 都出在 mon.ceph02 的时钟上(偏了 900 多秒),把它时间同步好、重启该 mon 后就消失了——所以最后的 ceph -s 里 mon 的 age 才会归零。

接下来我们将这个pool资源池进行分类,将fengqing pool标示为rbd类型

1
2
[root@ceph01 fengqing]# ceph osd pool application enable fengqing rbd
enabled application 'rbd' on pool 'fengqing'

如果我们在创建pool进行初始化后,就不会提示这个报错rbd pool init <pool-name>

当我们初始化后,rbd会将我们的pool修改为rbd格式。 健康状态自然就不会报错

设置完毕后,我们通过下面的命令可以看到pool目前的类型属于rbd类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#处理完application告警,我们继续查看ceph健康信息
[root@ceph01 fengqing]# ceph -s
cluster:
id: cae384c6-2be0-4bee-8f76-2f02941d71ee
health: HEALTH_OK

services:
mon: 3 daemons, quorum ceph01,ceph02,ceph03 (age 1.72301s)
mgr: ceph01(active, since 4h), standbys: ceph02, ceph03
osd: 3 osds: 3 up (since 4h), 3 in (since 4h)

data:
pools: 1 pools, 64 pgs
objects: 69 objects, 141 MiB
usage: 3.3 GiB used, 27 GiB / 30 GiB avail
pgs: 64 active+clean

CephFS文件系统

为什么需要使用CephFS
由于RBD不可以多个主机共享同一块磁盘,出现很多客户端需要写入数据的问题,这时就需要CephFS文件系统

1,安装mds

1
2
ceph-deploy mds create ceph01 ceph02 ceph03
#高可用安装

2,查看mds

1
2
[root@ceph01 ceph-deploy]#  ceph -s|grep mds
mds: 3 up:standby

3,创建pool

一个Ceph文件系统至少需要两个RADOS池,一个用于数据,一个用于元数据。

  • 对元数据池使用更好的复制级别,因为此池中的任何数据丢失都可能导致整个文件系统无法访问

  • 对元数据池使用SSD等低延迟存储,因为这将直接影响观察到的客户端文件系统操作的延迟。

  • 用于创建文件的数据池是默认数据池,是存储所有inode回溯信息的位置,用于硬链接管理和灾难恢复。因此,在CephFS中创建的所有inode在默认数据池中至少有一个对象。

    创建存储池,数据data,元数据metadata

1
2
3
4
5
6
7
8
[root@ceph01 ceph-deploy]# ceph osd pool create cephfs_data 64  64
pool 'cephfs_data' created
[root@ceph01 ceph-deploy]# ceph osd pool create cephfs_metadata 64 64
pool 'cephfs_metadata' created
[root@ceph01 ceph-deploy]# ceph osd pool ls
fengqing
cephfs_data
cephfs_metadata

通常,元数据池最多有几GB的数据,建议使用比较小的PG数,64或者128常用于大型集群

4,创建文件系统

接下来需要创建文件系统,将刚刚创建的pool关联起来

1
2
3
4
5
[root@ceph01 ceph-deploy]# ceph fs new cephfs-abcdocker cephfs_metadata cephfs_data
new fs with metadata pool 3 and data pool 2
#cephfs-abcdocker为文件系统名称
#cephfs_metadata 为元数据的pool
#cephfs_data 为数据pool

5,查看文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@ceph01 ceph-deploy]# ceph fs ls
name: cephfs-abcdocker, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
[root@ceph01 ceph-deploy]# ceph -s
cluster:
id: cae384c6-2be0-4bee-8f76-2f02941d71ee
health: HEALTH_OK

services:
mon: 3 daemons, quorum ceph01,ceph02,ceph03 (age 9m)
mgr: ceph01(active, since 5h), standbys: ceph02, ceph03
mds: cephfs-abcdocker:1 {0=ceph03=up:active} 2 up:standby #查看mds状态,已经有一个状态为active,另外2个为standb状态
osd: 3 osds: 3 up (since 19m), 3 in (since 5h)

task status:

data:
pools: 3 pools, 192 pgs
objects: 92 objects, 141 MiB
usage: 3.3 GiB used, 27 GiB / 30 GiB avail
pgs: 192 active+clean

6,挂载

使用cephfs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@ceph01 ceph-deploy]# mkdir /fengqing1 #创建挂载点
[root@ceph01 ceph-deploy]# mount -t ceph ceph01:6789:/ /fengqing1 -o name=admin
[root@ceph01 ceph-deploy]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.6M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 36G 2.2G 33G 7% /
/dev/vda1 1014M 192M 823M 19% /boot
tmpfs 379M 0 379M 0% /run/user/0
tmpfs 1.9G 52K 1.9G 1% /var/lib/ceph/osd/ceph-0
/dev/rbd0 30G 44M 28G 1% /mnt/fengqing
192.168.150.26:6789:/ 8.4G 0 8.4G 0% /fengqing1

在内核中挂载性能会比较高一点,但是有一些场景内核可能不太支持,所以可以使用用户FUSE挂载

用户空间挂载主要使用的是ceph-fuse客户端,需要单独安装。如果是在集群外的机器上挂载,要先把 ceph.conf 和 ceph.client.admin.keyring 拷到那台机器的 /etc/ceph/(下面的 scp 演示的就是这个,以集群外的 150.40 为例);我这里为了方便,直接在 ceph01 上演示挂载

首先要把ceph.conf和ceph.client.admin.keyring拷贝到对应的机子上,ceph-fuse 要读取这两个文件

1
mkdir -p /etc/ceph #在150.40上创建文件夹
1
2
scp ceph.client.admin.keyring [email protected]:/etc/ceph
scp ceph.conf [email protected]:/etc/ceph #拷贝过去
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yum install ceph-fuse -y #安装客户端
mkdir /fengqing3 #创建挂载点
ceph-fuse -n client.admin -m 192.168.150.26:6789 /fengqing3 #进行挂载
[root@ceph01 ceph-deploy]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.6M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 36G 2.2G 33G 7% /
/dev/vda1 1014M 192M 823M 19% /boot
tmpfs 379M 0 379M 0% /run/user/0
tmpfs 1.9G 52K 1.9G 1% /var/lib/ceph/osd/ceph-0
/dev/rbd0 30G 44M 28G 1% /mnt/fengqing
192.168.150.26:6789:/ 8.4G 0 8.4G 0% /fengqing1
ceph-fuse 8.4G 0 8.4G 0% /fengqing3
  • client.admin 默认有一个client.admin的用户
  • 192.168.150.26:6789 mon地址 (也可以写多个,逗号分隔)

如果我们不指定mon,默认找的是/etc/ceph/ceph.conf里面的配置文件

参考:本文实操过程参考了 abcdocker(i4t.com)的 Ceph 系列教程,所有命令输出均来自我自己的集群。