注意
本文档适用于 Ceph 的开发版本。
FS Volumes and Subvolumes
Ceph Manager(ceph-mgr)守护程序的 volumes 模块为 CephFS 导出提供了单一的事实来源。OpenStack 共享文件系统服务(manila)和 Ceph 容器存储接口(CSI)存储管理员使用 ceph-mgr volumes 模块提供的通用 CLI 来管理 CephFS 导出。
ceph-mgr volumes 模块实现了以下文件系统导出抽象:
FS 卷(FS volumes):CephFS 文件系统的抽象。
FS 子卷组(FS subvolume groups):比 FS 子卷高一级的目录抽象。用于对一组子卷实施策略(例如,文件布局)。
FS 子卷(FS subvolumes):独立 CephFS 目录树的抽象。
导出抽象的可能用例:
FS 子卷用作 Manila 共享或 CSI 卷。
FS 子卷组用作 Manila 共享组。
要求
Nautilus (14.2.x) 或更高版本的 Ceph 版本。
具有至少以下能力的 Cephx 客户端用户(请参阅用户管理):
mon 'allow r' mgr 'allow rw'
FS Volumes
通过运行以下形式的命令来创建卷:
ceph fs volume create <vol_name> [placement] [--data-pool <data-pool-name>] [--meta-pool <metadata-pool-name>]
此命令会创建一个 CephFS 文件系统及其数据池和元数据池。另外,如果创建 CephFS 卷所需的数据池和/或元数据池已经存在,可以将这些池名称传递给此命令,以便使用这些现有池创建卷。此命令还可以使用 Ceph Manager 编排器模块(例如 Rook)为文件系统部署 MDS 守护程序。请参阅编排器 CLI。
<vol_name> 是卷名称(任意字符串)。[placement] 是一个可选字符串,用于指定 MDS 的守护程序部署。有关部署的更多示例,请参阅部署 CephFS。
注意
通过卷接口不支持通过 YAML 文件指定部署。
通过运行以下形式的命令来删除卷:
ceph fs volume rm <vol_name> [--yes-i-really-mean-it]
此命令会删除文件系统及其数据池和元数据池。它还会尝试使用启用的 Ceph Manager 编排器模块删除 MDS 守护程序。
注意
删除卷后,如果要在同一集群上创建新的文件系统并使用子卷接口,建议重新启动 ceph-mgr。有关详细信息,请参阅 https://tracker.ceph.com/issues/49605#note-5。
注意
如果正在对卷使用 snap-schedule Ceph Manager 模块,并且该卷被删除,则 snap-schedule Ceph Manager 模块将继续保留对旧池的引用。这将导致 snap-schedule Ceph Manager 模块出现故障并记录错误。为了解决这种情况,建议在删除卷后重新启动 snap-schedule Ceph Manager 模块。如果故障仍然存在,则建议重新启动 ceph-mgr。
通过运行以下命令来列出卷:
ceph fs volume ls
通过运行以下形式的命令来重命名卷:
ceph fs volume rename <vol_name> <new_vol_name> [--yes-i-really-mean-it]
重命名卷可能是一个开销较大的操作,需要以下步骤:
重命名编排器管理的 MDS 服务以匹配
<new_vol_name>。这涉及启动一个带有<new_vol_name>的 MDS 服务,并关闭带有<vol_name>的 MDS 服务。将文件系统从
<vol_name>重命名为<new_vol_name>。将文件系统数据池和元数据池上的应用程序标签更改为
<new_vol_name>。重命名文件系统的元数据池和数据池。
授权用于 <vol_name> 的 CephX ID 必须重新授权用于 <new_vol_name>。使用这些 ID 的客户端正在进行的操作可能会中断。确保卷上的镜像已禁用。
要获取 CephFS 卷的信息,请运行以下形式的命令:
ceph fs volume info vol_name [--human_readable]
--human_readable 标志以 KB/MB/GB 为单位显示已用和可用池容量。
输出格式为 JSON,包含以下字段:
pools: 数据池和元数据池的属性avail: 可用空间量(以字节为单位)used: 已消耗的存储空间量(以字节为单位)name: 池名称
mon_addrs: Ceph Monitor 地址列表used_size: CephFS 卷当前的已用大小(以字节为单位)pending_subvolume_deletions: 待删除的子卷数量
volume info 命令的示例输出:
ceph fs volume info vol_name
{
"mon_addrs": [
"192.168.1.7:40977"
],
"pending_subvolume_deletions": 0,
"pools": {
"data": [
{
"avail": 106288709632,
"name": "cephfs.vol_name.data",
"used": 4096
}
],
"metadata": [
{
"avail": 106288709632,
"name": "cephfs.vol_name.meta",
"used": 155648
}
]
},
"used_size": 0
}
FS Subvolume Groups
通过运行以下形式的命令来创建子卷组:
ceph fs subvolumegroup create <vol_name> <group_name> [--size <size_in_bytes>] [--pool_layout <data_pool_name>] [--uid <uid>] [--gid <gid>] [--mode <octal_mode>] [--normalization <form>] [--casesensitive <bool>]
即使子卷组已存在,该命令也会成功。
创建子卷组时,可以指定其数据池布局(请参阅文件布局)、UID、GID、八进制文件模式以及大小(以字节为单位)。子卷组的大小是通过对其设置配额来指定的(请参阅CephFS 配额)。默认情况下,子卷组以八进制文件模式 755、UID 0、GID 0 和其父目录的数据池布局创建。
您还可以使用 --normalization 选项指定 Unicode 规范化形式。这将用于内部处理文件名,以便可以用不同 Unicode 代码点序列表示的 Unicode 字符都映射到相同的表示形式,这意味着它们都将访问同一个文件。但是,用户将继续看到他们创建文件时使用的名称。
Unicode 规范化形式的有效值为:
nfd:规范分解(默认)
nfc:规范分解,后跟规范组合
nfkd:兼容性分解
nfkc:兼容性分解,后跟规范组合
要了解有关 Unicode 规范化形式的更多信息,请参阅 https://unicode.org/reports/tr15
当使用 --casesensitive=0 选项时,还可以配置子卷组以进行不区分大小写的访问。添加此选项后,仅字符大小写不同的文件名将映射到同一个文件。创建文件时使用的文件名大小写将保留。
注意
设置 --casesensitive=0 选项会隐式启用子卷组上的 Unicode 规范化。
通过运行以下形式的命令来删除子卷组:
ceph fs subvolumegroup rm <vol_name> <group_name> [--force]
如果子卷组不为空或不存在,则删除子卷组失败。当其参数是不存在的子卷组时,--force 标志允许命令成功。
通过运行以下形式的命令来获取子卷组的绝对路径:
ceph fs subvolumegroup getpath <vol_name> <group_name>
通过运行以下形式的命令来列出子卷组:
ceph fs subvolumegroup ls <vol_name>
注意
主线 CephFS 中不再支持子卷组快照功能(现有的组快照仍然可以列出和删除)。
通过运行以下形式的命令来获取子卷组的元数据:
ceph fs subvolumegroup info <vol_name> <group_name>
输出格式为 JSON,包含以下字段:
atime: 子卷组路径的访问时间,格式为YYYY-MM-DD HH:MM:SSmtime: 子卷组路径的最近修改时间,格式为YYYY-MM-DD HH:MM:SSctime: 子卷组路径的最近更改时间,格式为YYYY-MM-DD HH:MM:SSuid: 子卷组路径的 UIDgid: 子卷组路径的 GIDmode: 子卷组路径的模式mon_addrs: monitor 地址列表bytes_pcent: 如果设置了配额,则为配额使用百分比,否则显示“undefined”bytes_quota: 如果设置了配额,则为配额大小(以字节为单位),否则显示“infinite”bytes_used: 子卷组当前已用大小(以字节为单位)created_at: 子卷组创建时间,格式为“YYYY-MM-DD HH:MM:SS”data_pool: 子卷组所属的数据池
通过运行以下形式的命令来检查给定子卷组是否存在:
ceph fs subvolumegroup exist <vol_name>
exist 命令输出:
subvolumegroup exists: 如果存在任何子卷组no subvolumegroup exists: 如果不存在子卷组
注意
此命令检查自定义组是否存在,而不是默认组是否存在。仅检查子卷组是否存在不足以验证卷是否为空。还必须检查子卷是否存在,因为默认组中可能存在子卷。
通过运行以下形式的命令来调整子卷组大小:
ceph fs subvolumegroup resize <vol_name> <group_name> <new_size> [--no_shrink]
此命令调整子卷组配额的大小,使用 new_size 指定的大小。--no_shrink 标志可防止子卷组缩小到当前已用大小以下。
通过将 inf 或 infinite 作为 new_size 传递,可以将子卷组大小调整为无限大。
通过运行以下形式的命令来删除子卷组的快照:
ceph fs subvolumegroup snapshot rm <vol_name> <group_name> <snap_name> [--force]
提供 --force 标志允许命令在快照不存在而否则会失败时成功。
通过运行以下形式的命令来列出子卷组的快照:
ceph fs subvolumegroup snapshot ls <vol_name> <group_name>
FS Subvolumes
Creating a subvolume
使用以下形式的命令来创建子卷:
ceph fs subvolume create <vol_name> <subvol_name> [--size <size_in_bytes>] [--group_name <subvol_group_name>] [--pool_layout <data_pool_name>] [--uid <uid>] [--gid <gid>] [--mode <octal_mode>] [--namespace-isolated] [--earmark <earmark>] [--normalization <form>] [--casesensitive <bool>] [--enctag <enctag>]
即使子卷已存在,该命令也会成功。
创建子卷时,可以指定其子卷组、数据池布局、UID、GID、八进制文件模式以及大小(以字节为单位)。子卷的大小是通过对其设置配额来指定的(请参阅CephFS 配额)。通过指定 --namespace-isolated 选项,可以在单独的 RADOS 命名空间中创建子卷。默认情况下,子卷在默认子卷组中创建,具有八进制文件模式 755、其子卷组的 UID、其子卷组的 GID、其父目录的数据池布局,且没有大小限制。您还可以使用 --earmark 选项为子卷分配一个标记。该标记是一个唯一标识符,用于标记子卷的特定用途,例如 NFS 或 SMB 服务。默认情况下,未设置标记,允许根据管理需要灵活分配。可以使用空字符串("")从子卷中删除任何现有标记。
标记机制可确保子卷被正确标记和管理,有助于避免冲突并确保每个子卷都与预期的服务或用例相关联。
Valid Earmarks
对于 NFS
有效的标记格式是顶级范围:
'nfs'。
对于 SMB
有效的标记格式为:
顶级范围:
'smb'。带有模块内范围的顶级范围:
'smb.cluster.{cluster_id}',其中cluster_id是唯一标识集群的短字符串。不带模块内范围的示例:
smb带模块内范围的示例:
smb.cluster.cluster_1
注意
如果您要将标记从一个范围更改为另一个范围(例如,从 nfs 更改为 smb,反之亦然),请注意与上一个范围关联的用户权限和 ACL 可能仍然适用。确保根据需要更新任何必要的权限以维护正确的访问控制。
创建子卷时,您还可以使用 --normalization 选项指定 Unicode 规范化形式。这将用于内部处理文件名,以便可以用不同 Unicode 代码点序列表示的 Unicode 字符都映射到相同的表示形式,这意味着它们都将访问同一个文件。但是,用户将继续看到他们创建文件时使用的名称。
Unicode 规范化形式的有效值为:
nfd:规范分解(默认)
nfc:规范分解,后跟规范组合
nfkd:兼容性分解
nfkc:兼容性分解,后跟规范组合
要了解有关 Unicode 规范化形式的更多信息,请参阅 https://unicode.org/reports/tr15
当使用 --casesensitive=0 选项时,还可以配置子卷以进行不区分大小写的访问。添加此选项后,仅字符大小写不同的文件名将映射到同一个文件。创建文件时使用的文件名大小写将保留。
注意
设置 --casesensitive=0 选项会隐式启用子卷上的 Unicode 规范化。
有一个单独的加密标签可用于加密。这用于使用对系统管理员或其他服务有用的标识符来标记子卷。默认情况下,该标签为空且可选。
加密标签可用于将子卷与其关联的加密主密钥和策略相关联。可以将 enctag 的值与相应的主密钥映射。然后可以使用它来解锁子卷。该主密钥可以存储在安全位置,例如密钥管理服务器。
Removing a Subvolume
使用以下形式的命令来删除子卷:
ceph fs subvolume rm <vol_name> <subvol_name> [--group_name <subvol_group_name>] [--force] [--retain-snapshots]
此命令删除子卷及其内容。分两步完成。首先,子卷被移动到垃圾文件夹。其次,该垃圾文件夹的内容被异步清除。
如果子卷有快照或不存在,则删除子卷失败。--force 标志允许“删除不存在的子卷”命令成功。
要删除子卷同时保留子卷的快照,请使用 --retain-snapshots 标志。如果保留了与给定子卷关联的快照,则对于不涉及保留快照的所有操作,子卷被视为空。
注意
可以使用 ceph fs subvolume create 重新创建保留快照的子卷。
注意
保留的快照可用作克隆源,用于重新创建子卷或克隆到新的子卷。
Resizing a Subvolume
使用以下形式的命令来调整子卷大小:
ceph fs subvolume resize <vol_name> <subvol_name> <new_size> [--group_name <subvol_group_name>] [--no_shrink]
此命令调整子卷配额的大小,使用 new_size 指定的大小。--no_shrink 标志可防止子卷缩小到子卷当前“已用大小”以下。
通过将 inf 或 infinite 作为 <new_size> 传递,可以将子卷大小调整为无限(但稀疏)的逻辑大小。
Listing CephX Auth IDs
使用以下形式的命令来列出授权访问文件系统子卷的 CephX auth ID:
ceph fs subvolume authorized_list <vol_name> <sub_name> [--group_name=<group_name>]
Evicting File System Clients (Auth ID)
使用以下形式的命令来根据 auth ID 和挂载的子卷驱逐文件系统客户端:
ceph fs subvolume evict <vol_name> <sub_name> <auth_id> [--group_name=<group_name>]
Fetching the Absolute Path of a Subvolume
使用以下形式的命令来获取子卷的绝对路径:
ceph fs subvolume getpath <vol_name> <subvol_name> [--group_name <subvol_group_name>]
Fetching a Subvolume’s Information
使用以下形式的命令来获取子卷的信息:
ceph fs subvolume info <vol_name> <subvol_name> [--group_name <subvol_group_name>]
输出格式为 JSON,包含以下字段:
atime: 子卷路径的访问时间,格式为YYYY-MM-DD HH:MM:SSmtime: 子卷路径的修改时间,格式为YYYY-MM-DD HH:MM:SSctime: 子卷路径的更改时间,格式为YYYY-MM-DD HH:MM:SSuid: 子卷路径的 UIDgid: 子卷路径的 GIDmode: 子卷路径的模式mon_addrs: monitor 地址列表bytes_pcent: 如果设置了配额,则为配额使用百分比;否则显示undefinedbytes_quota: 如果设置了配额,则为配额大小(以字节为单位);否则显示infinitebytes_used: 子卷当前已用大小(以字节为单位)created_at: 子卷创建时间,格式为YYYY-MM-DD HH:MM:SSdata_pool: 子卷所属的数据池path: 子卷的绝对路径type: 子卷类型,指示它是clone还是subvolumepool_namespace: 子卷的 RADOS 命名空间features: 子卷支持的功能state: 子卷的当前状态earmark: 子卷的标记source: 仅当子卷是克隆时存在。它包含源快照的名称以及源快照所在的卷、子卷组和子卷的名称。如果克隆是在 Tentacle 或更早版本中创建的,则此字段的值为“N/A”。enctag: 子卷的加密标签
如果子卷已被删除但其快照已保留,则输出仅包含以下字段:
type: 子卷类型,指示它是clone还是subvolumefeatures: 子卷支持的功能state: 子卷的当前状态
子卷的 features 基于子卷的内部版本,是以下各项的子集:
snapshot-clone: 支持使用子卷快照作为源进行克隆snapshot-autoprotect: 支持自动保护快照,防止它们在作为活动克隆源时被删除snapshot-retention: 支持删除子卷内容,同时保留任何现有快照
子卷的 state 基于子卷的当前状态,包含以下值之一:
complete: 子卷已准备好进行所有操作snapshot-retained: 子卷已删除但其快照已保留
Listing Subvolumes
使用以下形式的命令来列出子卷:
ceph fs subvolume ls <vol_name> [--group_name <subvol_group_name>]
注意
已删除但保留了快照的子卷也会被列出。
Checking for the Presence of a Subvolume
使用以下形式的命令来检查给定子卷是否存在:
ceph fs subvolume exist <vol_name> [--group_name <subvol_group_name>]
exist 命令的可能结果如下:
subvolume exists: 如果存在给定group_name的任何子卷no subvolume exists: 如果不存在给定group_name的子卷
Setting Custom Metadata on a Subvolume
使用以下形式的命令以键值对形式在子卷上设置自定义元数据:
ceph fs subvolume metadata set <vol_name> <subvol_name> <key_name> <value> [--group_name <subvol_group_name>]
注意
如果 key_name 已经存在,则旧值将被新值替换。
注意
key_name 和 value 应为 ASCII 字符字符串(如 Python 的 string.printable 中指定)。key_name 不区分大小写,并始终以小写形式存储。
注意
子卷上的自定义元数据在对子卷进行快照时不会保留,因此在克隆子卷快照时也不会保留。
Getting the Custom Metadata Set of a Subvolume
使用以下形式的命令通过元数据键获取子卷上设置的自定义元数据:
ceph fs subvolume metadata get <vol_name> <subvol_name> <key_name> [--group_name <subvol_group_name>]
Listing the Custom Metadata Set of a Subvolume
使用以下形式的命令来列出子卷上设置的自定义元数据(键值对):
ceph fs subvolume metadata ls <vol_name> <subvol_name> [--group_name <subvol_group_name>]
Removing a Custom Metadata Set from a Subvolume
使用以下形式的命令通过元数据键删除子卷上设置的自定义元数据:
ceph fs subvolume metadata rm <vol_name> <subvol_name> <key_name> [--group_name <subvol_group_name>] [--force]
使用 --force 标志允许命令在元数据键不存在而否则会失败时成功。
Getting Earmark of a Subvolume
使用以下形式的命令来获取子卷的标记:
ceph fs subvolume earmark get <vol_name> <subvol_name> [--group_name <subvol_group_name>]
Setting Earmark of a Subvolume
使用以下形式的命令来设置子卷的标记:
ceph fs subvolume earmark set <vol_name> <subvol_name> [--group_name <subvol_group_name>] <earmark>
Removing Earmark of a Subvolume
使用以下形式的命令来删除子卷的标记:
ceph fs subvolume earmark rm <vol_name> <subvol_name> [--group_name <subvol_group_name>]
Getting enctag of a subvolume
使用以下形式的命令来获取子卷上的 enctag:
ceph fs subvolume enctag get <vol_name> <subvol_name> [--group_name <subvol_group_name>]
Setting enctag of a subvolume
使用以下形式的命令来设置子卷上的 enctag:
ceph fs subvolume enctag set <vol_name> <subvol_name> [--group_name <subvol_group_name>] <enctag>
Removing enctag of a subvolume
使用以下形式的命令来删除子卷上的 enctag:
ceph fs subvolume enctag rm <vol_name> <subvol_name> [--group_name <subvol_group_name>]
Creating a Snapshot of a Subvolume
使用以下形式的命令来创建子卷的快照:
ceph fs subvolume snapshot create <vol_name> <subvol_name> <snap_name> [--group_name <subvol_group_name>]
Removing a Snapshot of a Subvolume
使用以下形式的命令来删除子卷的快照:
ceph fs subvolume snapshot rm <vol_name> <subvol_name> <snap_name> [--group_name <subvol_group_name>] [--force]
使用 --force 标志允许命令在快照不存在而否则会失败时成功。
注意
如果删除了保留快照的子卷中的最后一个快照,则该子卷也会被删除。
Fetching Path of a Snapshot of a Subvolume
使用以下形式的命令来获取子卷快照的绝对路径:
ceph fs subvolume snapshot getpath <volname> <subvol_name> <snap_name> [<group_name>]
Listing the Snapshots of a Subvolume
使用以下形式的命令来列出子卷的快照:
ceph fs subvolume snapshot ls <vol_name> <subvol_name> [--group_name <subvol_group_name>]
Fetching a Snapshot’s Information
使用以下形式的命令来获取快照的信息:
ceph fs subvolume snapshot info <vol_name> <subvol_name> <snap_name> [--group_name <subvol_group_name>]
输出格式为 JSON,包含以下字段:
created_at: 快照创建时间,格式为YYYY-MM-DD HH:MM:SS:ffffffdata_pool: 快照所属的数据池has_pending_clones: 如果快照克隆正在进行中,则为yes,否则为nopending_clones: 正在进行或待处理的克隆及其目标组列表(如果存在);否则不显示此字段orphan_clones_count: 如果快照有孤立克隆,则为孤立克隆计数,否则不显示此字段
快照克隆正在进行或待处理时的示例输出:
ceph fs subvolume snapshot info cephfs subvol snap
{
"created_at": "2022-06-14 13:54:58.618769",
"data_pool": "cephfs.cephfs.data",
"has_pending_clones": "yes",
"pending_clones": [
{
"name": "clone_1",
"target_group": "target_subvol_group"
},
{
"name": "clone_2"
},
{
"name": "clone_3",
"target_group": "target_subvol_group"
}
]
}
没有快照克隆正在进行或待处理时的示例输出:
ceph fs subvolume snapshot info cephfs subvol snap
{
"created_at": "2022-06-14 13:54:58.618769",
"data_pool": "cephfs.cephfs.data",
"has_pending_clones": "no"
}
Setting Custom Key-Value Pair Metadata on a Snapshot
使用以下形式的命令在快照上设置自定义键值元数据:
ceph fs subvolume snapshot metadata set <vol_name> <subvol_name> <snap_name> <key_name> <value> [--group_name <subvol_group_name>]
注意
如果 key_name 已经存在,则旧值将被新值替换。
注意
key_name 和值应为 ASCII 字符字符串(如 Python 的 string.printable 中指定)。key_name 不区分大小写,并始终以小写形式存储。
注意
子卷快照上的自定义元数据在对子卷进行快照时不会保留,因此在克隆子卷快照时也不会保留。
Getting Custom Metadata That Has Been Set on a Snapshot
使用以下形式的命令通过元数据键获取快照上设置的自定义元数据:
ceph fs subvolume snapshot metadata get <vol_name> <subvol_name> <snap_name> <key_name> [--group_name <subvol_group_name>]
Listing Custom Metadata That Has Been Set on a Snapshot
使用以下形式的命令来列出快照上设置的自定义元数据(键值对):
ceph fs subvolume snapshot metadata ls <vol_name> <subvol_name> <snap_name> [--group_name <subvol_group_name>]
Removing Custom Metadata from a Snapshot
使用以下形式的命令通过元数据键删除快照上设置的自定义元数据:
ceph fs subvolume snapshot metadata rm <vol_name> <subvol_name> <snap_name> <key_name> [--group_name <subvol_group_name>] [--force]
使用 --force 标志允许命令在元数据键不存在而否则会失败时成功。
Cloning Snapshots
可以通过克隆子卷快照来创建子卷。克隆是一个异步操作,它将数据从快照复制到子卷。由于克隆涉及批量复制,因此对于非常大的数据集来说速度较慢。
注意
当存在待处理或正在进行的克隆操作时,删除快照(源子卷)失败。
在 Nautilus 版本中,克隆前保护快照是先决条件。为此引入了使快照保护和取消保护成为可能的命令。此先决条件正在弃用,并可能在未来版本中删除。
正在弃用的命令是:
ceph fs subvolume snapshot protect <vol_name> <subvol_name> <snap_name> [--group_name <subvol_group_name>]
ceph fs subvolume snapshot unprotect <vol_name> <subvol_name> <snap_name> [--group_name <subvol_group_name>]
注意
使用上述命令不会导致错误,但它们没有实际用途。
注意
使用 subvolume info 命令获取有关支持的 features 的子卷元数据,以根据 snapshot-autoprotect 功能的可用性来决定是否需要保护/取消保护快照。
运行以下形式的命令来启动克隆操作:
ceph fs subvolume snapshot clone <vol_name> <subvol_name> <snap_name> <target_subvol_name>
注意
subvolume snapshot clone 命令依赖于上述配置选项 snapshot_clone_no_wait。
当快照(源子卷)属于非默认组时,运行以下形式的命令。请注意,需要指定组名称:
ceph fs subvolume snapshot clone <vol_name> <subvol_name> <snap_name> <target_subvol_name> --group_name <subvol_group_name>
克隆的子卷可以属于与源快照不同的组(默认情况下,克隆的子卷是在默认组中创建的)。运行以下形式的命令以克隆到特定组:
ceph fs subvolume snapshot clone <vol_name> <subvol_name> <snap_name> <target_subvol_name> --target_group_name <subvol_group_name>
在创建克隆子卷时可以指定池布局,类似于在创建子卷时指定池布局。运行以下形式的命令以创建具有特定池布局的克隆子卷:
ceph fs subvolume snapshot clone <vol_name> <subvol_name> <snap_name> <target_subvol_name> --pool_layout <pool_layout>
运行以下形式的命令来检查克隆操作的状态:
ceph fs clone status <vol_name> <clone_name> [--group_name <group_name>]
克隆可以处于以下状态之一:
pending: 克隆操作尚未开始in-progress: 克隆操作正在进行中complete: 克隆操作已成功完成failed: 克隆操作失败canceled: 克隆操作被用户取消
克隆失败的原因如下所示:
errno: 错误号error_msg: 失败错误字符串
这是一个 in-progress 克隆的示例:
ceph fs subvolume snapshot clone cephfs subvol1 snap1 clone1
ceph fs clone status cephfs clone1
{
"status": {
"state": "in-progress",
"source": {
"volume": "cephfs",
"subvolume": "subvol1",
"snapshot": "snap1"
},
"progress_report": {
"percentage cloned": "12.24%",
"amount cloned": "376M/3.0G",
"files cloned": "4/6"
}
}
}
当克隆处于 in-progress 状态时,输出中还会打印进度报告。这里只报告特定克隆的进度。对于所有正在进行的克隆所取得的集体进度,ceph status 命令的输出底部会打印进度条。
progress:
3 ongoing clones - average progress is 47.569% (10s)
[=============...............] (remaining: 11s)
如果克隆作业的数量多于克隆器线程,则会打印两个进度条,一个用于正在进行的克隆(如上所述),另一个用于所有(正在进行+待处理)克隆。
progress:
4 ongoing clones - average progress is 27.669% (15s)
[=======.....................] (remaining: 41s)
Total 5 clones - average progress is 41.667% (3s)
[===========.................] (remaining: 4s)
注意
failure 部分仅在克隆状态为 failed 或 cancelled 时显示。
这是一个 failed 克隆的示例:
ceph fs subvolume snapshot clone cephfs subvol1 snap1 clone1
ceph fs clone status cephfs clone1
{
"status": {
"state": "failed",
"source": {
"volume": "cephfs",
"subvolume": "subvol1",
"snapshot": "snap1"
"size": "104857600"
},
"failure": {
"errno": "122",
"errstr": "Disk quota exceeded"
}
}
}
注意
因为 subvol1 在默认组中,所以 source 对象的 clone status 不包含组名称)。
注意
克隆的子卷仅在克隆操作成功完成后才能访问。
克隆操作成功后,clone status 将如下所示:
ceph fs clone status cephfs clone1
{
"status": {
"state": "complete"
}
}
如果克隆操作失败,state 值为 failed。
要重试失败的克隆操作,必须删除不完整的克隆并再次发出克隆操作。
运行以下形式的命令来删除部分克隆:
ceph fs subvolume rm <vol_name> <clone_name> [--group_name <group_name>] --force
注意
克隆仅同步目录、常规文件和符号链接。inode 时间戳(访问和修改时间)同步到秒级粒度。
可以取消 in-progress 或 pending 克隆操作。要取消克隆操作,请使用 clone cancel 命令:
ceph fs clone cancel <vol_name> <clone_name> [--group_name <group_name>]
成功取消后,克隆的子卷将进入 canceled 状态。
ceph fs subvolume snapshot clone cephfs subvol1 snap1 clone1
ceph fs clone cancel cephfs clone1
ceph fs clone status cephfs clone1
{
"status": {
"state": "canceled",
"source": {
"volume": "cephfs",
"subvolume": "subvol1",
"snapshot": "snap1"
}
}
}
注意
通过向 fs subvolume rm 命令提供 --force 选项来删除已取消的克隆。
Configurables
配置并发克隆操作的最大数量。默认值为 4:
ceph config set mgr mgr/volumes/max_concurrent_clones <value>
暂停异步清除已删除子卷的线程。此选项在集群恢复场景中很有用:
ceph config set mgr mgr/volumes/pause_purging true
恢复清除线程:
ceph config set mgr mgr/volumes/pause_purging false
暂停异步克隆子卷快照的线程。此选项在集群恢复场景中很有用:
ceph config set mgr mgr/volumes/pause_cloning true
恢复克隆线程:
ceph config set mgr mgr/volumes/pause_cloning false
配置 snapshot_clone_no_wait 选项:
snapshot_clone_no_wait 配置选项用于在克隆器线程(可以使用上述选项(例如 max_concurrent_clones)配置)不可用时拒绝克隆创建请求。默认情况下启用。这意味着该值设置为 true,但可以通过以下命令进行配置:
ceph config set mgr mgr/volumes/snapshot_clone_no_wait <bool>
可以通过运行以下命令获取 snapshot_clone_no_wait 的当前值:
ceph config get mgr mgr/volumes/snapshot_clone_no_wait
Controlling Subvolume Snapshot Visibility
注意
此功能目前仅支持 FUSE/libcephfs 客户端。内核客户端支持正在计划中:进度可在 https://tracker.ceph.com/issues/72589 跟踪。
可以通过执行两个操作来向兼容的客户端隐藏子卷快照:
将子卷的
snapshot_visibility标志设置为false(默认为true)。将客户端配置选项
client_respect_subvolume_snapshot_visibility设置为true,用于目标客户端(默认为false)。
用于切换 snapshot_visibility 的 CLI 命令如下:
ceph fs subvolume snapshot_visibility set <vol_name> <sub_volname> [--group-name <subvol_group_name>] <true|false>
此命令更新内部 vxattr ceph.dir.subvolume.snaps.visible,并在 dirinode(即子卷的)SnapRealm 中设置 is_snapdir_visible 标志。
注意
尽管可以直接修改,但建议使用子卷 API。它更方便,并避免了设置 vxattr 时潜在的 EPERM(权限被拒绝)错误,尤其是当客户端缺少所需功能时。设置此 vxattr 的方法是:
setfattr -n ceph.dir.subvolume.snaps.visible -v 0|1 <subvolume_path>
client_respect_subvolume_snapshot_visibility 设置确定客户端是否遵循子卷的可见性标志。可以使用以下命令为每个客户端设置:
ceph config set client.<id> client_respect_subvolume_snapshot_visibility <true|false>
注意
<id> 参数是 CephX 用户。
要将 client_respect_subvolume_snapshot_visibility 配置全局应用于所有客户端,请在不指定 id 的情况下发出命令:
ceph config set client client_respect_subvolume_snapshot_visibility <true|false>
注意
MGR 守护程序作为特权 CephFS 客户端运行,因此绕过快照可见性限制。此行为是确保可靠执行快照调度和快照克隆等操作所必需的。因此,修改 client_respect_subvolume_snapshot_visibility 配置选项对 MGR 守护程序中运行的 CephFS 实例无效。
How to Disable Snapshot Visibility on a Subvolume?
例如,为了防止卷 vol1 下的子卷 sv1 的快照对使用 CephX 用户 client.user1 身份验证的客户端可见,首先使用以下命令禁用 sv1 上的 snapshot_visibility 标志:
ceph fs subvolume snapshot_visibility set vol1 sv1 false
然后使用以下命令切换客户端配置:
ceph config set client.user1 client_respect_subvolume_snapshot_visibility true
这有效地防止了使用 client.user1 挂载的客户端对 sv1 子卷的 .snap 目录执行 lookup() 调用,从而隐藏了其快照。
注意
当子卷的快照可见性被禁用时,任何快照操作(包括快照创建、删除或重命名)都会被阻止,因为它们依赖于成功的 .snap 目录查找。
注意
子卷的快照可见性完全取决于客户端是否配置为遵循子卷的 snapshot_visibility 标志。也就是说,无论标志是在子卷上设置为 true 还是 false,除非客户端的 client_respect_subvolume_snapshot_visibility 设置被明确设置为 true,否则它将被忽略。
Pinning Subvolumes and Subvolume Groups
子卷和子卷组可以根据策略自动固定到 rank。这可以以可预测和稳定的方式分配 MDS rank 上的负载。请查看手动将目录树固定到特定 rank和设置子树分区策略以了解固定的工作原理。
运行以下形式的命令来配置子卷组的固定:
ceph fs subvolumegroup pin <vol_name> <group_name> <pin_type> <pin_setting>
运行以下形式的命令来配置子卷的固定:
ceph fs subvolume pin <vol_name> <group_name> <pin_type> <pin_setting>
在大多数情况下,您会希望设置子卷组固定。pin_type 可以是 export、distributed 或 random。pin_setting 对应于上面引用的固定文档中的扩展属性“value”。
这是在子卷组上设置分布式固定策略的示例:
ceph fs subvolumegroup pin cephfilesystem-a csi distributed 1
这将为“csi”子卷组启用分布式子树分区策略。这将导致组中的每个子卷自动固定到文件系统上可用的其中一个 rank。
Normalization and Case Sensitivity
子卷组和子卷接口有一个精简层 API 来操纵 ceph.dir.charmap 配置(另请参阅CephFS 目录条目名称规范化和大小写折叠)。
Configuring the charmap
要为子卷组配置 charmap:
ceph fs subvolumegroup charmap set <vol_name> <group_name> <setting> <value>
或者为子卷配置:
ceph fs subvolume charmap set <vol_name> <subvol> <--group_name=name> <setting> <value>
例如
ceph fs subvolumegroup charmap set vol csi normalization nfd
输出:
{"casesensitive":true,"normalization":"nfd","encoding":"utf8"}
Reading the charmap
要读取子卷组的 charmap 配置:
ceph fs subvolumegroup charmap get <vol_name> <group_name> <setting>
或者为子卷配置:
ceph fs subvolume charmap get <vol_name> <subvol> <--group_name=name> <setting>
例如
ceph fs subvolume charmap get vol subvol --group_name=csi casesensitive
0
要读取子卷组的完整 charmap:
ceph fs subvolumegroup charmap get <vol_name> <group_name>
或者为子卷配置:
ceph fs subvolume charmap get <vol_name> <subvol> <--group_name=name>
例如
ceph fs subvolumegroup charmap get vol csi
输出:
{"casesensitive":false,"normalization":"nfd","encoding":"utf8"}
Removing the charmap
要删除子卷组的 charmap 配置:
ceph fs subvolumegroup charmap rm <vol_name> <group_name
或者为子卷配置:
ceph fs subvolume charmap rm <vol_name> <subvol> <--group_name=name>
例如
ceph fs subvolumegroup charmap rm vol csi
输出:
{}
注意
仅当子卷组或子卷为空时才能删除 charmap。
Subvolume Quiesce
注意
本节中的信息仅适用于 Squid 及更高版本的 Ceph。
CephFS 快照在涉及多个客户端执行写入的情况下不提供强一致性保证,这使得一致备份和灾难恢复对于分布式应用程序来说是一个严峻的挑战。即使应用程序使用文件系统刷新来同步其分布式组件之间的检查点,也无法保证所有已确认的写入都将属于给定的快照。
开发子卷静默功能是为了为使用一个或多个子卷的多客户端应用程序提供企业级一致性保证。该功能可以暂停对给定卷(文件系统)的一组子卷的 IO。在所有客户端上强制执行此类暂停,可以保证在暂停之前应用程序达到的任何持久检查点都可以从暂停期间创建的快照中恢复。
volumes Manager 插件提供了一个 CLI 来启动和等待一组子卷的暂停。此暂停称为 静默(quiesce),也用作命令名称:
ceph fs quiesce <vol_name> --set-id myset1 <[group_name/]sub_name...> --await
# perform actions while the IO pause is active, like taking snapshots
ceph fs quiesce <vol_name> --set-id myset1 --release --await
# if successful, all members of the set were confirmed as still paused and released
fs quiesce 功能基于 MDS 守护程序提供的较低级别 quiesce db 服务,该服务在文件系统路径粒度上运行。volumes 插件只是将子卷名称映射到给定文件系统上的相应路径,然后向 MDS 发出相应的 quiesce db 命令。您可以在开发者指南中了解有关低级服务的更多信息。
Operations
可以为一组一个或多个子卷(即文件系统中的路径)请求静默。这组子卷称为 静默集(quiesce set)。每个静默集都由唯一的 集 ID(set id) 标识。静默集可以通过以下方式操作:
include(包含)一个或多个子卷 - 静默集成员。
exclude(排除)一个或多个成员。
cancel(取消)该集,异步中止所有当前成员上的暂停。
release(释放)该集,请求所有成员结束暂停,并期望所有客户端都确认。
query(查询)按 ID 或所有活动集或所有已知集查询集的当前状态。
如果需要立即恢复 IO,则cancel all(取消所有)活动集。
上面列出的操作是非阻塞的:它们尝试进行预期的修改,并返回目标集的最新版本,无论操作是否成功。由于修改,集可能会更改状态,并且响应中返回的版本保证与此以及可能来自同一控制循环批次的其他成功操作的状态一致。
某些集状态是 可等待的(awaitable)。我们将在下面讨论这些,但现在重要的是要提到,上面的任何命令都可以通过 await 修饰符进行修改,这将导致它们在应用预期的修改后阻塞集,只要结果集状态是 可等待的。此类命令将阻塞,直到集达到等待状态、被另一个命令修改或转换到另一个状态。返回码将明确标识退出条件,并且响应内容将始终携带最新的已知集状态。
图表上 可等待的 状态标有 (a) 或 (A)。操作的阻塞版本将在集处于 (a) 状态时挂起,如果集达到 (A) 状态,则成功完成。如果集已经处于 (A) 状态,则操作立即成功完成。
大多数操作都需要集 ID。例外情况是:
创建新集时未指定集 ID,
查询活动集或所有已知集,以及
取消所有
通过 include 或 reset 命令包含成员来创建新集。可以指定集 ID,如果它是新 ID,则将使用指定的成员以 QUIESCING 状态创建集。如果在包含或重置成员时未指定集 ID,则会创建一个具有唯一集 ID 的新集。调用者将通过检查输出了解集 ID:
ceph fs quiesce fs1 sub1 --set-id=unique-id
{
"epoch": 3,
"set_version": 1,
"sets": {
"unique-id": {
"version": 1,
"age_ref": 0.0,
"state": {
"name": "TIMEDOUT",
"age": 0.0
},
"timeout": 0.0,
"expiration": 0.0,
"members": {
"file:/volumes/_nogroup/sub1/b1fcce76-3418-42dd-aa76-f9076d047dd3": {
"excluded": false,
"state": {
"name": "QUIESCING",
"age": 0.0
}
}
}
}
}
}
输出包含我们刚刚成功创建的集,但它已经 TIMEDOUT。这是预期的,因为我们没有为此静默指定超时,并且我们可以在输出中看到它默认初始化为 0,以及到期时间。
Timeouts
两个超时参数 timeout 和 expiration 是防止意外导致应用程序 DOS 条件的主要保护措施。对活动集的任何命令都可以携带 --timeout 或 --expiration 参数来更新集的这些值。如果存在,这些值将在此命令请求的操作之前应用。
ceph fs quiesce fs1 --set-id=unique-id --timeout=10 > /dev/null
Error EPERM:
对于我们的 unique-id 集来说已经太晚了,因为它处于终止状态。处于终止状态(即非活动)的集不允许进行更改。让我们创建一个新集:
ceph fs quiesce fs1 sub1 --timeout 60
{
"epoch": 3,
"set_version": 2,
"sets": {
"8988b419": {
"version": 2,
"age_ref": 0.0,
"state": {
"name": "QUIESCING",
"age": 0.0
},
"timeout": 60.0,
"expiration": 0.0,
"members": {
"file:/volumes/_nogroup/sub1/b1fcce76-3418-42dd-aa76-f9076d047dd3": {
"excluded": false,
"state": {
"name": "QUIESCING",
"age": 0.0
}
}
}
}
}
}
这次,我们没有指定集 ID,因此系统创建了一个新 ID。我们在输出中看到了它的 ID,它是 8988b419。命令成功了,我们看到这次集处于 QUIESCING 状态。此时,我们可以向集中添加更多成员:
ceph fs quiesce fs1 --set-id 8988b419 --include sub2 sub3
{
"epoch": 3,
"set_version": 3,
"sets": {
"8988b419": {
"version": 3,
"age_ref": 0.0,
"state": {
"name": "QUIESCING",
"age": 30.7
},
"timeout": 60.0,
"expiration": 0.0,
"members": {
"file:/volumes/_nogroup/sub1/b1fcce76-3418-42dd-aa76-f9076d047dd3": {
"excluded": false,
"state": {
"name": "QUIESCING",
"age": 30.7
}
},
"file:/volumes/_nogroup/sub2/bc8f770e-7a43-48f3-aa26-d6d76ef98d3e": {
"excluded": false,
"state": {
"name": "QUIESCING",
"age": 0.0
}
},
"file:/volumes/_nogroup/sub3/24c4b57b-e249-4b89-b4fa-7a810edcd35b": {
"excluded": false,
"state": {
"name": "QUIESCING",
"age": 0.0
}
}
}
}
}
}
--include 位是可选的,因为如果在提供成员时未给出任何操作,则假定为“include”。
如我们所见,timeout 参数指定了我们愿意给系统多长时间来达到集的 QUIESCED 状态。然而,由于新成员可以随时添加到活动集中,从集创建时间开始测量超时是不公平的。因此,超时按成员跟踪:每个成员有 timeout 秒的时间来静默,如果任何一个成员花费的时间超过此时间,则整个集将被标记为 TIMEDOUT 并释放暂停。
一旦集处于 QUIESCED 状态,它将开始其到期计时器。此计时器按集整体跟踪,而不是按成员跟踪。一旦 expiration 秒过去,集将转换到 EXPIRED 状态,除非它被专用操作主动释放或取消。
可以向 QUIESCED 集添加新成员。在这种情况下,它将转换回 QUIESCING,并且新成员将有自己的超时时间来静默。如果它们成功,则集将再次 QUIESCED,并且到期计时器将重新启动。
警告
当集处于 QUIESCING 状态时,到期计时器 不适用;当集变为 QUIESCED 时,它会重置为 expiration 属性的值。
timeout 不适用于处于 QUIESCED 状态的成员。
Awaiting
请注意,上面的命令都是非阻塞的。如果我们想等待静默集达到 QUIESCED 状态,我们应该在某个时刻等待它。--await 可以与其他参数一起提供,让系统知道我们的意图。
有两种等待类型:quiesce await 和 release await。前者是默认值,后者只能通过参数列表中存在 --release 来实现。为避免混淆,当集未处于 QUIESCING 状态时,不允许发出 quiesce await。尝试 --release 一个未处于 QUIESCED 状态的集也是 EPERM 错误,无论是否同时请求等待。然而,release await 一个已经释放的集,或者 quiesce await 一个 QUIESCED 集,不是错误 - 它们是成功的空操作。
由于在应用 --await 增强命令后等待集,因此等待操作可能会用其自身的错误掩盖成功结果。一个很好的例子是尝试 cancel-await 一个集:
ceph fs quiesce fs1 --set-id set1 --cancel --await
{
// ...
"sets": {
"set1": {
// ...
"state": {
"name": "CANCELED",
"age": 0
},
// ...
}
}
}
Error EPERM:
尽管 --cancel 对于处于活动状态的集会同步成功,但等待已取消的集是不允许的,因此此调用将导致 EPERM。这与返回 EINVAL 错误(表示用户方面的错误)故意不同,以简化在请求 --await 时系统的行为。因此,这也是用户使用的更简单的模型。
等待时,可以指定他们希望此等待请求阻塞的最长时间,这与上面讨论的两个固有集超时正交。如果在指定持续时间内未达到目标等待状态,则返回 EINPROGRESS。为此,应该使用参数 --await-for=<seconds>。可以将 --await 视为等同于 --await-for=Infinity。虽然同时指定这两个参数没有意义,但这不被视为错误。如果 --await 和 --await-for 都存在,则前者将被忽略,并以 --await-for 中的时间限制为准。
time ceph fs quiesce fs1 sub1 --timeout=10 --await-for=2
{
"epoch": 6,
"set_version": 3,
"sets": {
"c3c1d8de": {
"version": 3,
"age_ref": 0.0,
"state": {
"name": "QUIESCING",
"age": 2.0
},
"timeout": 10.0,
"expiration": 0.0,
"members": {
"file:/volumes/_nogroup/sub1/b1fcce76-3418-42dd-aa76-f9076d047dd3": {
"excluded": false,
"state": {
"name": "QUIESCING",
"age": 2.0
}
}
}
}
}
}
Error EINPROGRESS:
ceph fs quiesce fs1 sub1 --timeout=10 --await-for=2 0.41s user 0.04s system 17% cpu 2.563 total
(至少在本地调试设置中,Ceph 客户端会增加约 0.5 秒的开销)
Quiesce-Await and Expiration
静默等待有一个副作用:它会重置内部到期计时器。这允许通过重复 --await 一个已经 QUIESCED 的集来对 IO 暂停下的长时间运行的多步骤过程采用看门狗方法。考虑以下示例脚本:
set -e # (1)
ceph fs quiesce fs1 sub1 sub2 sub3 --timeout=30 --expiration=10 --set-id="snapshots" --await # (2)
ceph fs subvolume snapshot create a sub1 snap1-sub1 # (3)
ceph fs quiesce fs1 --set-id="snapshots" --await # (4)
ceph fs subvolume snapshot create a sub2 snap1-sub2 # (3)
ceph fs quiesce fs1 --set-id="snapshots" --await # (4)
ceph fs subvolume snapshot create a sub3 snap1-sub3 # (3)
ceph fs quiesce fs1 --set-id="snapshots" --release --await # (5)
警告
此示例使用任意超时来传达概念。在现实生活中,必须根据实际的系统要求和规范仔细选择这些值。
脚本的目标是为 3 个子卷拍摄一致的快照。我们首先设置 bash -e 选项 (1),如果任何后续命令返回非零状态,则退出此脚本。
我们接着请求对三个子卷进行 IO 暂停 (2)。我们设置了超时,允许系统最多花费 30 秒才能在所有成员上达到静默状态,并保持静默最多 10 秒,然后静默到期并恢复 IO。我们还指定了 --await 以便仅在达到静默状态后才继续。
然后我们继续执行一组命令对,它们拍摄下一个快照并调用 --await 我们的集,以将到期超时延长 10 秒 (3,4)。这种方法为我们每个快照提供了最多 10 秒的时间,但也允许我们拍摄任意数量的快照,而不会失去 IO 暂停,从而失去一致性。如果需要,我们可以每次调用等待时更新 expiration。
如果任何快照卡住并花费超过 10 秒才能完成,则下一次调用 --await 将返回错误,因为该集合将处于 EXPIRED 状态,这不是可等待的状态。这限制了在糟糕情况场景下对应用程序的影响。
我们本可以在开始时将 expiration 超时设置为 30 (2),但这将意味着单个卡住的快照会使应用程序在此期间一直处于挂起状态。
如果版本
有时,仅仅观察到成功的静默或释放是不够的。原因可能是另一个客户端同时更改了集合。考虑这个例子
ceph fs quiesce fs1 sub1 sub2 sub3 --timeout=30 --expiration=60 --set-id="snapshots" --await # (1)
ceph fs subvolume snapshot create a sub1 snap1-sub1 # (2)
ceph fs subvolume snapshot create a sub2 snap1-sub2 # (3)
ceph fs subvolume snapshot create a sub3 snap1-sub3 # (4)
ceph fs quiesce fs1 --set-id="snapshots" --release --await # (5)
序列看起来不错,释放 (5) 成功完成。然而,可能在为 sub3 (4) 拍摄快照之前,另一个会话将 sub3 从集合中排除,恢复了它的 IO。
ceph fs quiesce fs1 --set-id="snapshots" --exclude sub3
由于从集合中删除成员不会影响其 QUIESCED 状态,因此释放命令 (5) 没有理由失败。它将确认两个未被排除的成员 sub1 和 sub2 并报告成功。
为了解决这个问题或类似问题,静默命令支持乐观并发模式。要激活它,需要传递一个 --if-version=<version>,它将与集合的 db 版本进行比较,并且操作只有在值匹配时才会继续。否则,该命令将不会被执行,并且返回状态将是 ESTALE。
很容易知道集合的预期版本,因为每个修改集合的命令都会在 stdout 上返回这个集合,无论退出状态如何。在上面的例子中,可以看到每个集合都带有一个 "version" 属性,该属性在集合被修改时更新,无论是用户显式修改还是在
在本小节开头的示例中,初始静默命令 (1) 本应返回新创建的集合,其 ID 为 "snapshots",版本号为(例如)13。由于我们不期望在执行命令 (2,3,4) 拍摄快照时对集合进行任何其他更改,因此释放命令 (5) 可能如下所示
ceph fs quiesce fs1 --set-id="snapshots" --release --await --if-version=13 # (5)
通过这种方式,释放命令的结果将是 ESTALE 而不是 0,并且我们会知道静默集出了问题,并且我们的快照可能不一致。
提示
当使用 --if-version 并且命令返回 ESTALE 时,请求的操作未执行。这意味着脚本可能希望对集合执行一些无条件命令,以根据要求调整其状态。
--if-version 参数还有另一个用途,对于自动化软件可能会很有用。正如我们前面讨论过的,可以使用给定的集合 ID 创建一个新的静默集。像 Kubernetes 的 CSI 这样的驱动程序可以使用其内部请求 ID 来消除保留到静默集 ID 的额外映射的需要。然而,为了保证唯一性,驱动程序可能希望验证该集合确实是新的。为此,可以使用 if-version=0,并且它只会在数据库中不存在具有此 ID 的其他集合时创建新集合。
ceph fs quiesce fs1 sub1 sub2 sub3 --set-id="external-id" --if-version=0
禁用卷插件
默认情况下,卷插件处于启用状态并设置为 always on。但是,在某些情况下,禁用它可能是合适的。例如,当 CephFS 处于降级状态时,卷插件命令可能会在 MGR 中积累而不是得到服务。这最终导致策略节流生效,并且 MGR 变得无响应。
在这种情况下,即使卷插件是 MGR 中的 always on 模块,也可以禁用它。为此,请运行 ceph mgr module disable volumes --yes-i-really-mean-it。请注意,此命令将禁用卷插件的操作并删除命令,因为它将禁用通过此插件访问的 Ceph 集群上的所有 CephFS 服务。
在诉诸于如此激烈的措施之前,尝试不那么激烈的措施,然后评估文件系统体验是否因此而改善,这是一个好主意。这种不那么激烈的措施的一个例子是禁用卷插件为克隆和清除垃圾而启动的异步线程。有关这些详细信息,请参阅:暂停清除线程 和 暂停克隆线程。
注意
直到 Tentacle 版本,CephFS 卷的池命名空间采用这种格式:“fsvolumens__<subvol-name>”。然而,当两个相同子卷位于不同子卷组中时,这可能会导致命名空间冲突。因此,在 Tentacle 之后,池命名空间格式更改为“fsvolumens__<subvol-grp-name>_<subvol-name>”。