23 集群化文件系统 #
本章介绍在设置集群并导出 CephFS 后通常应执行的管理任务。如需有关设置 CephFS 的详细信息,请参见第 8.3.3 节 “部署元数据服务器”。
23.1 挂载 CephFS #
当创建文件系统并且 MDS 处于工作状态后,您便可以从客户端主机挂载文件系统。
23.1.1 准备客户端 #
如果客户端主机运行的是 SUSE Linux Enterprise 12 SP2 或更高版本,系统无需额外配置即可挂载 CephFS。
如果客户端主机运行的是 SUSE Linux Enterprise 12 SP1,您需要应用所有最新的补丁,之后才能挂载 CephFS。
无论是哪一种情况,SUSE Linux Enterprise 中都包含了挂载 CephFS 需要的所有项目。不需要 SUSE Enterprise Storage 7.1 产品。
要支持完整的 mount
语法,在尝试挂载 CephFS 之前,应该先安装 ceph-common 软件包(随附于 SUSE Linux Enterprise 中)。
如果不安装 ceph-common 软件包(因而也就未安装 mount.ceph
助手),将需要使用 Monitor 的 IP 而非其名称。这是因为内核客户端将无法执行名称解析。
基本挂载语法如下:
#
mount -t ceph MON1_IP[:PORT],MON2_IP[:PORT],...:CEPHFS_MOUNT_TARGET \
MOUNT_POINT -o name=CEPHX_USER_NAME,secret=SECRET_STRING
23.1.2 创建秘密密钥文件 #
Ceph 集群默认是在启用身份验证的情况下运行的。应该创建一个文件用于存储您的秘密密钥(而不是密钥环本身)。要获取特定用户的秘密密钥,然后创建该文件,请执行以下操作:
在密钥环文件中查看特定用户的密钥:
cephuser@adm >
cat /etc/ceph/ceph.client.admin.keyring复制要使用所挂载 Ceph FS 文件系统的用户的密钥。密钥通常类似下方所示:
AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w==
为用户 admin 创建一个文件名包含用户名的文件,例如
/etc/ceph/admin.secret
。将密钥值粘贴到上一步中创建的文件。
设置对该文件的适当访问权限。该用户应是唯一有权读取该文件的用户,其他人不能有任何访问权限。
23.1.3 挂载 CephFS #
可以使用 mount
命令挂载 CephFS。需要指定 Monitor 的主机名或 IP 地址。由于 SUSE Enterprise Storage 中默认会启用 cephx
身份验证,因此,您还需要指定一个用户名及其相关的机密:
#
mount -t ceph ceph_mon1:6789:/ /mnt/cephfs \
-o name=admin,secret=AQATSKdNGBnwLhAAnNDKnH65FmVKpXZJVasUeQ==
由于上一条命令会保留在外壳历史中,因此更安全的做法是从文件读取机密:
#
mount -t ceph ceph_mon1:6789:/ /mnt/cephfs \
-o name=admin,secretfile=/etc/ceph/admin.secret
请注意,机密文件应该只包含实际的密钥环机密。因此,在本示例中,该文件只包含下行:
AQATSKdNGBnwLhAAnNDKnH65FmVKpXZJVasUeQ==
最好是在 mount
命令行中指定多个 Monitor 并以逗号分隔,以防在挂载时某个 Monitor 恰好停机。每个 Monitor 的地址采用主机[:端口]
格式。如果未指定端口,默认会使用端口 6789。
在本地主机上创建挂载点:
#
mkdir /mnt/cephfs
挂载 CephFS:
#
mount -t ceph ceph_mon1:6789:/ /mnt/cephfs \
-o name=admin,secretfile=/etc/ceph/admin.secret
如果要挂载文件系统的某个子集,可以指定子目录 subdir
:
#
mount -t ceph ceph_mon1:6789:/subdir /mnt/cephfs \
-o name=admin,secretfile=/etc/ceph/admin.secret
可在 mount
命令中指定多个 Monitor 主机:
#
mount -t ceph ceph_mon1,ceph_mon2,ceph_mon3:6789:/ /mnt/cephfs \
-o name=admin,secretfile=/etc/ceph/admin.secret
如果使用了实施路径限制的客户端,则 MDS 功能需要包含对根目录的读取访问权限。例如,密钥环可能如下所示:
client.bar key: supersecretkey caps: [mds] allow rw path=/barjail, allow r path=/ caps: [mon] allow r caps: [osd] allow rwx
allow r path=/
部分表示路径受限的客户端能够查看根卷,但无法写入根卷。在要求完全隔离的用例中,这可能会造成问题。
23.2 卸载 CephFS #
要卸载 CephFS,请使用 umount
命令:
#
umount /mnt/cephfs
23.3 在 /etc/fstab
中挂载 CephFS #
要在客户端启动时自动挂载 CephFS,请在其文件系统表 /etc/fstab
中插入相应的行:
mon1:6790,mon2:/subdir /mnt/cephfs ceph name=admin,secretfile=/etc/ceph/secret.key,noatime,_netdev 0 2
23.4 多个活动 MDS 守护进程(主动/主动 MDS) #
默认情况下,CephFS 是针对单个工作的 MDS 守护进程配置的。要调整大规模系统的元数据性能,可以启用多个工作的 MDS 守护进程,以便互相分担元数据工作负载。
23.4.1 使用主动/主动 MDS #
如果按默认设置使用单个 MDS 时元数据性能出现瓶颈,可考虑使用多个工作的 MDS 守护进程。
增加守护进程并不会提高所有工作负载类型的性能。例如,增加 MDS 守护进程的数量不会让单个客户端上运行的单个应用受益,除非该应用在同时执行大量元数据操作。
通常能够因大量工作的 MDS 守护进程受益的工作负载是使用许多客户端的工作负载,也许是在许多独立目录中工作的工作负载。
23.4.2 增加 MDS 活动集群的大小 #
每个 CephFS 文件系统都有一项 max_mds
设置,用于控制将要创建的级别数。仅当某个备用守护进程可供新的级别使用时,文件系统中的实际级别数才会增加。例如,如果只有一个 MDS 守护进程在运行,并且 max_mds
设置为 2,将不会创建另一个级别。
在下面的示例中,我们将 max_mds
选项设置为 2,以便在保留默认级别的情况下再创建一个新级别。要查看更改,请在设置 max_mds
之前和之后运行 ceph status
,然后观察包含 fsmap
的行:
cephuser@adm >
ceph
status [...] services: [...] mds: cephfs-1/1/1 up {0=node2=up:active}, 1 up:standby [...]cephuser@adm >
ceph
fs set cephfs max_mds 2cephuser@adm >
ceph
status [...] services: [...] mds: cephfs-2/2/2 up {0=node2=up:active,1=node1=up:active} [...]
新建的级别 (1) 会经历“正在创建”状态,然后进入“工作”状态。
即使使用多个工作 MDS 守护进程,当任何在运行工作守护进程的服务器发生故障时,高可用性系统也仍会要求待机守护进程接管工作。
因此,高可用性系统的 max_mds
合理最大值比系统中的 MDS 服务器总数小 1。要在发生多次服务器故障时保持可用性,可增加系统中待机守护进程的数量,使之与不会导致失去可用性的服务器故障数一致。
23.4.3 减小级别数量 #
所有级别(包括要删除的级别)首先必须是活跃的。这意味着,至少需要有 max_mds
个 MDS 守护进程可用。
首先,将 max_mds
设为一个较小的数字。例如,我们重新使用单个工作的 MDS:
cephuser@adm >
ceph
status [...] services: [...] mds: cephfs-2/2/2 up {0=node2=up:active,1=node1=up:active} [...]cephuser@adm >
ceph
fs set cephfs max_mds 1cephuser@adm >
ceph
status [...] services: [...] mds: cephfs-1/1/1 up {0=node2=up:active}, 1 up:standby [...]
23.4.4 手动将目录树关联到级别 #
在多个工作元数据服务器配置中,将会运行一个平衡器,用于在集群中均衡分配元数据负载。这种模式通常足以满足大多数用户的需求,但有时,用户需要使用元数据到特定级别的显式映射来覆盖动态平衡器。这样,管理员或用户便可以在整个集群上均衡地分配应用负载,或限制用户的元数据请求对整个集群的影响。
针对此目的提供的机制称为“导出关联”。它是目录的扩展属性。此扩展属性名为 ceph.dir.pin
。用户可以使用标准命令设置此属性:
#
setfattr -n ceph.dir.pin -v 2 /path/to/dir
扩展属性的值 (-v
) 是要将目录子树指定到的级别。默认值 -1 表示不关联该目录。
目录导出关联继承自设置了导出关联的最近的父级。因此,对某个目录设置导出关联会影响该目录的所有子级。但是,可以通过设置子目录导出关联来覆盖父级的关联。例如:
#
mkdir -p a/b # "a" and "a/b" start with no export pin set.
setfattr -n ceph.dir.pin -v 1 a/ # "a" and "b" are now pinned to rank 1.
setfattr -n ceph.dir.pin -v 0 a/b # "a/b" is now pinned to rank 0
# and "a/" and the rest of its children
# are still pinned to rank 1.
23.5 管理故障转移 #
如果 MDS 守护进程停止与 Monitor 通讯,Monitor 会等待 mds_beacon_grace
秒(默认为 15 秒),然后将守护进程标记为 laggy。可以配置一个或多个“待机”守护进程,用于在 MDS 守护进程故障转移期间接管工作。
23.5.1 配置待机重放 #
可以配置每个 CephFS 文件系统以添加待机重放守护进程。这些待机守护进程会跟随活动 MDS 的元数据日志,以缩短当活动 MDS 变为不可用状态时的故障转移时间。每个活动 MDS 只能有一个跟随它的待机重放守护进程。
可以使用以下命令在文件系统上配置待机重放:
cephuser@adm >
ceph fs set FS-NAME allow_standby_replay BOOL
设置待机重放后,Monitor 将会指定该文件系统中可用于跟随活动 MDS 的待机守护进程。
当某个 MDS 进入待机重放状态后,它只会用作所跟随级别的待机守护进程。如果另一个级别发生故障,此待机重放守护进程不会作为替代者,即使没有其他待机守护进程可用也是如此。因此,如果使用了待机重放,则建议每个活动 MDS 都应有一个待机重放守护进程。
23.6 设置 CephFS 配额 #
您可以对 Ceph 文件系统的任何子目录设置配额。配额可限制目录层次结构中指定点下所存储的字节或文件数。
23.6.1 CephFS 配额限制 #
CephFS 的配额设置具有以下限制:
- 配额是合作性而非竞争性的。
达到限制时,Ceph 配额依赖挂载文件系统的客户端来停止向其写入数据。服务器端无法阻止恶意客户端写入所需数量的数据。在客户端完全不受信任的环境中,请勿使用配额来阻止填充文件系统。
- 配额并不精确。
在达到配额限制不久后,系统便会停止向文件系统写入数据的进程。这样便会不可避免地允许这些进程在超出配置的限制后又写入一定数量的数据。系统将会在超出所配置限制后的十分之一秒内停止客户端写入程序。
- 配额是在自 4.17 版本起的内核客户端中实施的。
配额受用户空间客户端(libcephfs、ceph-fuse)支持。4.17 及更高版本的 Linux 内核客户端支持 SUSE Enterprise Storage 7.1 集群上的 CephFS 配额。内核客户端(甚至最近的版本)无法处理较旧集群的配额,即便它们可以设置配额扩展属性也是如此。SLE12-SP3(及更高版本)内核始终包含必要的向后移植能力,以处理配额。
- 与基于路径的挂载限制搭配使用时,需谨慎配置配额。
客户端需要有权访问配置了配额的目录 Inode,才能强制实施这些配额。如果根据 MDS 用户权限,客户端对特定路径(例如
/home/user
)的访问受到限制,并且配额是对其无权访问的祖先目录 (/home
) 配置的,则客户端将无法强制实施该配额。使用基于路径的访问限制时,请务必对客户端可以访问的目录(例如/home/user
或/home/user/quota_dir
)配置配额。
23.6.2 配置 CephFS 配额 #
您可以使用虚拟扩展属性来配置 CephFS 配额:
ceph.quota.max_files
配置文件限制。
ceph.quota.max_bytes
配置字节限制。
如果某个目录 Inode 存在这些属性,即表示该位置配置了配额。如果不存在,则表示未对该目录配置配额(即便可能对父目录配置了配额)。
要设置 100 MB 的配额,请运行以下命令:
cephuser@mds >
setfattr -n ceph.quota.max_bytes -v 100000000 /SOME/DIRECTORY
要设置 10,000 个文件的配额,请运行以下命令:
cephuser@mds >
setfattr -n ceph.quota.max_files -v 10000 /SOME/DIRECTORY
要查看配额设置,请运行以下命令:
cephuser@mds >
getfattr -n ceph.quota.max_bytes /SOME/DIRECTORY
cephuser@mds >
getfattr -n ceph.quota.max_files /SOME/DIRECTORY
如果扩展属性的值为“0”,表示未设置配额。
要删除配额,请运行以下命令:
cephuser@mds >
setfattr -n ceph.quota.max_bytes -v 0 /SOME/DIRECTORYcephuser@mds >
setfattr -n ceph.quota.max_files -v 0 /SOME/DIRECTORY
23.7 管理 CephFS 快照 #
在截取 CephFS 快照时,快照会创建此时间点文件系统的只读视图。您可以在任何目录中创建快照。快照将涵盖文件系统中指定目录下的所有数据。创建快照后,系统会从各客户端异步清理缓冲数据。因此,创建快照的速度十分快。
如果您有多个 CephFS 文件系统在共享一个存储池(通过名称空间),则这些文件系统的快照将会发生冲突,并且删除其中一个快照将会导致共享同一存储池的其他快照缺少文件数据。
23.7.1 创建快照 #
对于新文件系统,系统默认会启用 CephFS 快照特性。要对现有文件系统启用该特性,请运行以下命令:
cephuser@adm >
ceph fs set CEPHFS_NAME allow_new_snaps true
启用快照后,CephFS 中的所有目录都将包含一个特殊的 .snap
子目录。
这是个虚拟子目录。它不会出现在父目录的目录列表中,但您不能使用 .snap
名称作为文件或目录名称。要访问 .snap
目录,需要采用显式访问方式,例如:
>
ls -la /CEPHFS_MOUNT/.snap/
CephFS 内核客户端存在一个限制:一旦文件系统中所含快照数量超过 400 个,它们将无法处理。快照的数量应始终低于此上限,无论使用哪个客户端均如此。如果使用较旧的 CephFS 客户端(例如 SLE12-SP3),请记住,快照数量超过 400 个对运行十分有害,因为这会导致客户端崩溃。
您可以通过设置 client snapdir
设置来为快照子目录配置其他名称。
要创建快照,请以自定义名称在 .snap
目录下创建子目录。例如,要创建目录 /CEPHFS_MOUNT/2/3/
的快照,请运行以下命令:
>
mkdir /CEPHFS_MOUNT/2/3/.snap/CUSTOM_SNAPSHOT_NAME
23.7.2 删除快照 #
要删除某个快照,请在 .snap
目录中删除该快照的子目录:
>
rmdir /CEPHFS_MOUNT/2/3/.snap/CUSTOM_SNAPSHOT_NAME