Ceph 文件系统简介


Ceph 文件系统 (CephFS) 是 RADOS 集群基于文件的接口。它提供了可扩展并且兼容 POSIX 的并行文件系统,将其数据和元数据作为对象存储在红帽  Ceph 存储中。CephFS 依靠运行元数据服务器 (MDS) 的集群节点来协调 RADOS 集群的访问,以及管理与其文件相关的元数据。


CephFS 的目标是尽可能像标准的 POSIX 文件系统一样运作。位于两个不同主机上的进程应该像在同一主机上一样运作。例如,CephFS 在其客户端之间维系强健的缓存连贯性,这与 NFS 不同。


文件、块和对象存储

借助基于文件的存储,您可以像使用传统文件系统一样整理自己的数据。您的数据保存在文件中,文件具有一个名称及一些关联的元数据,如修改时间戳、所有者和访问权限。基于文件的存储使用目录和子目录层次结构来整理文件的存储方式。


CephFS:Ceph学习系列6_java






元数据服务器


元数据服务器 (MDS) 管理 CephFS 客户端的元数据。这一守护进程提供 CephFS 客户端访问相应 RADOS 对象所需要的信息,如文件在文件系统树中存储的位置。它管理目录层次结构,并且存储 RADOS 集群中各个文件的元数据(所有者、时间戳和模式等)。它也负责缓存元数据访问权限,并且管理客户端缓存来维护缓存一致性。


CephFS 共享文件系统需要活跃的 MDS 守护进程。也应该至少有一个备用的 MDS 来确保高可用性。

CephFS 客户端首先联系 MON,以进行身份验证并获取 cluster map。然后,它们将查询活跃 MDS 的文件元数据,并通过直接与 OSD 通信来访问文件或目录的对象。


当前 CephFS 限制

在红帽  Ceph 存储 3 中使用 CephFS 存在一些限制:

  • 红帽  Ceph 存储目前仅支持一个集群中有一个活跃的 MDS。不过,可以配置额外的备用 MDS,在出现故障时接管活跃的 MDS。

  • 红帽  Ceph 存储目前仅支持一个集群中有一个活跃的 CephFS 文件系统。在同一集群中配置多个 CephFS 文件系统可能会导致 MDS 或客户端节点意外终止。

  • 快照是实验性功能,不受支持或默认也不可用。使用快照可能会导致 MDS 或客户端节点意外终止。





元数据服务器的部署

ceph-ansible 软件包中包含的 playbook 支持部署元数据服务器。若要使用 Ansible 部署 MDS,您需要通过在清单文件的 [mdss] 部分中列举,将它添加到 mdss 主机组中。假如您在使用 /usr/share/ceph-ansible 目录,您也应当针对仅为该组中的主机设置的任何变量创建 /usr/share/ceph-ansible/group_vars/mdss.yml 文件。您可以复制现有的 group_vars/mdss.yml.sample 文件来实现这一目的。

group_vars/mdss.yml 中可能要配置的一些常见设置包括:

  • 如果还没有在 group_vars/all.yml 设置,请在 fetch_directory 参数中设置 Ansible 密钥的目录。

  • 设置 cephx: true(通常为默认)以启用 Cephx 身份验证。

  • 如果测试需要,可设置 copy_admin_key: true,将 admin 用户的 keyring 复制到 MDS。

使用以下 ansible-playbook site.yml 命令来部署 MDS,如下方所示:

[user@server ceph-ansible]$ ansible-playbook site.yml --limit mdss

部署的第一个 MDS 实例成为活跃 MDS,随后的所有实例是备用 MDS。


红帽  Ceph Storage 3 仅支持一个时间上只有一个活跃 MDS。部署的所有其他 MDS 必须处于备用模式,以提供高可用性。如果活跃 MDS 失败,其中一个备用 MDS 将接管。同时具有多个 MDS 是实验性功能,不建议用于生产环境。


max_mds 参数定义活跃 MDS 守护进程的数量。默认设置为 1。如果更改,任何现有的备用 MDS 都可以用作新的活跃 MDS 守护进程。以下命令将 max_mds 参数设置为 3:

