2.3. 带有单一副本的存储类
您可以使用单个副本创建存储类,供您的应用程序使用。这可避免冗余数据副本,并允许在应用程序级别上进行弹性管理。
启用这个功能会创建一个没有数据复制的副本池,如果应用程序本身没有复制,这会增加数据丢失、数据崩溃和潜在的系统不稳定的风险。如果有任何 OSD 丢失,此功能需要非常破坏性的步骤来恢复。所有应用可能会丢失其数据,在故障 OSD 时必须重新创建。
先决条件
- 确保每个故障域使用一个新的存储设备或 OSD。
流程
使用以下命令启用单个副本功能:
$ oc patch storagecluster ocs-storagecluster -n openshift-storage --type json --patch '[{ "op": "replace", "path": "/spec/managedResources/cephNonResilientPools/enable", "value": true }]'验证
storagecluster是否处于Ready状态:$ oc get storagecluster输出示例:
NAME AGE PHASE EXTERNAL CREATED AT VERSION ocs-storagecluster 10m Ready 2024-02-05T13:56:15Z 4.15.0为每个故障域创建新的
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验证新存储类是否已创建:
$ 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在启用了单一副本的存储类后,三个新 OSD 部署在新设备上;3
osd-preparepod 和 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
2.3.1. 在 OSD 丢失了单个副本后恢复 复制链接链接已复制到粘贴板!
使用副本 1 时,当 OSD 丢失时,会保证数据丢失的存储类。丢失的 OSD 会进入故障状态。使用以下步骤在 OSD 丢失后恢复。
流程
按照以下步骤,在数据丢失副本 1 后让应用程序再次运行。您首先需要识别故障 OSD 所在的域。
如果您知道失败的 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 步。
查找处于
Error状态或CrashLoopBackoff状态的 OSD pod 以查找失败的 OSD:$ oc get pods -n openshift-storage -l app=rook-ceph-osd | grep 'CrashLoopBackOff\|Error'识别具有故障 OSD 的 replica-1 池。
识别运行故障 OSD 的节点:
failed_osd_id=0 #replace with the ID of the failed OSD识别运行故障 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。
删除 replica-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删除 replica-1 池。请注意,您必须在命令中输入 replica-1 池名称两次,例如:
ceph osd pool rm <replica1-pool-name> <replica1-pool-name> --yes-i-really-really-mean-it使用之前标识的故障域名称替换
replica1-pool-name。
- 按照您的平台 替换 设备指南中的"替换操作或失败存储设备"一节中的步骤清除失败的 OSD。
重启 rook-ceph operator:
$ oc delete pod -l rook-ceph-operator -n openshift-storage- 在 avaialbity 区域中重新创建任何受影响的应用程序,以使用名称的新池开始。