2.2. 带有单一副本的存储类


您可以使用单个副本创建存储类,供您的应用程序使用。这可避免冗余数据副本,并允许在应用程序级别上进行弹性管理。

警告

启用这个功能会创建一个没有数据复制的副本池,如果应用程序本身没有复制,这会增加数据丢失、数据崩溃和潜在的系统不稳定的风险。如果有任何 OSD 丢失,此功能需要非常破坏性的步骤来恢复。所有应用可能会丢失其数据,在故障 OSD 时必须重新创建。

流程

  1. 使用以下命令启用单个副本功能:

    $ oc patch storagecluster ocs-storagecluster -n openshift-storage --type json --patch '[{ "op": "replace", "path": "/spec/managedResources/cephNonResilientPools/enable", "value": true }]'
  2. 验证 storagecluster 是否处于 Ready 状态:

    $ oc get storagecluster

    输出示例:

    NAME                 AGE   PHASE   EXTERNAL   CREATED AT             VERSION
    ocs-storagecluster   10m   Ready              2024-02-05T13:56:15Z   4.17.0
  3. 为每个故障域创建新的 cephblockpools。验证 cephblockpools 是否处于 Ready 状态:

    $ oc get cephblockpools

    输出示例:

    NAME                                          PHASE
    ocs-storagecluster-cephblockpool              Ready
    ocs-storagecluster-cephblockpool-us-east-1a   Ready
    ocs-storagecluster-cephblockpool-us-east-1b   Ready
    ocs-storagecluster-cephblockpool-us-east-1c   Ready
  4. 验证新存储类是否已创建:

    $ oc get storageclass

    输出示例:

    NAME                                        PROVISIONER                             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    gp2 (default)                               kubernetes.io/aws-ebs                   Delete          WaitForFirstConsumer   true                   104m
    gp2-csi                                     ebs.csi.aws.com                         Delete          WaitForFirstConsumer   true                   104m
    gp3-csi                                     ebs.csi.aws.com                         Delete          WaitForFirstConsumer   true                   104m
    ocs-storagecluster-ceph-non-resilient-rbd   openshift-storage.rbd.csi.ceph.com      Delete          WaitForFirstConsumer   true                   46m
    ocs-storagecluster-ceph-rbd                 openshift-storage.rbd.csi.ceph.com      Delete          Immediate              true                   52m
    ocs-storagecluster-cephfs                   openshift-storage.cephfs.csi.ceph.com   Delete          Immediate              true                   52m
    openshift-storage.noobaa.io                 openshift-storage.noobaa.io/obc         Delete          Immediate              false                  50m
  5. 创建新 OSD pod;3 osd-prepare pod 和 3 个额外的 pod。验证新 OSD pod 是否处于 Running 状态:

    $ oc get pods | grep osd

    输出示例:

    rook-ceph-osd-0-6dc76777bc-snhnm                                  2/2     Running     0               9m50s
    rook-ceph-osd-1-768bdfdc4-h5n7k                                   2/2     Running     0               9m48s
    rook-ceph-osd-2-69878645c4-bkdlq                                  2/2     Running     0               9m37s
    rook-ceph-osd-3-64c44d7d76-zfxq9                                  2/2     Running     0               5m23s
    rook-ceph-osd-4-654445b78f-nsgjb                                  2/2     Running     0               5m23s
    rook-ceph-osd-5-5775949f57-vz6jp                                  2/2     Running     0               5m22s
    rook-ceph-osd-prepare-ocs-deviceset-gp2-0-data-0x6t87-59swf       0/1     Completed   0               10m
    rook-ceph-osd-prepare-ocs-deviceset-gp2-1-data-0klwr7-bk45t       0/1     Completed   0               10m
    rook-ceph-osd-prepare-ocs-deviceset-gp2-2-data-0mk2cz-jx7zv       0/1     Completed   0               10m

禁用单个副本