[ceph@server ~]$ ceph fs set cephfs max_mds 3


若要验证活跃 MDS 守护进程的数量,请使用 ceph fs status 命令。以下命令验证名为 cephfs 的 CephFS 文件系统的活跃 MDS 守护进程数量:

[ceph@server ~]$ ceph fs status cephfs





利用 CephFS 创建和挂载文件系统

CephFS 文件系统需要至少两个池,一个用于存储 CephFS 数据,另一个用于存储 CephFS 元数据。默认情况下,CephFS 数据池的名称是 cephfs_data,CephFS 元数据池的名称则是 cephfs_metadata。您可以在 group_vars/mons.yml 文件中配置这些池名称。当这两个池可用时,您可以使用 ceph fs new 命令来创建文件系统,如下方所示:


[ceph@server ~]$ ceph fs new fs-name metadata-pool data-pool

红帽  Ceph 存储仅支持每个 Ceph 集群有一个文件系统。


在配置 MDS 时,ceph-ansible playbook 自动创建名为 cephfs 的 CephFS 文件系统,同时也创建需要的默认池(cephfs_data 和 cephfs_metadata)。如果至少存在一个 CephFS 文件系统,MDS 将变为活跃状态。


您可以使用以下两个客户端中的任一个来挂载 CephFS:

  • 内核客户端(自 RHEL 7.3 起可用)

  • FUSE 客户端(自 RHEL 7.2 起可用)

这两种客户端各有优缺点,而且并不都支持所有的功能。例如,内核客户端不支持配额,但速度可能会较快。FUSE 客户端支持配额和 ACL,但必须显式启用。





常见 CephFS 客户端配置

若要利用这两个客户端中的任一个来挂载基于 CephFS 的文件系统,请验证客户端主机上满足下列前提条件。您应能够通过使用 ceph-ansible playbook 并利用 group_vars/clients.yml 组变量文件中的相应设置配置 clients 主机组中的 CephFS 客户端,来进行这项验证。

  • 安装 ceph-common 软件包。如果您在使用 FUSE 客户端,则还要安装 ceph-fuse 软件包。

  • 确保集群的 /etc/ceph/ceph.conf 文件已复制到客户端计算机上。

  • 如果您在使用 FUSE 客户端,请将相应的 keyring 文件复制到客户端计算机上。如果您在使用内核客户端,请将所需用户的密钥复制到客户端计算机上。


使用 FUSE 客户端挂载 CephFS

在满足了前提条件后,您可以按照如下所示使用 FUSE 客户端挂载和卸载 CephFS 文件系统:

[root@server ~]# ceph-fuse -m mon1[:6789][,monx[:6789]] mount-point

[root@server ~]# fusermount -u mount-point


默认情况下,CephFS FUSE 客户端会挂载所访问文件系统的根目录 (/)。使用 ceph-fuse -r directory 命令授权下列功能并进行挂载,以利用 Cephx 修改这一行为:

  • mds 'allow r, allow rw path=directory'

  • osd 'allow rw pool=data'


在定义 mds 功能时指定的 directory 路径变成 ceph-fuse 客户端的根路径。

例如,以下所示为使用 FUSE 客户端挂载的 CephFS 文件系统的 /etc/fstab 中条目的示例:

none mount-point fuse.ceph _netdev 0 0


使用内核客户端挂载 CephFS

在使用 CephFS 内核客户端时,请使用以下命令来挂载文件系统:

[root@server ~]# mount -t ceph mon1[:6789][,monx[:6789]]:/ mount-point

您可以指定一列通过逗号分隔的多个 MON 来挂载设备。您可以在各个 MON 名称的后面指定冒号和非标准端口位置,但默认情况下假定为使用标准端口 (6789)。最好是指定多个 MON,以免文件系统挂载时它们并不都在线。


您可以使用 umount 命令来卸载文件系统:

[root@server ~]# umount mount-point


CephFS 内核客户端允许从 CephFS 文件系统挂载特定的子目录。例如,若要挂载 CephFS 文件系统根目录下名为 /dir/dir2 的目录,可使用下列语法:


