配置多个活动 MDS 守护进程(pacific版本)
也称为:multi-mds、主动-主动MDS。
每个 CephFS 文件系统默认配置为一个活动的 MDS 守护进程。要为大型系统扩展元数据性能,您可以启用多个活动的 MDS 守护程序,它们将相互共享元数据工作负载。
什么时候应该使用多个活动的 MDS 守护进程?
- 当您的元数据性能在默认运行的单个 MDS 上出现瓶颈时,您应该配置多个活动的 MDS 守护程序。
- 添加更多守护进程可能不会提高所有工作负载的性能。通常,在单个客户端上运行的单个应用程序不会受益于 MDS 守护程序数量的增加,除非该应用程序并行执行大量元数据操作。
- 通常受益于大量活动 MDS 守护程序的工作负载是具有许多客户端的工作负载,可能在许多单独的目录上工作。
增加 MDS 活动集群大小
每个 CephFS 文件系统都有一个max_mds设置,它控制将创建多少个rank。文件系统中的实际 rank 数只有在有备用守护程序可用于承担新 rank 时才会增加。例如,如果只有一个 MDS 守护进程在运行,并且 max_mds 设置为 2,则不会创建第二个 rank。(请注意,这样的配置不是高可用性 (HA),因为没有备用可用于接管失败的 rank。以这种方式配置时,集群将通过运行状况警告进行投诉。)
设置max_mds
为所需的 rank 数。在以下示例中,“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
新创建的 rank (1) 将通过“creating”状态,然后进入此“active状态”。
备用守护进程
即使有多个活动的 MDS 守护程序,如果运行活动守护程序的任何服务器发生故障,高可用性系统仍然需要备用守护程序来接管。
因此,高可用性系统的max_mds
实际最大值最多比系统中的 MDS 服务器总数少一。
要在多台服务器发生故障时保持可用,请增加系统中备用守护程序的数量以匹配您希望承受的服务器故障数量。
减少 Rank 数量
减少 rank 的数量就像减少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
达到。
注意:stopped rank 将首先进入停止状态一段时间,同时将其共享的元数据交给剩余的活动守护进程。此阶段可能需要几秒钟到几分钟。如果 MDS 似乎卡在停止状态,则应将其作为可能的错误进行调查。
如果 MDS 守护程序在该up:stopping
状态下崩溃或被杀死,备用服务器将接管,集群MON将阻止尝试停止守护程序。
当一个守护进程完成停止时,它会自行重生并回到备用状态。
手动将目录树固定到特定 Rank
在多个活动元数据服务器配置中,会运行一个平衡器,用于将元数据负载均匀地分布在整个集群中。这通常对大多数用户来说足够好,但有时需要使用元数据到特定 rank 的显式映射来覆盖动态平衡器。这可以允许管理员或用户平均分配应用程序负载或限制用户元数据请求对整个集群的影响。
为此目的提供的机制称为目录的export pin
扩展属性。此扩展属性的名称是 ceph.dir.pin
。用户可以使用标准命令设置此属性:
setfattr -n ceph.dir.pin -v 2 path/to/dir
扩展属性的值是分配目录子树的 rank 。默认值-1
表示目录未固定。
目录的 export pin 是从其最近设置了 export pin 的父级继承的。这样,在目录上设置 export pin 会影响其所有子级。但是,可以通过设置子目录的 export pin 来覆盖父 pin。例如:
mkdir -p a/b
# "a" and "a/b" both start without an export pin set # "a" 和 "a/b" 都在没有设置 export pin 的情况下开始
setfattr -n ceph.dir.pin -v 1 a/
# a and b are now pinned to rank 1 # a 和 b 现在被固定到 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 # a/b 现在被固定到 rank 0 ,而 a/ 并且它的其余子目录仍然被固定到 rank 1
设置子树分区策略
也可以通过一组策略设置子树的自动静态分区。在 CephFS 中,这种自动静态分区称为(ephemeral pinning)临时固定。任何临时固定的目录(inode)都将根据其 inode 编号的一致散列自动分配到特定 rank 。所有临时固定目录的集合应均匀分布在所有 rank 中。
临时固定目录之所以如此命名,是因为一旦目录 inode 从缓存中删除,该 pin 可能不会持续存在。但是,MDS 故障转移不会影响固定目录的短暂性质。MDS 将哪些子树临时固定在其日志中,因此 MDS 故障转移不会丢弃此信息。
目录要么暂时固定,要么不固定。它被固定到哪个 rank 是从它的 inode 编号和一致的哈希值得出的。这意味着临时固定的目录在 MDS 集群中分布均匀。当MDS 集群增长或缩小时,一致的散列也可以最大限度地减少重新分配。因此,扩展 MDS 集群可能会自动增加您的元数据吞吐量,而无需其他管理干预。
目前,有两种类型的临时固定:
- Distributed Ephemeral Pins:此策略导致目录碎片(甚至远低于正常碎片阈值)并将其碎片分发为临时固定子树。这具有在一系列 MDS rank 中分配直系子目录的效果。典型的示例用例是
/home
目录:我们希望每个用户的主目录分布在整个 MDS 集群中。这可以通过以下方式设置:
setfattr -n ceph.dir.pin.distributed -v 1 /cephfs/home
- Random Ephemeral Pins:此策略表明任何后代子目录都可以被临时固定。这是通过扩展属性
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 版本中的随机和分布式临时 pin 策略均处于关闭状态。可以通过 mds_export_ephemeral_random
和mds_export_ephemeral_distributed
配置选项启用这些功能。
临时 pin 可能会覆盖父 export pin,反之亦然。决定遵循哪种策略的是最近父目录的规则:如果更近的父目录有冲突的策略,则使用该策略。例如:
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
pin 。
对于相反的情况:
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
目录及其子目录将被固定到 rank 2,因为它的 export pin 覆盖了home 。