12.3.3. 从持久性卷中恢复已删除的集群
这个步骤描述了如何从持久性卷(PV)中恢复删除的集群。
在这种情况下,Topic Operator 会识别 Kafka 中存在的主题,但 KafkaTopic
资源不存在。
当您进入重新创建集群的步骤时,有两个选项:
当可以恢复所有
KafkaTopic
资源时,请使用 Option 1。因此,必须在集群启动前恢复
KafkaTopic
资源,以便 Topic Operator 不会删除对应的主题。当无法恢复所有
KafkaTopic
资源时,请使用 Option 2。这一次,您在没有 Topic Operator 的情况下部署集群,删除 ZooKeeper 中的 Topic Operator 数据,然后重新部署它,以便 Topic Operator 可以从对应主题重新创建
KafkaTopic
资源。
如果没有部署 Topic Operator,您只需要恢复 PersistentVolumeClaim
(PVC)资源。
开始前
在这一流程中,必须将 PV 挂载到正确的 PVC 中以避免数据崩溃。为 PVC 指定了一个 volumeName
,且必须与 PV 的名称匹配。
如需更多信息,请参阅:
该流程不包括 KafkaUser
资源的恢复,必须手动重新创建。如果需要保留密码和证书,则必须在创建 KafkaUser
资源前重新创建 secret。
步骤
检查集群中的 PV 信息:
oc get pv
为 PV 提供数据信息。
显示对这个流程很重要的列的输出示例:
NAME RECLAIMPOLICY CLAIM pvc-5e9c5c7f-3317-11ea-a650-06e1eadd9a4c ... Retain ... myproject/data-my-cluster-zookeeper-1 pvc-5e9cc72d-3317-11ea-97b0-0aef8816c7ea ... Retain ... myproject/data-my-cluster-zookeeper-0 pvc-5ead43d1-3317-11ea-97b0-0aef8816c7ea ... Retain ... myproject/data-my-cluster-zookeeper-2 pvc-7e1f67f9-3317-11ea-a650-06e1eadd9a4c ... Retain ... myproject/data-0-my-cluster-kafka-0 pvc-7e21042e-3317-11ea-9786-02deaf9aa87e ... Retain ... myproject/data-0-my-cluster-kafka-1 pvc-7e226978-3317-11ea-97b0-0aef8816c7ea ... Retain ... myproject/data-0-my-cluster-kafka-2
- NAME 显示每个 PV 的名称。
- RECLAIM POLICY 显示 PV 会被 保留。
- CLAIM 显示到原始 PVC 的链接。
重新创建原始命名空间:
oc create namespace myproject
重新创建原始 PVC 资源规格,将 PVC 链接到适当的 PV:
例如:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-0-my-cluster-kafka-0 spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: gp2-retain volumeMode: Filesystem volumeName: pvc-7e1f67f9-3317-11ea-a650-06e1eadd9a4c
编辑 PV 规格,以删除绑定原始 PVC 的
claimRef
属性。例如:
apiVersion: v1 kind: PersistentVolume metadata: annotations: kubernetes.io/createdby: aws-ebs-dynamic-provisioner pv.kubernetes.io/bound-by-controller: "yes" pv.kubernetes.io/provisioned-by: kubernetes.io/aws-ebs creationTimestamp: "<date>" finalizers: - kubernetes.io/pv-protection labels: failure-domain.beta.kubernetes.io/region: eu-west-1 failure-domain.beta.kubernetes.io/zone: eu-west-1c name: pvc-7e226978-3317-11ea-97b0-0aef8816c7ea resourceVersion: "39431" selfLink: /api/v1/persistentvolumes/pvc-7e226978-3317-11ea-97b0-0aef8816c7ea uid: 7efe6b0d-3317-11ea-a650-06e1eadd9a4c spec: accessModes: - ReadWriteOnce awsElasticBlockStore: fsType: xfs volumeID: aws://eu-west-1c/vol-09db3141656d1c258 capacity: storage: 100Gi claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: data-0-my-cluster-kafka-2 namespace: myproject resourceVersion: "39113" uid: 54be1c60-3319-11ea-97b0-0aef8816c7ea nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: failure-domain.beta.kubernetes.io/zone operator: In values: - eu-west-1c - key: failure-domain.beta.kubernetes.io/region operator: In values: - eu-west-1 persistentVolumeReclaimPolicy: Retain storageClassName: gp2-retain volumeMode: Filesystem
在这个示例中,删除了以下属性:
claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: data-0-my-cluster-kafka-2 namespace: myproject resourceVersion: "39113" uid: 54be1c60-3319-11ea-97b0-0aef8816c7ea
部署 Cluster Operator。
oc apply -f install/cluster-operator -n my-project
重新创建集群。
根据您是否拥有重新创建集群所需的所有
KafkaTopic
资源,按照以下步骤执行操作。选项 1 :如果您在丢失集群前存在 所有
KafkaTopic
资源,包括__consumer_offset
提交偏移等内部主题:重新创建所有
KafkaTopic
资源。您必须在部署集群前重新创建资源,否则 Topic Operator 将删除主题。
部署 Kafka 集群。
例如:
oc apply -f kafka.yaml
选项 2 :如果您没有丢失集群前存在的所有
KafkaTopic
资源:部署 Kafka 集群,如第一个选项一样,但不通过在部署前从 Kafka 资源中删除
topicOperator
属性来不使用 Topic Operator。如果您在部署中包含主题 Operator,主题 Operator 将删除所有主题。
对其中一个 Kafka 代理 Pod 运行
exec
命令,以打开 ZooKeeper shell 脚本。例如,其中 my-cluster-kafka-0 是代理 pod 的名称:
oc exec -ti my-cluster-zookeeper-0 -- bin/zookeeper-shell.sh localhost:12181
删除整个
/strimzi
路径以删除 Topic Operator 存储:deleteall /strimzi
通过使用
topicOperator
属性重新部署 Kafka 集群来启用 Topic Operator,以重新创建KafkaTopic
资源。例如:
apiVersion: kafka.strimzi.io/v1beta1 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} 1 #...
- 1
- 在此,我们会显示默认配置,它没有附加属性。您可以使用 第 B.66 节 “
EntityTopicOperatorSpec
模式参考” 中描述的属性指定所需的配置。
通过列出
KafkaTopic
资源来验证恢复:oc get KafkaTopic