ceph 文件系统存储(CephFS)

大番茄 2020年03月19日 1,971次浏览

v14.2.8

内核驱动依赖:
https://docs.ceph.com/docs/master/cephfs/kernel-features/

https://docs.ceph.com/docs/master/cephfs/
Ceph文件系统或CephFS是在Ceph的分布式对象存储RADOS之上构建的POSIX兼容文件系统。
文件元数据与文件数据存储在单独的pool中,并通过可调整大小的元数据服务器或MDS集群提供服务,该集群可扩展以支持更高吞吐量的元数据工作负载。文件系统的客户端可以直接访问RADOS以读取和写入文件数据块。

image.png

前提,已经安装了mds。

一、创建文件系统

一个Ceph文件系统至少需要两个Pool,一个用于数据,另一个用于元数据。
数据与元数据都是存储到OSD里。

创建pool

[root@cephnode1 ~]# ceph osd pool create cephfs_data 128 128
pool 'cephfs_data' created
[root@cephnode1 ~]# ceph osd pool create cephfs_metadata 32 32
pool 'cephfs_metadata' created
[root@cephnode1 ~]#

通常,元数据池最多具有几GB的数据。因此,通常建议使用较少的PG。实际上,大型群集通常使用64或128。

我这里只是测试就32了。

创建文件系统

ceph fs new <fs_name> <metadata> <data>
[root@cephnode1 ~]# ceph fs new mycephfs cephfs_metadata cephfs_data
new fs with metadata pool 14 and data pool 13

查看信息

[root@cephnode1 ~]# ceph mds stat
mycephfs:1 {0=cephnode2=up:active} 2 up:standby
[root@cephnode1 ~]#

主备模式, cephnode2为主。

状态信息:

[root@cephnode1 ~]# ceph fs status mycephfs
mycephfs - 0 clients
========
+------+--------+-----------+---------------+-------+-------+
| Rank | State  |    MDS    |    Activity   |  dns  |  inos |
+------+--------+-----------+---------------+-------+-------+
|  0   | active | cephnode2 | Reqs:    0 /s |   10  |   13  |
+------+--------+-----------+---------------+-------+-------+
+-----------------+----------+-------+-------+
|       Pool      |   type   |  used | avail |
+-----------------+----------+-------+-------+
| cephfs_metadata | metadata | 1536k | 27.8G |
|   cephfs_data   |   data   |    0  | 27.8G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
|  cephnode3  |
|  cephnode1  |
+-------------+
MDS version: ceph version 14.2.8 (2d095e947a02261ce61424021bb43bd3022d35cb) nautilus (stable)

查询cephfs列表:

[root@cephnode1 ~]# ceph fs ls
name: mycephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

客户端授权

[root@cephnode1 ~]# ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow rw' osd 'allow rw pool=cephfs_data, allow rw pool=cephfs_metadata'
[client.cephfs]
	key = AQDAV3NeMMdCLBAAr/YtWYB9kI9ZKFlewUEaKA==

查看授权信息:

[root@cephnode1 ~]# ceph auth get client.cephfs
exported keyring for client.cephfs
[client.cephfs]
	key = AQDAV3NeMMdCLBAAr/YtWYB9kI9ZKFlewUEaKA==
	caps mds = "allow rw"
	caps mon = "allow r"
	caps osd = "allow rw pool=cephfs_data, allow rw pool=cephfs_metadata"
[root@cephnode1 ~]# 

二、挂载文件系统

挂载有两种方式:
内核挂载,就可客户端使用mount挂载。
FUSE挂载,使用ceph客户端工具挂碍。

如何选择

https://docs.ceph.com/docs/master/cephfs/mount-prerequisites/

FUSE客户端是最易于访问且最容易升级到存储集群使用的Ceph版本的,而内核客户端将始终提供更好的性能。

内核挂载

https://docs.ceph.com/docs/master/cephfs/mount-using-kernel-driver/

