文章目录
- 1.Cephfs文件系统简介
- 2.Cephfs文件系统细节介绍
- 2.1.Cephfs文件系统多客户端隔离挂载
- 2.2.Ceph集群中多个Cephfs如何单独使用
- 3.挂载多个Cephfs文件系统
- 4.Cephfs文件系统多客户端隔离挂载实战
- 4.1.创建一个Cephfs文件系统
- 4.2.将Cephfs文件系统挂载到本地路径
- 4.3.在Cephfs文件文件系统中创建多个目录
- 4.4.查看Cephfs文件系统的状态
- 4.5.客户端分别挂载不同的Cephfs文件系统中的子目录
- 5.卸载MDS的方法
- 6.小插曲
1.Cephfs文件系统简介
Cephfs文件系统至少需要一个MDS(Metadata Server组件)来存储文件系统的元数据信息,因此在使用Cephfs文件存储之前,首先要在集群中部署MDS组件,我们希望Cephfs文件存储具备高可用性,所以MDS组件一般都会在集群中部署多个,大多数情况下都是三个MDS组件。
Cephfs支持用户级别和内核级别的挂载使用,可扩展性极高,并且可以同时让多个Client客户端进行读写。
一个Cephfs文件系统至少需要两个Librados存储池,也就是Pool资源池,一个为data,存储具体落盘的数据,一个为metadata,存储数据文件的元数据信息。
建议为metadata的Pool资源池设置较高级别的副本数,因为metadata资源池损坏就会导致整个文件系统不可用,另外metadata的资源池要使用低延时的存储,例如SSD类型的磁盘,metadata会直接影响客户端的响应速度。
Cephfs文件系统正确使用姿势:
首次创建完Cephfs文件系统后,将其挂载到本地的一个路径中,然后在路径中创建出多个子级目录,客户端使用时挂载特定的子级目录。
这样做的好处是:既可以看到所有客户端在Cephfs文件系统中存储的数据,又可以让多个客户端之间实现数据的隔离存储。
2.Cephfs文件系统细节介绍
2.1.Cephfs文件系统多客户端隔离挂载
在Ceph集群中创建的Cephfs文件系统,其实是一个Volume,也就是一个空盘,只有一个/路径,这也是大多数直接挂载/的一个原因。
如果集群中只有一个Cephfs文件系统,在使用mount挂载时,无需指定使用哪个Cephfs文件系统,直接就是将这个Cephfs文件系统的/目录挂载到指定的路径中,就可以使用这个Cephfs文件系统进行存储了。
如下图所示:Ceph集群中只有一个Cephfs文件系统,也没有在文件系统中创建任何目录,因此直接挂载的/目录
我们可以把Cephfs文件系统理解成一个空的父级目录,一开始并没有任何的文件系统,在使用这个文件系统之前,先将Cephfs挂载到本地的一个路径中,在里面为不同的客户端创建出不同的目录,然后由客户端挂载时指定要挂载的目录,实现多客户端之间的数据隔离。
如下图所示:就是在Cephfs文件系统中为不同的客户端创建了不同的存储目录,然后由客户端进行挂载,实现数据上的逻辑隔离。
2.2.Ceph集群中多个Cephfs如何单独使用
一个Ceph集群中不可能只有一个Cephfs文件系统,那么如何指定客户端使用哪一个Cephfs呢?其实很简单,mount挂载命令中有个参数可以指定客户端使用哪一个Cephfs。
挂载非默认FS,以防集群有多个FS
mount -t ceph :/ /mnt/ mycephfs2 -o fs=mycephfs2
或者
mount -t ceph :/ /mnt/ mycephfs2 -o mds_namespace=mycephfs2 # 此选项名称已弃用。
官网是如上这么写的,但是我在使用的时候发现fs=这个参数是不支持的,只有mds_namespace=参数是支持的
3.挂载多个Cephfs文件系统
使用mount命令的mds_namespace参数就可以指定要挂载的Cephfs文件系统
[root@ceph-node-1 ~]# mount -t ceph 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/nginx_conf /nginx_conf/ -o name=admin,mds_namespace=kubernetes_cephfs
[root@ceph-node-1 ~]# mount -t ceph 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/prometheus_data /prometheus_data/ -o name=admin,mds_namespace=kubernetes_cephfs
执行mount命令也可以看到挂载的详情。
192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/nginx_conf on /nginx_conf type ceph (rw,relatime,name=admin,secret=<hidden>,acl,mds_namespace=kubernetes_cephfs,wsize=16777216)
192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/prometheus_data on /prometheus_data type ceph (rw,relatime,name=admin,secret=<hidden>,acl,mds_namespace=kubernetes_cephfs,wsize=16777216)
4.Cephfs文件系统多客户端隔离挂载实战
创建一个Cephfs文件系统,然后将文件系统挂载到本地的一个路径上,
4.1.创建一个Cephfs文件系统
1)首先创建Cephfs依赖的数据池和元数据池
[root@ceph-node-1 ~]# ceph osd pool create kubernetes_cephfs_data 16 16
pool 'kubernetes_cephfs_data' created
[root@ceph-node-1 ~]# ceph osd pool create kubernetes_cephfs_metadata 16 16
pool 'kubernetes_cephfs_metadata' created
2)创建一个Cephfs文件系统
[root@ceph-node-1 ~]# ceph fs new kubernetes_cephfs kubernetes_cephfs_metadata kubernetes_cephfs_data
new fs with metadata pool 14 and data pool 13
3)查看创建的Cephfs文件系统
[root@ceph-node-1 ~]# ceph fs ls
name: kubernetes_cephfs, metadata pool: kubernetes_cephfs_metadata, data pools: [kubernetes_cephfs_data ]
4.2.将Cephfs文件系统挂载到本地路径
使用mount命令时,指定mds_namespace参数挂载特定的Cephfs文件系统。
[root@ceph-node-1 ~]# mount -t ceph 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/ /kubernetes_cephfs/ -o name=admin,mds_namespace=kubernetes_cephfs
4.3.在Cephfs文件文件系统中创建多个目录
创建出多个目录为不同的客户端提供存储。
[root@ceph-node-1 ~]# mkdir /kubernetes_cephfs/{zabbix_data,prometheus_data,nginx_conf}
[root@ceph-node-1 ~]# ll /kubernetes_cephfs/
总用量 0
drwxr-xr-x 1 root root 0 4月 16 10:02 nginx_conf
drwxr-xr-x 1 root root 0 4月 16 10:02 prometheus_data
drwxr-xr-x 1 root root 0 4月 16 10:02 zabbix_data
4.4.查看Cephfs文件系统的状态
当前还没有任何数据写入。
[root@ceph-node-1 ~]# ceph fs status kubernetes_cephfs
kubernetes_cephfs - 0 clients
=================
+------+--------+-------------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+-------------+---------------+-------+-------+
| 0 | active | ceph-node-2 | Reqs: 0 /s | 0 | 0 |
+------+--------+-------------+---------------+-------+-------+
+----------------------------+----------+-------+-------+
| Pool | type | used | avail |
+----------------------------+----------+-------+-------+
| kubernetes_cephfs_metadata | metadata | 1728k | 17.9G |
| kubernetes_cephfs_data | data | 0 | 17.9G |
+----------------------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
| ceph-node-1 |
+-------------+
+-----------------------------------------------------------------------------------+-------------+
| version | daemons |
+-----------------------------------------------------------------------------------+-------------+
| None | ceph-node-2 |
| ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable) | ceph-node-1 |
+-----------------------------------------------------------------------------------+-------------+
4.5.客户端分别挂载不同的Cephfs文件系统中的子目录
1)客户端挂载文件系统中不同的目录
1.创建挂载点
[root@ceph-node-1 ~]# mkdir /nginx_conf
[root@ceph-node-1 ~]# mkdir /prometheus_data
2.挂载Cephfs文件系统中不同的子目录
[root@ceph-node-1 ~]# mount -t ceph 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/nginx_conf /nginx_conf/ -o name=admin,mds_namespace=kubernetes_cephfs
[root@ceph-node-1 ~]# mount -t ceph 192.168.20.20:6789,192.168.20.21:6789,192.168.20.22:6789:/prometheus_data /prometheus_data/ -o name=admin,mds_namespace=kubernetes_cephfs
2)查看挂载的信息
不同的客户端挂载了Cephfs文件系统中不同的子目录,实现数据上的隔离存储。
3)写入数据验证数据的隔离性
每个客户端都在自己的挂载点写入数据。
#nginx客户端
[root@ceph-node-1 ~]# touch /nginx_conf/file{1..5}.txt
#prometheus客户端
[root@ceph-node-1 ~]# cp rbd-storage.img /prometheus_data/
在总的Cephfs文件存储中查看子目录的数据。
[root@ceph-node-1 ~]# tree /kubernetes_cephfs/
/kubernetes_cephfs/
├── nginx_conf
│ ├── file1.txt
│ ├── file2.txt
│ ├── file3.txt
│ ├── file4.txt
│ └── file5.txt
├── prometheus_data
│ └── rbd-storage.img
└── zabbix_data
3 directories, 6 files
查看Cephfs文件系统的状态,此时数据就有了变化。
[root@ceph-node-1 ~]# ceph fs status kubernetes_cephfs
kubernetes_cephfs - 0 clients
=================
+------+--------+-------------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+-------------+---------------+-------+-------+
| 0 | active | ceph-node-2 | Reqs: 0 /s | 0 | 0 |
+------+--------+-------------+---------------+-------+-------+
+----------------------------+----------+-------+-------+
| Pool | type | used | avail |
+----------------------------+----------+-------+-------+
| kubernetes_cephfs_metadata | metadata | 1920k | 17.8G |
| kubernetes_cephfs_data | data | 215M | 17.8G |
+----------------------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
| ceph-node-1 |
+-------------+
+-----------------------------------------------------------------------------------+-------------+
| version | daemons |
+-----------------------------------------------------------------------------------+-------------+
| None | ceph-node-2 |
| ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable) | ceph-node-1 |
+-----------------------------------------------------------------------------------+-------------+
5.卸载MDS的方法
1:(可选)创建一个新的MDS将要被移除的MDS,如果在删除MDS之后没有替代MDS可以接管,则文件系统将对客户端不可用,如果不希望这样做,请在删除要脱机的元数据服务器之前考虑添加元数据服务器
2:停止MDS服务
systemctl stop ceph-mds@${id}
MDS将自动通知mon它已关闭,这使mon能够将故障瞬间切换到可用的备用数据库(如果存在)。无需使用管理命令来实现此故障转移,例如通过使用ceph mds fail mds.${id}
3:删除/var/lib/ceph/mds/ceph-${id}目录
rm -rf /var/lib/ceph/mds/ceph-${id}
注意:卸载掉集群中所有的MDS后,Cephfs文件系统将不可用,再次部署完MDS后,需要将所有的cephfs以及对应的Pool资源池删掉,否则集群就会有问题。
6.小插曲
如果一台机器中挂载了两个Cephfs,虽然是两个不通的Cephfs文件系统,但是都挂载的是/目录。
此时使用df目录查看挂载信息时,只会显示第一个挂载的Cephfs文件系统。