客户端连接mds服务获得文件的对象编号Inode,之后根据对象编号从data pool中取出数据,client是访问不到metadata pool的。元数据放在进程的内存中,定时同步到metadata pool中。

Cephfs

客户端挂载CephFS的方式:

1、内核文件系统:ceph,libcephfs

2、用户空间文件系统(FUSE):libcephfs


启用CephFS


        CephFS需要至少运行一个元数据服务器MDS的守护进程metadata server,至少两个pool。

启动MDS服务:

ceph-deploy mds create ceph02

查看MDS状态:

]$ ceph mds stat
, 1 up:standby

创建元数据池:

ceph osd pool create cephfs-metadata 32 32

创建数据池:

ceph osd pool create cephfs-data 64 64

将数据池和元数据池关联:

ceph fs new cephfs cephfs-metadata cephfs-data

显示cephfs相关信息:

ceph fs status cephfs
cephfs - 0 clients
======
+------+--------+--------+---------------+-------+-------+
| Rank | State  |  MDS   |    Activity   |  dns  |  inos |
+------+--------+--------+---------------+-------+-------+
|  0   | active | ceph01 | Reqs:    0 /s |   10  |   13  |
+------+--------+--------+---------------+-------+-------+
+-----------------+----------+-------+-------+
|       Pool      |   type   |  used | avail |
+-----------------+----------+-------+-------+
| cephfs-metadata | metadata | 2286  | 32.0G |
|   cephfs-data   |   data   |    0  | 32.0G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
MDS version: ceph version 13.2.8 (5579a94fafbc1f9cc913a0f5d362953a5d9c3ae0) mimic (stable)

查看mds状态:

ceph mds stat


客户端使用


创建账号:

ceph auth get-or-create client.fsclient mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs-data' -o ceph.client.fsclient.keyring

查看权限信息:

]$ ceph auth get client.fsclient
exported keyring for client.fsclient
[client.fsclient]
	key = AQBArUtec3BRBxAAj2w0dCpJuCuq5blbBkczKQ==
	caps mds = "allow rw"
	caps mon = "allow r"
	caps osd = "allow rwx pool=cephfs-data"

将key保存到文件:

ceph auth print-key client.fsclient > fsclient.key

将key和ceph.conf文件复制到客户端:

scp fsclient.key ceph.conf root@192.168.1.12:/etc/ceph/

客户端安装ceph-common:

yum install ceph-common -y

查看客户端的linux内核是否有ceph模块:

modinfo ceph | grep ceph.ko

在客户端创建挂载目录:

mkdir /data

挂载目录:-t 文件系统类型,-o 名称,secretfile=秘钥文件

mount -t ceph ceph01:6789,ceph02:6789,ceph03:6789:/ /data -o name=fsclient,secretfile=/etc/ceph/fsclient.key

查看是否已经挂载:

mount | grep ceph

查看文件系统类型:

stat -f /data

        cephfs是可共享挂载的,其他客户端也可以挂载使用,文件也是共享的。相比nfs cephfs因为底层是rados集群所以具有冗余的功能,不存在单点。还有io能力扩展性等等都是cephfs的优势。


设置开机自动挂载:_netdev不在线则跳过,noatiom不实时更新访问时间戳

ceph01:6789,ceph02:6789,ceph03:6789:/ /data     ceph    name=fsclient,secretfile=/etc/ceph/fsclient.key,_netdev,noatime    0 0


FUSE客户端


        当内核没有ceph模块时可以使用FUSE客户端来挂载使用cephfs。这是安装在用户空间的应用,所以性能上比不上内核级别的客户端。

安装ceph-fuse:

yum install ceph-fuse -y

提供配置文件ceph.conf和keyring文件:

ceph auth get-or-create client.fsclient mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs-data' -o ceph.client.fsclient.keyring
scp ceph.client.fsclient.keyring ceph.conf root@192.168.1.12:/etc/ceph/

使用fuse客户端挂载使用:

]# ceph-fuse -n client.fsclient -m ceph01:6789,ceph02:6789,ceph03:6789 /data
ceph-fuse[3030]: starting ceph client
2020-02-18 06:22:26.759 7ff837906c00 -1 init, newargv = 0x559c7eac0300 newargc=7
ceph-fuse[3030]: starting fuse

