2.2. 带有单一副本的存储类
您可以使用单个副本创建存储类,供您的应用程序使用。这可避免冗余数据副本,并允许在应用程序级别上进行弹性管理。
启用这个功能会创建一个没有数据复制的副本池,如果应用程序本身没有复制,这会增加数据丢失、数据崩溃和潜在的系统不稳定的风险。如果有任何 OSD 丢失,此功能需要非常破坏性的步骤来恢复。所有应用可能会丢失其数据,在故障 OSD 时必须重新创建。
流程
使用以下命令启用单个副本功能:
oc patch storagecluster ocs-storagecluster -n openshift-storage --type json --patch '[{ "op": "replace", "path": "/spec/managedResources/cephNonResilientPools/enable", "value": true }]'$ oc patch storagecluster ocs-storagecluster -n openshift-storage --type json --patch '[{ "op": "replace", "path": "/spec/managedResources/cephNonResilientPools/enable", "value": true }]'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证
storagecluster是否处于Ready状态:oc get storagecluster
$ oc get storageclusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例:
NAME AGE PHASE EXTERNAL CREATED AT VERSION ocs-storagecluster 10m Ready 2024-02-05T13:56:15Z 4.17.0
NAME AGE PHASE EXTERNAL CREATED AT VERSION ocs-storagecluster 10m Ready 2024-02-05T13:56:15Z 4.17.0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为每个故障域创建新的
cephblockpools。验证cephblockpools是否处于Ready状态:oc get cephblockpools
$ oc get cephblockpoolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例:
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
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 ReadyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证新存储类是否已创建:
oc get storageclass
$ oc get storageclassCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建新 OSD pod;3 osd-prepare pod 和 3 个额外的 pod。验证新 OSD pod 是否处于
Running状态:oc get pods | grep osd
$ oc get pods | grep osdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.2.1. 在 OSD 丢失了单个副本后恢复 复制链接链接已复制到粘贴板!
使用副本 1 时,当 OSD 丢失时,会保证数据丢失的存储类。丢失的 OSD 会进入故障状态。使用以下步骤在 OSD 丢失后恢复。
流程
按照以下步骤,在数据丢失副本 1 后让应用程序再次运行。您首先需要识别故障 OSD 所在的域。
如果您知道失败的 OSD 所在的故障域,请运行以下命令获取后续步骤所需的
replica1-pool-name。如果您不知道失败的 OSD 所处的位置,请跳至第 2 步。oc get cephblockpools
$ oc get cephblockpoolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例:
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
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 ReadyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 复制对应的故障域名称,以便在后续步骤中使用,然后跳至第 4 步。
查找处于
Error状态或CrashLoopBackoff状态的 OSD pod 以查找失败的 OSD:oc get pods -n openshift-storage -l app=rook-ceph-osd | grep 'CrashLoopBackOff\|Error'
$ oc get pods -n openshift-storage -l app=rook-ceph-osd | grep 'CrashLoopBackOff\|Error'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 识别具有故障 OSD 的 replica-1 池。
识别运行故障 OSD 的节点:
failed_osd_id=0 #replace with the ID of the failed OSD
failed_osd_id=0 #replace with the ID of the failed OSDCopy to Clipboard Copied! Toggle word wrap Toggle overflow 识别运行故障 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_label=$(oc get storageclass ocs-storagecluster-ceph-non-resilient-rbd -o yaml | grep domainLabel |head -1 |awk -F':' '{print $2}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow failure_domain_value=$”(oc get pods $failed_osd_id -oyaml |grep topology-location-zone |awk ‘{print $2}’)”failure_domain_value=$”(oc get pods $failed_osd_id -oyaml |grep topology-location-zone |awk ‘{print $2}’)”Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示了其 OSD 失败的 replica-1 池名称,例如:
replica1-pool-name= "ocs-storagecluster-cephblockpool-$failure_domain_value”
replica1-pool-name= "ocs-storagecluster-cephblockpool-$failure_domain_value”Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
$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-storagetoolbox=$(oc get pod -l app=rook-ceph-tools -n openshift-storage -o jsonpath='{.items[*].metadata.name}') oc rsh $toolbox -n openshift-storageCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除 replica-1 池。请注意,您必须在命令中输入 replica-1 池名称两次,例如:
ceph osd pool rm <replica1-pool-name> <replica1-pool-name> --yes-i-really-really-mean-it
ceph osd pool rm <replica1-pool-name> <replica1-pool-name> --yes-i-really-really-mean-itCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用之前标识的故障域名称替换
replica1-pool-name。
- 按照您的平台 替换 设备指南中的"替换操作或失败存储设备"一节中的步骤清除失败的 OSD。
重启 rook-ceph operator:
oc delete pod -l rook-ceph-operator -n openshift-storage
$ oc delete pod -l rook-ceph-operator -n openshift-storageCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 在 avaialbity 区域中重新创建任何受影响的应用程序,以使用名称的新池开始。