Ceph:如何在特定的 OSD 上放置池?

Vin*_*t H 8 ceph

我有一个包含 66 个 OSD 的 Ceph 集群,其中有一个data_pool和一个metadata_pool.

我想将其放置metadata_pool在 3 个具有 SSD 的特定 OSD 上,因为所有其他 63 个 OSD 都具有较旧的磁盘。

如何强制 Ceph 将其放置metadata_pool在特定的 OSD 上?

提前致谢。

its*_*ire 7

您的池需要一个特殊的挤压规则来定义要使用的存储类型。proxmox 论坛中有一个很好的答案。

归结起来是这样的:

Ceph 知道哪个驱动器是 HDD 或 SDD。此信息又可用于创建挤压规则,该规则将仅将 PG 放置在该类型的设备上。

ceph 附带的默认规则是replicated_rule:

# rules
rule replicated_rule {
    id 0
    type replicated
    min_size 1
    max_size 10
    step take default
    step chooseleaf firstn 0 type host
    step emit
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您的 ceph 集群包含这两种类型的存储设备,您可以使用以下命令创建新的压缩规则:

$ ceph osd crush rule create-replicated replicated_hdd default host hdd
$ ceph osd crush rule create-replicated replicated_ssd default host ssd
Run Code Online (Sandbox Code Playgroud)

新创建的规则看起来几乎相同。这是硬盘规则:

rule replicated_hdd {
    id 1
    type replicated
    min_size 1
    max_size 10
    step take default class hdd
    step chooseleaf firstn 0 type host
    step emit
}
Run Code Online (Sandbox Code Playgroud)

如果您的集群不包含 HDD 或 SSD 设备,则规则创建将失败。

之后,您将能够为现有池设置新规则:

$ ceph osd pool set YOUR_POOL crush_rule replicated_ssd
Run Code Online (Sandbox Code Playgroud)

集群将进入 HEALTH_WARN 并将对象移动到 SSD 上的正确位置,直到集群再次恢复正常。

此功能是在 ceph 10.x 又名 Luminous 中添加的


小智 7

我意识到这是较旧的,但它出现在搜索中作为一般“如何将 OSD 分成池”的答案,因此我觉得扩展的答案很有用。

首先也是最重要的一点:“设备类”实际上并不是 Ceph 中的设备类,“设备类”只不过是一个将 OSD 彼此分开的标签。这是非常令人困惑的,因为它们已经超载了所有术语,但基本上,使用磁性的旋转磁盘被赋予“hdd”的“设备类别”这一事实几乎是无关紧要的(参见下面的注释)。它可以被赋予“fred”或“pizza”的设备类,并对 ceph 产生同样的差异。 除了彼此不同的标签之外,“设备类”hdd、sdd 或 nvme 没有任何内部含义。 这些标签将磁盘彼此分开。这就对了。

一旦您意识到“hdd”并不意味着旋转磁盘并且“sdd”并不意味着“芯片上的磁盘”,那么如何从命令行将不同的磁盘分离到不同的池中的答案就变得很容易。

# Remove the current "device class" (label) on the OSDs I want to move to the new pool.
$> ceph osd crush rm-device-class osd.$OSDNUM

# Add a new "device class" (label) to the OSDs to move.
$> ceph osd crush set-device-class hdd2 osd.$OSDNUM

# Create a new crush rule for the newly labeled devices.
$> ceph osd crush rule create-replicated replicated_rule_hdd2 default host hdd2

# Create a new CEPH Pool associated with the new CRUSH Rule.
$> ceph osd pool set hdd2pool crush_rule replicated_rule_hdd2
Run Code Online (Sandbox Code Playgroud)

在上面的代码中:

  • $OSDNUM 是 OSD 标识符。当您执行“ceph osd tree”时,它将显示主机上的 OSD,每个 OSD 将被命名为“osd.#”,其中 # 是 OSD 的连续标识符。可能不需要提及这一点,但我们可以称之为“综合”文档。
  • hdd2是新设备类的用户定义标签。如下所述,这可以是您想要的任何内容。该值是任意的,并且在 Ceph 中根本没有任何意义。(见下文)
  • 在运行“ceph osdrushrule”命令之前,新设备类上必须至少有一个 Ceph 已知的 OSD。否则您将收到“错误 EINVAL:设备类不存在”。此错误并不意味着设备类名称是已知值的列表,而是意味着 Ceph 无法在集群中找到具有该设备类的 OSD。首先运行“rm-device-class”和“set-device-class”。
  • replicated_rule_hdd2是新 CRUSH 规则集的用户定义名称。如果不进行修改,您的 Crushmap 中可能已经定义了规则“re​​plicated_rule”...您可以使用任何您想要的内容来代替此文本,除了您的rushmap 中的任何现有规则的名称。
  • hdd2pool是另一个任意定义的名称,这次它是 Ceph 中新池的名称,它将被设置为使用新的rush规则。

前两个命令只是删除要为其创建新池的每个 OSD 并为其添加不同的标签。

第三个命令是创建 Ceph“Crushmap”规则,将上述“不同标签”关联到唯一的rushmap 规则。

第四个命令创建一个新池,并告诉该池使用上面第三个命令创建的新的rushmap规则。

因此,这可以归结为:

  • 从 OSD 中删除标签
  • 为 OSD 创建新标签
  • 将标签分配给新规则
  • 将规则分配给新池

创建分配了规则的池后,Ceph 将开始移动数据。

注意为什么我在描述“设备类别”时使用上面的“大部分不相关”:

这是 Ceph 中围绕“设备类”的混乱的又一部分。

创建 OSD 时(以及可能重新扫描 OSD 时,例如重新启动后),Ceph 会自动检测 OSD 背后的驱动器类型,以简化管理员的工作。因此,如果 Ceph 在 OSD 后面发现一个缓慢的“旋转生锈”磁盘,它会自动为其分配标签“hdd”,而如果它发现一个“片上磁盘”类型的驱动器,它会为其分配标签“sdd”或“nvme” 。

由于 Ceph 使用术语“设备类”来指代此标签(具有真正的技术含义),并将设备类设置为也具有真正的技术含义的标识符,因此它错误且令人困惑地使该标识符看起来具有实际含义在 Ceph 软件的上下文中……HDD 必须标记为“hdd”,以便 Ceph 可以以特殊方式处理“慢”磁盘,与“快”磁盘(例如 SDD)分开。(不是这种情况)。

它进一步变得令人困惑,因为在重新扫描时,Ceph 可以将设备类更改回它检测到的设备类型。如果您在“class”hdd 上安装 3 个 OSD,并在“fred”类上安装另外 3 个 OSD,那么您可能会在某一时刻发现与“hdd”关联的池中的所有 6 个设备,而与“fred”关联的池中没有一个设备,因为 Ceph已“帮助”为您重新分配了磁盘。

这可以通过输入以下内容来停止:

[osd]
osd_class_update_on_start = false
Run Code Online (Sandbox Code Playgroud)

在 /etc/ceph/ceph.conf 文件中。

因此,这里使用“大部分不相关”:因为虽然标签(设备类)对 Ceph 没有实际意义,但该软件可以通过强制基于真实磁盘属性的自动检测的标签,使其看起来具有相关性。