查看是否挂载:

mount | grep fuse

开机自动挂载:编辑/etc/fstab

none  /data fuse.ceph ceph.id=fsclient,ceph.conf=/etc/ceph/ceph.conf,_netdev,defaults 0 0

测试挂载:

]# mount -a
2020-02-18 08:17:13.700 7faec3560c00 -1 init, newargv = 0x55abd1d579d0 newargc=9
ceph-fuse[3218]: starting ceph client
ceph-fuse[3218]: starting fuse


MDS扩展


        metadata server元数据的扩展涉及到写同步,所以很难分散。动态子树分区或者叫Multi MDS,一个目录一个分区,当某个目录负载量变的跟大时会自动将某个子目录切换分区,切换到负载较轻的mds。多个mds其中一个负责根将子分配给其他mds。rank0代表管理跟节点,rank1、rank2...没有等级关系,都是rank0的子树。rank值通过max_mds参数来管理。

        mds冗余问题,找一个mds专门做冗余,谁坏掉给谁备份,或者每个mds都有一个mds备份。

        读负载均衡是对目录创建多个副本实现的。

        当mds名额数量多于mds数量,多出来的名额就处于备用模式。

查看mds状态:

ceph mds stat
cephfs-1/1/1 up  {0=ceph01=up:active}

创建多个mds节点:

ceph-deploy mds create ceph02 ceph03

查看mds状态:此时多出两个备用状态

ceph mds stat
cephfs-1/1/1 up  {0=ceph01=up:active}, 2 up:standby

设置rank值:

ceph fs set cephfs max_mds 2

再次查看状态:已近有一个standby转为active了

ceph mds stat
cephfs-2/2/2 up  {0=ceph01=up:active,1=ceph03=up:active}, 1 up:standby

也可以使用如下命令查看:

]$ ceph fs status
cephfs - 0 clients
======
+------+--------+--------+---------------+-------+-------+
| Rank | State  |  MDS   |    Activity   |  dns  |  inos |
+------+--------+--------+---------------+-------+-------+
|  0   | active | ceph01 | Reqs:    0 /s |   10  |   13  |
|  1   | active | ceph03 | Reqs:    0 /s |   10  |   13  |
+------+--------+--------+---------------+-------+-------+
+-----------------+----------+-------+-------+
|       Pool      |   type   |  used | avail |
+-----------------+----------+-------+-------+
| cephfs-metadata | metadata | 6996  | 32.0G |
|   cephfs-data   |   data   |    0  | 32.0G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
|    ceph02   |
+-------------+
MDS version: ceph version 13.2.8 (5579a94fafbc1f9cc913a0f5d362953a5d9c3ae0) mimic (stable)

查看cephfs更详细的信息:

ceph fs get cephfs


MDS故障转移设置参数


        mds_standby_for_name:让某个standby接管指定的mds。

        mds_standby_for_rank:让某个standby接管指定的mds,但是设置的是rank,而不是名称,可以夸多个文件系统,必须结合mds_standby_for_fscid 来使用,这个是来指定用在那个文件系统上的。

        mds_standby_for_fscid:指定了某个文件系统,但是没有指定那个rank,也就是说可以为某一个文件系统内的任意多个rank备用。设置条件为:同时设置了mds_standby_for_rank,但未设置mds_standby_for_rank。

        mds_standby_replay:备用某个mds时,因为备用的没有数据所以要从pool中复制数据,中间有间隔会造成卡顿,所以这个参数可以让备用的节点同步要被备用mds的数据,就是两个mds都有数据,其中一个有问题另一个可以无间隙的顶替上去。

        这些配置需要配置在ceph.conf中,配置后要推送到各个节点。


配置示例:在配置文件加上如下配置即可。

ceph02备用于名称为cephfs文件系统的任意一个mds。

[mds.ceph02]
mds_standby_for_fscid = cephfs

ceph02被用于ceph03,而且是replay模式,如果有多个备用mds那就再多写一个配置段即可。

[mds.ceph02]
mds_standby_for_name = ceph03
mds_standby_replay = true

[mds.ceph04]
mds_standby_for_name = ceph01
mds_standby_replay = true

推送到各个节点:修改管理节点下的配置,然后推送到集群各个节点

ceph-deploy --overwrite-conf config push ceph01 ceph02 ceph03