注意
本文档适用于 Ceph 的开发版本。
配置多个活动 MDS 守护进程
亦称:multi-mds, active-active MDS
每个 CephFS 文件系统默认配置为单个活动 MDS 守护进程。为了提高大规模系统的元数据性能,您可以启用多个活动 MDS 守护进程,它们将相互共享元数据工作负载。
何时使用多个活动 MDS 守护进程?
当您的元数据性能受限于默认运行的单个 MDS 时,您应该配置多个活动 MDS 守护进程。
添加更多守护进程可能无法提高所有工作负载的性能。通常,单个客户端上运行的单个应用程序不会从增加 MDS 守护进程数量中受益,除非该应用程序正在并行执行大量元数据操作。
通常受益于较多活动 MDS 守护进程的工作负载是那些具有许多客户端、可能在许多不同目录上工作的工作负载。
增加 MDS 活动集群大小
每个 CephFS 文件系统都有一个 max_mds 设置,它控制将创建多少个等级。文件系统中实际的等级数量只有在有备用守护进程可以承担新等级时才会增加。例如,如果只有一个 MDS 守护进程正在运行,并且 max_mds 设置为二,则不会创建第二个等级。(请注意,这种配置不是高可用性 (HA) 的,因为没有备用守护进程可以接管失败的等级。当以这种方式配置时,集群会通过健康警告发出投诉。)
将 max_mds 设置为所需的等级数量。在以下示例中,显示了“ceph status”的“fsmap”行,以说明命令的预期结果。
# fsmap e5: 1/1/1 up {0=a=up:active}, 2 up:standby
ceph fs set <fs_name> max_mds 2
# fsmap e8: 2/2/2 up {0=a=up:active,1=c=up:creating}, 1 up:standby
# fsmap e9: 2/2/2 up {0=a=up:active,1=c=up:active}, 1 up:standby
新创建的等级 (1) 将经过“创建中”(creating) 状态,然后进入“活动”(active) 状态。
备用守护进程
即使有多个活动 MDS 守护进程,高可用性系统仍然需要备用守护进程来接管运行活动守护进程的服务器中的任何一个发生故障的情况。
因此,对于高可用性系统而言,max_mds 的实际最大值最多比您系统中的 MDS 服务器总数少一个。
为了在发生多次服务器故障时仍保持可用性,请增加系统中的备用守护进程数量,使其与您希望能够承受的服务器故障数量相匹配。
减少等级数量
减少等级数量就像减少 max_mds 一样简单
# fsmap e9: 2/2/2 up {0=a=up:active,1=c=up:active}, 1 up:standby
ceph fs set <fs_name> max_mds 1
# fsmap e10: 2/2/1 up {0=a=up:active,1=c=up:stopping}, 1 up:standby
# fsmap e10: 2/2/1 up {0=a=up:active,1=c=up:stopping}, 1 up:standby
...
# fsmap e10: 1/1/1 up {0=a=up:active}, 2 up:standby
集群将自动逐步停止多余的等级,直到达到 max_mds。
有关 <role> 可以采取的更多形式,请参阅 CephFS 管理命令。
注意:停止的等级将首先进入停止状态一段时间,在此期间它会将其元数据份额移交给剩余的活动守护进程。此阶段可能需要几秒到几分钟。如果 MDS 似乎卡在停止状态,则应将其作为可能的错误进行调查。
如果 MDS 守护进程在处于 up:stopping 状态时崩溃或被终止,备用守护进程将接管,并且集群监视器将再次尝试停止该守护进程。
当守护进程完成停止后,它将重新生成自身并返回到备用状态。
手动将目录树固定到特定等级
在多个活动元数据服务器配置中,运行一个均衡器,它致力于在整个集群中均匀分配元数据负载。这通常对大多数用户来说效果很好,但有时需要用元数据到特定等级的显式映射来覆盖动态均衡器。这允许管理员或用户均匀地分散应用程序负载,或限制用户元数据请求对整个集群的影响。
为此目的提供的机制称为 导出固定(export pin),它是目录的一个扩展属性。此扩展属性的名称是 ceph.dir.pin。用户可以使用标准命令设置此属性
setfattr -n ceph.dir.pin -v 2 path/to/dir
扩展属性的值是分配给目录子树的等级。默认值 -1 表示目录未固定。
目录的导出固定继承自其设置了导出固定的最近父目录。通过这种方式,在目录上设置导出固定会影响其所有子目录。但是,父目录的固定可以通过设置子目录的导出固定来覆盖。例如
mkdir -p a/b
# "a" and "a/b" both start without an 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
设置子树分区策略
还可以通过一组策略设置子树的自动静态分区。在 CephFS 中,这种自动静态分区被称为短暂固定(ephemeral pinning)。根据其inode号的一致性哈希,任何短暂固定的目录(inode)都会自动分配给特定等级。所有短暂固定的目录集应该均匀分布在所有等级上。
短暂固定的目录之所以如此命名,是因为一旦目录inode从缓存中删除,固定可能不会持续存在。但是,MDS 故障转移不会影响固定目录的短暂性质。MDS 在其日志中记录了哪些子树是短暂固定的,因此 MDS 故障转移不会丢失此信息。
目录要么被短暂固定,要么不被短暂固定。它被固定到哪个等级是根据其inode号和一致性哈希派生的。这意味着短暂固定的目录在 MDS 集群中分布得相当均匀。当 MDS 集群增长或缩小时,一致性哈希也会最大限度地减少重新分配。因此,增加 MDS 集群可能会自动增加您的元数据吞吐量,而无需其他管理干预。
目前,有两种类型的短暂固定
分布式短暂固定:此策略会导致目录碎片化(甚至远低于正常的碎片化阈值)并将其碎片作为短暂固定的子树进行分发。这会使直接子目录分布在一系列 MDS 等级上。典型的用例是 /home 目录:我们希望每个用户的家目录都分布在整个 MDS 集群中。这可以通过以下方式设置
setfattr -n ceph.dir.pin.distributed -v 1 /cephfs/home
随机短暂固定:此策略指示任何后代子目录都可能被短暂固定。这是通过扩展属性 ceph.dir.pin.random 设置的,其值设置为应被固定的目录百分比。例如
setfattr -n ceph.dir.pin.random -v 0.5 /cephfs/tmp
将导致加载到缓存中或在 /tmp 下创建的任何目录有 50% 的时间被短暂固定。
建议仅将其设置为小值,例如 .001 或 0.1%。子树过多可能会降低性能。因此,配置 mds_export_ephemeral_random_max 强制限制此百分比的最大值(默认值:.01)。尝试设置超过此配置的值时,MDS 将返回 EINVAL。
在 Octopus 中,随机和分布式短暂固定策略默认都是关闭的。可以通过 mds_export_ephemeral_random 和 mds_export_ephemeral_distributed 配置选项启用这些功能。
短暂固定可以覆盖父导出固定,反之亦然。决定遵循哪个策略的规则是最近父目录规则:如果更近的父目录有冲突的策略,则使用该策略。例如
mkdir -p foo/bar1/baz foo/bar2
setfattr -n ceph.dir.pin -v 0 foo
setfattr -n ceph.dir.pin.distributed -v 1 foo/bar1
foo/bar1/baz 目录将被短暂固定,因为 foo/bar1 策略覆盖了 foo 上的导出固定。foo/bar2 目录将正常遵循 foo 上的固定。
对于相反的情况
mkdir -p home/{patrick,john}
setfattr -n ceph.dir.pin.distributed -v 1 home
setfattr -n ceph.dir.pin -v 2 home/patrick
home/patrick 目录及其子目录将被固定到等级 2,因为它的导出固定覆盖了 home 上的策略。
要删除分区策略,请删除相应的扩展属性或将值设置为 0。
setfattr -n ceph.dir.pin.distributed -v 0 home
# or
setfattr -x ceph.dir.pin.distributed home
对于导出固定,删除扩展属性或将扩展属性值设置为 -1。
setfattr -n ceph.dir.pin -v -1 home
动态子树分区
CephFS 长期以来都有一个动态元数据均衡器(有时称为“默认均衡器”),它可以拆分或合并子树,同时将它们放置在“较冷”的 MDS 等级上。以这种方式移动元数据可以提高整体文件系统吞吐量和缓存大小。
然而,均衡器有时效率低下或速度慢,因此默认情况下它是关闭的。这是为了避免管理员通过增加 max_mds 设置来“打开多 MDS”,结果发现均衡器使集群性能混乱不堪(从这种混乱状态恢复是简单的,但可能需要时间)。
要打开均衡器,请运行以下形式的命令
ceph fs set <fs_name> balance_automate true
仅在适当的配置下打开均衡器,例如包含 bal_rank_mask 设置的配置(如下所述 below)。
建议仔细监控文件系统性能和 MDS。
在特定等级上使用 Balancer 进行动态子树分区
CephFS 文件系统提供 bal_rank_mask 选项,使均衡器能够在特定的活动 MDS 等级内动态重新平衡子树。这允许管理员在不同的活动 MDS 等级中同时使用动态子树分区和静态固定方案,以便根据用户需求优化元数据负载。例如,在真实的云存储环境中,许多子卷分配给多个计算节点(例如,VM 和容器),一些需要高性能的子卷由静态分区管理,而大多数经历适度工作负载的子卷由均衡器管理。由于均衡器将元数据工作负载均匀分散到所有活动 MDS 等级,静态固定子卷的性能不可避免地可能会受到影响或降低。如果启用此选项,由均衡器管理的子树不受静态固定子树的影响。
此选项可以通过 ceph fs set 命令进行配置。例如
ceph fs set <fs_name> bal_rank_mask <hex>
<hex> 数字的每个位域代表一个专用等级。如果将 <hex> 设置为 0x3,则均衡器在活动等级 0 和 1 上运行。例如
ceph fs set <fs_name> bal_rank_mask 0x3
如果将 bal_rank_mask 设置为 -1 或 all,则所有活动等级都被屏蔽并被均衡器利用。例如
ceph fs set <fs_name> bal_rank_mask -1
另一方面,如果需要禁用均衡器,则应将 bal_rank_mask 设置为 0x0。例如
ceph fs set <fs_name> bal_rank_mask 0x0