作为一个粗略的指导,从Ceph 10.x(Jewel)开始,您应该至少使用4.x内核。如果使用旧的内核,则应使用FUSE客户端而不是内核客户端。
如果您使用的Linux发行版包含CephFS支持,则此建议不适用,因为在这种情况下,发行商将负责将修补程序反向移植到其稳定的内核:请与供应商联系。

我这里挂载没问题: centos 7.6

挂载命令:
mount -t ceph {device-string}:{path-to-mounted} {mount-point} -o {key-value-args} {other-args}

device-stringmonitor节点地址
path-to-mounted: 要挂载的目录,一般都是挂载根/
mount-point: 挂载点
key-value-args: 指定CephX凭据, 如果禁用了CephX,可以省略。

比如:

[root@client /]# mount -t ceph 172.100.102.91:6789,172.100.102.92:6789,172.100.102.93:6789:/ /mnt/mycephfs -o name=cephfs,secret=AQDAV3NeMMdCLBAAr/YtWYB9kI9ZKFlewUEaKA==

name: 指定的是用户名的id,不是完整的type.id用户名。

[root@client mycephfs]# df -Th
文件系统                                                      类型      容量  已用  可用 已用% 挂载点
/dev/sda2                                                     xfs       146G  1.6G  145G    2% /
devtmpfs                                                      devtmpfs  990M     0  990M    0% /dev
tmpfs                                                         tmpfs    1000M     0 1000M    0% /dev/shm
tmpfs                                                         tmpfs    1000M  8.9M  991M    1% /run
tmpfs                                                         tmpfs    1000M     0 1000M    0% /sys/fs/cgroup
tmpfs                                                         tmpfs     200M     0  200M    0% /run/user/0
172.100.102.91:6789,172.100.102.92:6789,172.100.102.93:6789:/ ceph       28G     0   28G    0% /mnt/mycephfs

为了防止shell历史记录里有秘钥,也可以从文件里读取秘钥。secretfile指定文件。 文件权限最好是600

mount -t ceph :/ /mnt/mycephfs -o name=foo,secretfile=/etc/ceph/foo.secret

如果集群中有多个文件系统,非默认的需要添加参数fs参数。
我这个版本的ceph,多文件系统还是实验功能,这个fs参数不能用。新版本可能支持了。

mount -t ceph :/ /mnt/mycephfs2 -o name=fs,fs=mycephfs2
永久生效

写到fstab里永久生效

[{ipaddress}:{port}]:/ {mount}/{mountpoint} ceph [name=username,secret=secretkey|secretfile=/path/to/secretfile],[{mount.options}]

比如:

172.100.102.91:6789,172.100.102.92:6789,172.100.102.93:6789:/  /mnt/mycephfs  ceph  name=cephfs,secret=AQDAV3NeMMdCLBAAr/YtWYB9kI9ZKFlewUEaKA==,_netdev,noatime 0 0

FUSE挂载

因为ceph-fuse是安装在用户空间的, 所以性能可能相对较低, 但是更易于管理。

安装ceph-fuse

使用之前安装ceph的yum源。

