2

我正在将 rook-ceph 部署到 minikube 集群中。一切似乎都在工作。我在 vm 中添加了 3 个未格式化的磁盘并连接了它。我遇到的问题是,当我运行 ceph status 时,我收到一条健康温暖的消息,告诉我“1 pg 过小”。我该如何解决这个问题?

文档(https://docs.ceph.com/docs/mimic/rados/troubleshooting/troubleshooting-pg/)声明“如果您尝试在单个节点上创建集群,则必须更改 osd crush 的默认值在创建监视器和 OSD 之前,在 Ceph 配置文件中将 chooseleaf 类型设置从 1(表示主机或节点)到 0(表示 osd)。 “我不知道在哪里进行此配置,但如果有任何其他方法可以解决此问题我应该知道的,请告诉我。谢谢!

4

3 回答 3

4

正如您在问题中提到的那样,您应该将粉碎故障域类型更改为 OSD,这意味着它将在 OSD 而不是主机之间复制您的数据。默认情况下它是主机,当您只有一个主机时,它没有任何其他主机来复制您的数据,因此您的 pg 将始终过小。

您应该osd crush chooseleaf type = 0ceph.conf创建监视器和 OSD 之前进行设置。

这将在 OSD 而不是主机之间复制您的数据。

于 2020-08-18T16:31:20.140 回答
3

我在使用具有多个 OSD 的单个数据承载主机的 rook (v1.5.7) 安装 ceph 时遇到了这个问题。

安装附带一个默认的CRUSH 规则 replicated_rule,该规则具有host默认的故障域:

$ ceph osd crush rule dump replicated_rule    
{
    "rule_id": 0,
    "rule_name": "replicated_rule",
    "ruleset": 0,
    "type": 1,
    "min_size": 1,
    "max_size": 10,
    "steps": [
        {
            "op": "take",
            "item": -1,
            "item_name": "default"
        },
        {
            "op": "chooseleaf_firstn",
            "num": 0,
            "type": "host"
        },
        {
            "op": "emit"
        }
    ]
}

我必须找出与 pg 1 关联的池名称“过小”,幸运的是,在默认的 rook-ceph 安装中,只有一个:

$ ceph osd pool ls
device_health_metrics

$ ceph pg ls-by-pool device_health_metrics
PG   OBJECTS  DEGRADED  ...  STATE
1.0        0         0  ...  active+undersized+remapped

并确认 pg 使用默认规则:

$ ceph osd pool get device_health_metrics crush_rule
crush_rule: replicated_rule

我没有修改默认的 CRUSH 规则,而是选择创建一个新的复制规则,但这次指定osd(又名device类型文档:CRUSH map Types and Buckets),同时假设默认的 CRUSH 根为default

# osd crush rule create-replicated <name> <root> <type> [<class>]
$ ceph osd crush rule create-replicated replicated_rule_osd default osd

$ ceph osd crush rule dump replicated_rule_osd
{
    "rule_id": 1,
    "rule_name": "replicated_rule_osd",
    "ruleset": 1,
    "type": 1,
    "min_size": 1,
    "max_size": 10,
    "steps": [
        {
            "op": "take",
            "item": -1,
            "item_name": "default"
        },
        {
            "op": "choose_firstn",
            "num": 0,
            "type": "osd"
        },
        {
            "op": "emit"
        }
    ]
}

然后将新规则分配给现有池:

$ ceph osd pool set device_health_metrics crush_rule replicated_rule_osd
set pool 1 crush_rule to replicated_rule_osd

$ ceph osd pool get device_health_metrics crush_rule
crush_rule: replicated_rule_osd

最后确认 pg 状态:

$ ceph pg ls-by-pool device_health_metrics
PG   OBJECTS  DEGRADED  ...  STATE
1.0        0         0  ...  active+clean
于 2021-02-25T04:15:07.250 回答
1

新帐户因此无法添加为评论,想解释@zamnuts 答案,因为我在集群中使用 rook:v1.7.2 打了同样的问题,如果想更改 Rook/Ceph Helm 图表或 YAML 中的默认 device_health_metrics , 以下文件是相关的

https://github.com/rook/rook/blob/master/deploy/examples/pool-device-health-metrics.yaml

https://github.com/rook/rook/blob/master/Documentation/helm-ceph-cluster.md

于 2022-02-17T16:42:52.760 回答