[root@server ~]# mount -t ceph mon1:/dir1/dir2 mount-point

在使用 CephFS 内核客户端时可用的其他选项包括以下几项:


CephFS 内核客户端挂载选项

选项名称描述

name=name

要使用的 Cephx 用户名。默认为 guest。

secretfile=secret_key_file

含有此用户的 secret key 的文件路径。

rsize=bytes

指定最大读取大小,以字节为单位。

wsize=bytes

指定最大写入大小,以字节为单位。默认为不写入。


如下为一个示例 /etc/fstab 条目,它在系统启动时使用内核客户端挂载 CephFS 文件系统,而且也使用了上述选项中的一部分:

mon1,mon2:/ mount-point ceph name=admin,secretfile=/root/secret,_netdev 0 0





CephFS管理


您可以使用下列命令来管理 CephFS 文件系统:

操作

命令

创建新文件系统

ceph fs new fs-name meta-pool data-pool

列出现有的文件系统

ceph fs ls

移除文件系统

ceph fs rm fs-name [--yes-i-really-mean-it]

强制 MDS 为失败状态

ceph mds fail gid/name/role

声明 MDS 已修复,触发故障恢复

ceph mds repaired role

CephFS 也提供一组工具来检查和修复 MDS 日志 (cephfs-journal-tool) 和 MDS 表 (cephfs-table-tool),以及检查和重建元数据 (cephfs-data-scan)。





使用量和统计数据

也可以利用虚拟扩展属性来获取 CephFS 文件系统使用量的信息。getfattr 命令在与目录上 ceph. 属性 namespace 搭配使用时,可返回该目录的统计数据。CephFS 返回该目录的递归统计数据列表,如下所示:

[root@server ~]# getfattr -d -m ceph.dir.* directory-path

file: directory-path
ceph.dir.entries="1"
ceph.dir.files="0"
ceph.dir.rbytes="424617209"
ceph.dir.rctime="1341146808.804098000"
ceph.dir.rentries="39623"
ceph.dir.rfiles="37362"
ceph.dir.rsubdirs="2261"
ceph.dir.subdirs="1"

显示的统计数据中提供下列信息:


CephFS 统计数据

属性名称描述

ceph.dir.entries

直属下级的总数

ceph.dir.files

目录中常规文件的数量

ceph.dir.rbytes

子树(所在目录及所有下级)中的总文件大小

ceph.dir.rctime

子树中最近的创建时间(以秒为单位,自 epoch 1970-01-01 00:00:00 UTC 起计算)

ceph.dir.rentries

子树中下级的总数

ceph.dir.rfiles

子树中常规文件的数量

ceph.dir.rsubdirs

子树中目录的数量

ceph.dir.subdirs

目录中目录的数量





  管理快照


快照目前是实验性 CephFS 功能。启用快照可能会导致 MDS 或客户端节点意外终止。

CephFS 默认禁用快照,因为这项功能仍然处于实验阶段,并且可能会导致 MDS 或客户端节点意外终止。以下命令可以启用快照:


[ceph@server ~]$ ceph mds set allow_new_snaps true --yes-i-really-mean-it

快照使用隐藏目录,位于快照所在的目录下。这个目录的名称默认为 .snap。

在挂载 CephFS 文件系统时,-o snapdirname=name 选项可更改默认的快照目录。

若要创建快照,您需要在 .snap 目录内创建新的子目录。快照名称就是新子目录名称。

[ceph@server ~]$ mkdir .snap/snap-name

若要恢复文件,可将它从快照目录复制到常规树中。

[ceph@server ~]$ cp -a .snap/snap-name/file-name .

若要从 .snap 目录树中完整恢复快照,可将普通条目替换为所需快照中的副本。

[ceph@server ~]$ rm -rf *
[ceph@server ~]$ cp -a .snap/snap-name/* .

若要丢弃快照,可在 .snap 中删除对应的目录。与常规目录相反,即使目录为空时,rmdir 命令也会成功;因此,您不需要使用递归 rm 命令。

[ceph@server ~]$ rmdir .snap/snap-name