2.3. 带有单一副本的存储类
您可以使用应用程序使用单个副本创建存储类。这可避免冗余数据副本,并允许在应用程序级别上进行弹性管理。
启用这个功能会创建一个没有数据复制的副本池,如果应用程序本身没有复制,这会增加数据丢失、数据崩溃和潜在的系统不稳定的风险。如果有任何 OSD 丢失,此功能需要非常干扰的步骤才能恢复。所有请求都可能会丢失其数据,在出现故障 OSD 时必须重新创建数据。
流程
使用以下命令启用单个副本功能:
$ oc patch storagecluster ocs-storagecluster -n openshift-storage --type json --patch '[\{ "op": "replace", "path": "/spec/managedResources/cephNonResilientPools/enable", "value": true }]'
2.3.1. 在 OSD 从单个副本丢失后恢复
在使用副本 1 时,具有单个副本的存储类时,当 OSD 丢失时,可以保证数据丢失。
流程
按照以下步骤,使应用程序在数据丢失后再次运行。
查找处于
Error
状态或CrashLoopBackoff
状态的 OSD pod:$ oc get pods -nopenshift-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 的该节点的区域:
failure_domain=$(oc get storageclass ocs-storagecluster-ceph-non-resilient-rbd -o yaml | grep domainLabel)
domainLabel=$”(oc get pods rook-ceph-osd-$failed_osd_id -o yaml | grep topology-location-$failure_domain:)”
输出显示池,例如:
poolName= "ocs-storage cluster-ceph block pool-$domaiLabel”
其中
$domaiLabel
是 zoneName。
删除 replica-1 池。
连接到 toolbox pod:
toolbox=$(kubectl get pod -l app=rook-ceph-tools -noperator-namespace -o jsonpath='{.items[*].metadata.name}') oc rsh $toolbox -noperator-namespace
删除 replica-1 池:
ceph osd pool rm replica1-pool-name replica1-pool-name yes-I-really-really-mean-it
缩减故障 OSD pod 的部署:
failed_osd_id=0 #replace with the ID of the failed OSD oc scale deployment -nopenshift-storage rook-ceph-osd-$failed_osd_id --replicas=0
- 清除上面标识的 OSD。在 替换设备 指南中的根据您的平台,使用"替换操作或失败的存储设备"中的步骤。
- 对于使用 LSO 的平台,Wipe 或 替换磁盘。
重启 rook-ceph Operator:
$ oc delete pod -l rook-ceph-operator -nopenshift-storage
- 在 avaialbity 区域中重新创建任何受影响的应用程序,以使用具有相同名称的新池。