Ceph 文件系统简介
Ceph 文件系统 (CephFS) 是 RADOS 集群基于文件的接口。它提供了可扩展并且兼容 POSIX 的并行文件系统,将其数据和元数据作为对象存储在红帽 Ceph 存储中。CephFS 依靠运行元数据服务器 (MDS) 的集群节点来协调 RADOS 集群的访问,以及管理与其文件相关的元数据。
CephFS 的目标是尽可能像标准的 POSIX 文件系统一样运作。位于两个不同主机上的进程应该像在同一主机上一样运作。例如,CephFS 在其客户端之间维系强健的缓存连贯性,这与 NFS 不同。
文件、块和对象存储
借助基于文件的存储,您可以像使用传统文件系统一样整理自己的数据。您的数据保存在文件中,文件具有一个名称及一些关联的元数据,如修改时间戳、所有者和访问权限。基于文件的存储使用目录和子目录层次结构来整理文件的存储方式。
元数据服务器
元数据服务器 (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-pathceph.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