禁用 replica-1 不是经过测试和支持的场景。但是,如果需要禁用和清理 replica-1,请执行以下步骤:

  1. 使用非弹性(replica-1) storageClass 删除 Workloads。

    $ oc delete deployment replica-1-workload
    deployment.apps "replica-1-workload" deleted
  2. 使用非弹性 storageClass 删除所有 PVC。

    $ oc get pvc --all-namespaces -o custom-columns="NAMESPACE:.metadata.namespace,NAME:.metadata.name,STORAGECLASS:.spec.storageClassName" | grep "ocs-storagecluster-ceph-non-resilient-rbd"
    $ oc delete pvc replica-1-pvc
    persistentvolumeclaim "replica-1-pvc" deleted
  3. 在 storageCluster CR 上将非弹性池 Enable 标志标记为 false。

    $ oc patch storagecluster ocs-storagecluster -n openshift-storage --type json --patch '[{ "op": "replace", "path": "/spec/managedResources/cephNonResilientPools/enable", "value": false }]'
  4. 从 storageconsumer CR spec.storageClasses 中删除 non-resilient-rbd storageClasses。

    $ oc get storageconsumer internal -n openshift-storage -o json | \
    jq 'del(.spec.storageClasses[] | select(.name == "ocs-storagecluster-ceph-non-resilient-rbd"))' | \
    oc replace -f -
  5. 删除 non-resilient-rbd storageClass。

    $ oc delete sc ocs-storagecluster-ceph-non-resilient-rbd
  6. 删除 replica-1 cephBlockPools。

    $ oc get cephblockpool
    NAME                                         PHASE   TYPE         FAILUREDOMAIN   AGE
    builtin-mgr                                  Ready   Replicated   zone            136m
    ocs-storagecluster-cephblockpool             Ready   Replicated   zone            136m
    ocs-storagecluster-cephblockpool-us-east-1   Ready   Replicated   zone            50m
    ocs-storagecluster-cephblockpool-us-east-2   Ready   Replicated   zone            50m
    ocs-storagecluster-cephblockpool-us-east-3   Ready   Replicated   zone            50m
    
    $ oc delete cephblockpool ocs-storagecluster-cephblockpool-us-east-1 ocs-storagecluster-cephblockpool-us-east-2 ocs-storagecluster-cephblockpool-us-east-3
    cephblockpool.ceph.rook.io "ocs-storagecluster-cephblockpool-us-east-1" deleted
    cephblockpool.ceph.rook.io "ocs-storagecluster-cephblockpool-us-east-2" deleted
    cephblockpool.ceph.rook.io "ocs-storagecluster-cephblockpool-us-east-3" deleted
  7. 删除 replica-1 OSD。

    1. 使用故障域的类名称来识别 replica-1 OSD,

      sh-5.1$ ceph osd df tree
      ID   CLASS      WEIGHT   REWEIGHT  SIZE     RAW USE  DATA     OMAP    META     AVAIL    %USE  VAR   PGS  STATUS  TYPE NAME
       -1             1.50000         -  1.5 TiB  4.8 GiB  4.4 GiB  32 KiB  395 MiB  1.5 TiB  0.31  1.00    -          root default
       -5             1.50000         -  1.5 TiB  4.8 GiB  4.4 GiB  32 KiB  395 MiB  1.5 TiB  0.31  1.00    -              region us-east
      -14             0.50000         -  512 GiB  1.7 GiB  1.5 GiB  12 KiB  176 MiB  510 GiB  0.32  1.03    -                  zone us-east-1
      -13             0.25000         -  256 GiB  1.6 GiB  1.5 GiB  11 KiB   75 MiB  254 GiB  0.61  1.93    -                      host ocs-deviceset-2-data-0kp6fl
        2        ssd  0.25000   1.00000  256 GiB  1.6 GiB  1.5 GiB  11 KiB   75 MiB  254 GiB  0.61  1.93  353      up                  osd.2
      -46             0.25000         -  256 GiB  104 MiB  2.7 MiB   1 KiB  101 MiB  256 GiB  0.04  0.13    -                      host us-east-1-data-0c2xxv
        3  us-east-1  0.25000   1.00000  256 GiB  104 MiB  2.7 MiB   1 KiB  101 MiB  256 GiB  0.04  0.13    0      up                  osd.3
       -4             0.50000         -  512 GiB  1.6 GiB  1.5 GiB   8 KiB  101 MiB  510 GiB  0.31  0.98    -                  zone us-east-2
       -3             0.25000         -  256 GiB  1.6 GiB  1.5 GiB   7 KiB   74 MiB  254 GiB  0.61  1.93    -                      host ocs-deviceset-1-data-0tllsb
        0        ssd  0.25000   1.00000  256 GiB  1.6 GiB  1.5 GiB   7 KiB   74 MiB  254 GiB  0.61  1.93  353      up                  osd.0
      -51             0.25000         -  256 GiB   29 MiB  2.7 MiB   1 KiB   26 MiB  256 GiB  0.01  0.04    -                      host us-east-2-data-068z76
        5  us-east-2  0.25000   1.00000  256 GiB   29 MiB  2.7 MiB   1 KiB   26 MiB  256 GiB  0.01  0.04    0      up                  osd.5
      -10             0.50000         -  512 GiB  1.6 GiB  1.5 GiB  12 KiB  118 MiB  510 GiB  0.31  0.99    -                  zone us-east-3
       -9             0.25000         -  256 GiB  1.6 GiB  1.5 GiB  11 KiB   92 MiB  254 GiB  0.61  1.95    -                      host ocs-deviceset-0-data-06fhxp
        1        ssd  0.25000   1.00000  256 GiB  1.6 GiB  1.5 GiB  11 KiB   92 MiB  254 GiB  0.61  1.95  353      up                  osd.1
      -41             0.25000         -  256 GiB   29 MiB  2.7 MiB   1 KiB   26 MiB  256 GiB  0.01  0.04    -                      host us-east-3-data-04wvc8
        4  us-east-3  0.25000   1.00000  256 GiB   29 MiB  2.7 MiB   1 KiB   26 MiB  256 GiB  0.01  0.04    0      up                  osd.4
                                  TOTAL  1.5 TiB  4.8 GiB  4.4 GiB  36 KiB  395 MiB  1.5 TiB  0.31
      MIN/MAX VAR: 0.04/1.95  STDDEV: 0.29

      在本例中,OSD ID 3,5,4 是需要移除的 replica-1 OSD。

    2. 强制删除标识的 replica-1 OSD。

      按照适用于您的环境的适当流程,执行移除 OSD。

      对您要删除的所有 OSD Ids 重复上述步骤。

      $ osd_id_to_remove=3
      $ oc scale -n openshift-storage deployment rook-ceph-osd-${osd_id_to_remove} --replicas=0
      deployment.apps/rook-ceph-osd-3 scaled
      $ oc process -n openshift-storage ocs-osd-removal -p FAILED_OSD_IDS=${osd_id_to_remove} FORCE_OSD_REMOVAL=true |oc create -n openshift-storage -f -
      job.batch/ocs-osd-removal-job created
      $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'
      2025-06-20 10:33:13.153093 I | cephosd: completed removal of OSD 3
      $ oc delete -n openshift-storage job ocs-osd-removal-job
      job.batch "ocs-osd-removal-job" deleted
    3. 检查 OSD 树。

      sh-5.1$ ceph osd df tree
      ID   CLASS  WEIGHT   REWEIGHT  SIZE     RAW USE  DATA     OMAP    META     AVAIL    %USE  VAR   PGS  STATUS  TYPE NAME
       -1         0.75000         -  768 GiB  5.0 GiB  4.8 GiB  29 KiB  227 MiB  763 GiB  0.65  1.00    -          root default
       -5         0.75000         -  768 GiB  5.0 GiB  4.8 GiB  29 KiB  227 MiB  763 GiB  0.65  1.00    -              region us-east
      -14         0.25000         -  256 GiB  1.7 GiB  1.6 GiB  11 KiB   63 MiB  254 GiB  0.65  0.99    -                  zone us-east-1
      -13         0.25000         -  256 GiB  1.7 GiB  1.6 GiB  11 KiB   63 MiB  254 GiB  0.65  0.99    -                      host ocs-deviceset-2-data-0kp6fl
        2    ssd  0.25000   1.00000  256 GiB  1.7 GiB  1.6 GiB  11 KiB   63 MiB  254 GiB  0.65  0.99  353      up                  osd.2
       -4         0.25000         -  256 GiB  1.7 GiB  1.6 GiB   7 KiB   80 MiB  254 GiB  0.65  1.00    -                  zone us-east-2
       -3         0.25000         -  256 GiB  1.7 GiB  1.6 GiB   7 KiB   80 MiB  254 GiB  0.65  1.00    -                      host ocs-deviceset-1-data-0tllsb
        0    ssd  0.25000   1.00000  256 GiB  1.7 GiB  1.6 GiB   7 KiB   80 MiB  254 GiB  0.65  1.00  353      up                  osd.0
      -10         0.25000         -  256 GiB  1.7 GiB  1.6 GiB  11 KiB   84 MiB  254 GiB  0.65  1.00    -                  zone us-east-3
       -9         0.25000         -  256 GiB  1.7 GiB  1.6 GiB  11 KiB   84 MiB  254 GiB  0.65  1.00    -                      host ocs-deviceset-0-data-06fhxp
        1    ssd  0.25000   1.00000  256 GiB  1.7 GiB  1.6 GiB  11 KiB   84 MiB  254 GiB  0.65  1.00  353      up                  osd.1
                              TOTAL  768 GiB  5.0 GiB  4.8 GiB  31 KiB  227 MiB  763 GiB  0.65
      MIN/MAX VAR: 0.99/1.00  STDDEV: 0.00