[root@cephnode1 yum.repos.d]# cat ceph.repo
[ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc


[ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
将集群的ceph.conf拷贝到客户端并且把客户端使用的key放到文件里。
[root@client ~]# ls /etc/ceph
ceph.client.cephfs.keyring  ceph.conf

ceph.client.cephfs.keyring文件是手动创建的,内容就是授权给客户端使用的key。

[root@client ~]# cat /etc/ceph/ceph.client.cephfs.keyring
[client.cephfs]
    key = AQDAV3NeMMdCLBAAr/YtWYB9kI9ZKFlewUEaKA==
[root@client ~]#

把key文件权限给一下。为了安全。

chmod 600 ceph.client.cephfs.keyring
挂载

挂载命令:

ceph-fuse {mountpoint} {options}

如:

[root@client ceph]# ceph-fuse --keyring  /etc/ceph/ceph.client.cephfs.keyring  --name client.cephfs -m 172.100.102.91:6789,172.100.102.92:6789,172.100.102.93:6789 /mnt/mycephfs/
ceph-fuse[1437]: starting ceph client
2020-03-19 19:56:06.417 7f79f1ae0e00 -1 init, newargv = 0x557ebbb0c870 newargc=7
ceph-fuse[1437]: starting fuse
[root@client ceph]# df -Th
文件系统       类型            容量  已用  可用 已用% 挂载点
/dev/sda2      xfs             146G  1.8G  145G    2% /
devtmpfs       devtmpfs        990M     0  990M    0% /dev
tmpfs          tmpfs          1000M     0 1000M    0% /dev/shm
tmpfs          tmpfs          1000M  8.8M  991M    1% /run
tmpfs          tmpfs          1000M     0 1000M    0% /sys/fs/cgroup
tmpfs          tmpfs           200M     0  200M    0% /run/user/0
ceph-fuse      fuse.ceph-fuse   28G   28M   28G    1% /mnt/mycephfs
永久生效

也是添加到fstab。

none    /mnt/mycephfs  fuse.ceph ceph.id={user-ID}[,ceph.conf={path/to/conf.conf}],_netdev,defaults  0 0

如:

none /mnt/mycephfs fuse.ceph ceph.id=cephfs,ceph.conf=/etc/ceph/ceph.conf,_netdev,defaults 0 0
[root@client ceph]# mount -a
ceph-fuse[1561]: starting ceph client
2020-03-19 20:43:09.051 7f1ac5334e00 -1 init, newargv = 0x55712f0a1850 newargc=9
ceph-fuse[1561]: starting fuse

想要挂载子目录,添加一个ceph.client_mountpoint参数就可以。

none /mnt/mycephfs fuse.ceph ceph.id=cephfs,ceph.client_mountpoint=/etc,ceph.conf=/etc/ceph/ceph.conf,_netdev,defaults 0 0

三、mds主从与多主模式

https://docs.ceph.com/docs/master/cephfs/multimds/

建议使用Linux内核客户端> = 4.14。

默认情况下,每个CephFS文件系统都为一个活动的MDS守护程序配置。为了扩展大型系统的元数据性能,您可以启用多个活动的MDS守护程序,这些守护程序将彼此共享元数据工作负载。

什么时候应该使用多主

当默认运行的单个MDS上的元数据性能出现瓶颈时,应配置多个活动的MDS守护程序。

添加更多守护程序可能不会提高所有工作负载的性能。通常,除非单个应用程序并行执行大量元数据操作,否则运行在单个客户端上的单个应用程序将不会受益于MDS守护程序数量的增加。

通常,受益于许多活动MDS守护程序的工作负载是具有许多客户端的工作负载,这些工作负载可能在多个单独的目录上工作。

需要有备用的mds

即使有多个活动的MDS守护程序,如果运行活动的守护程序的任何服务器发生故障,高可用性系统仍需要备用守护程序来接管。

因此,活动mds的最大数量最多只能比系统中MDS服务器的总数少一,也就是说最少要有一个是处于备用状态。

为了在多个服务器发生故障时保持可用,请增加系统中的备用守护程序的数量,与您希望承受的服务器故障的数量相匹配。

设置

每个CephFS文件系统都有一个max_mds设置,可以用来修改活动的mds数量。

ceph fs set <fs_name> max_mds 2

先看一下mds当前的状态, mycephfs文件系统中是1个up并且活动状态,2个up并且备用状态:

[root@cephnode1 ~]# ceph mds stat
mycephfs:1 {0=cephnode2=up:active} 2 up:standby
[root@cephnode1 ~]# ceph fs set mycephfs max_mds 2

修改以后,mycephfs文件系统,2活动(cephnode2与cephnode3),1备用

[root@cephnode1 ~]# ceph mds stat
mycephfs:2 {0=cephnode2=up:active,1=cephnode3=up:active} 1 up:standby

在重新设置为1个主以后,其他的主会慢慢退出活动状态,需要几秒到几分钟时间, 这时处于stopping状态。

[root@cephnode1 ~]# ceph mds stat
mycephfs:2 {0=cephnode2=up:active,1=cephnode1=up:stopping} 1 up:standby