2.2.1. 在 OSD 丢失了单个副本后恢复

使用副本 1 时,当 OSD 丢失时,会保证数据丢失的存储类。丢失的 OSD 会进入故障状态。使用以下步骤在 OSD 丢失后恢复。

流程

按照以下步骤,在数据丢失副本 1 后让应用程序再次运行。您首先需要识别故障 OSD 所在的域。

  1. 如果您知道失败的 OSD 所在的故障域,请运行以下命令获取后续步骤所需的 replica1-pool-name。如果您不知道失败的 OSD 所处的位置,请跳至第 2 步。

    $ oc get cephblockpools

    输出示例:

    NAME                                          PHASE
    ocs-storagecluster-cephblockpool              Ready
    ocs-storagecluster-cephblockpool-us-south-1   Ready
    ocs-storagecluster-cephblockpool-us-south-2   Ready
    ocs-storagecluster-cephblockpool-us-south-3   Ready

    复制对应的故障域名称,以便在后续步骤中使用,然后跳至第 4 步。

  2. 查找处于 Error 状态或 CrashLoopBackoff 状态的 OSD pod 以查找失败的 OSD:

    $ oc get pods -n openshift-storage -l app=rook-ceph-osd  | grep 'CrashLoopBackOff\|Error'
  3. 识别具有故障 OSD 的 replica-1 池。

    1. 识别运行故障 OSD 的节点:

      failed_osd_id=0 #replace with the ID of the failed OSD
    2. 识别运行故障 OSD 的 failureDomainLabel:

      failure_domain_label=$(oc get storageclass ocs-storagecluster-ceph-non-resilient-rbd -o yaml | grep domainLabel |head -1 |awk -F':' '{print $2}')
      failure_domain_value=$”(oc get pods $failed_osd_id -oyaml |grep topology-location-zone |awk ‘{print $2}’)”

      输出显示了其 OSD 失败的 replica-1 池名称,例如:

      replica1-pool-name= "ocs-storagecluster-cephblockpool-$failure_domain_value”

      其中 $failure_domain_value 是 failureDomainName。

  4. 删除 replica-1 池。

    1. 连接到 toolbox pod:

      toolbox=$(oc get pod -l app=rook-ceph-tools -n openshift-storage -o jsonpath='{.items[*].metadata.name}')
      
      oc rsh $toolbox -n openshift-storage
    2. 删除 replica-1 池。请注意,您必须在命令中输入 replica-1 池名称两次,例如:

      ceph osd pool rm <replica1-pool-name> <replica1-pool-name> --yes-i-really-really-mean-it

      使用之前标识的故障域名称替换 replica1-pool-name

  5. 按照您的平台 替换 设备指南中的"替换操作或失败存储设备"一节中的步骤清除失败的 OSD。
  6. 重启 rook-ceph operator:

    $ oc delete pod -l rook-ceph-operator -n openshift-storage
  7. 在 avaialbity 区域中重新创建任何受影响的应用程序,以使用名称的新池开始。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部