使用 PD Recover 恢复 PD 集群

PD Recover 是对 PD 进行灾难性恢复的工具,用于恢复无法正常启动或服务的 PD 集群。该工具的详细介绍参见 TiDB 文档 - PD Recover。本文档介绍如何下载 PD Recover 工具,以及如何使用该工具恢复 PD 集群。

下载 PD Recover

  1. 下载 TiDB 官方安装包:

     

    wget https://download.pingcap.org/tidb-${version}-linux-amd64.tar.gz

    ${version} 是 TiDB 集群版本,例如,v5.4.1

  2. 解压安装包:

     

    tar -xzf tidb-${version}-linux-amd64.tar.gz

    pd-recover 在 tidb-${version}-linux-amd64/bin 目录下。

使用 PD Recover 恢复 PD 集群

本小节详细介绍如何使用 PD Recover 来恢复 PD 集群。

第 1 步:获取 Cluster ID

使用以下命令获取 PD 集群的 Cluster ID:

 

kubectl get tc ${cluster_name} -n ${namespace} -o='go-template={{.status.clusterID}}{{"\n"}}'

示例:

 

kubectl get tc test -n test -o='go-template={{.status.clusterID}}{{"\n"}}' 6821434242797747735

第 2 步:获取 Alloc ID

使用 pd-recover 恢复 PD 集群时,需要指定 alloc-idalloc-id 的值是一个比当前已经分配的最大的 Alloc ID 更大的值。

  1. 参考访问 Prometheus 监控数据打开 TiDB 集群的 Prometheus 访问页面。

  2. 在输入框中输入 pd_cluster_id 并点击 Execute 按钮查询数据,获取查询结果中的最大值。

  3. 将查询结果中的最大值乘以 100,作为使用 pd-recover 时指定的 alloc-id

第 3 步:恢复 PD 集群 Pod

  1. 删除 PD 集群 Pod。

    通过如下命令设置 spec.pd.replicas 为 0

     

    kubectl patch tc ${cluster_name} -n ${namespace} --type merge -p '{"spec":{"pd":{"replicas": 0}}}'

    由于此时 PD 集群异常,TiDB Operator 无法将上面的改动同步到 PD StatefulSet,所以需要通过如下命令设置 PD StatefulSet spec.replicas 为 0

     

    kubectl patch sts ${cluster_name}-pd -n ${namespace} -p '{"spec":{"replicas": 0}}'

    通过如下命令确认 PD Pod 已经被删除:

     

    kubectl get pod -n ${namespace}

  2. 确认所有 PD Pod 已经被删除后,通过如下命令删除 PD Pod 绑定的 PVC:

     

    kubectl delete pvc -l app.kubernetes.io/component=pd,app.kubernetes.io/instance=${cluster_name} -n ${namespace}

  3. PVC 删除完成后,扩容 PD 集群至一个 Pod。

    通过如下命令设置 spec.pd.replicas 为 1

     

    kubectl patch tc ${cluster_name} -n ${namespace} --type merge -p '{"spec":{"pd":{"replicas": 1}}}'

    由于此时 PD 集群异常,TiDB Operator 无法将上面的改动同步到 PD StatefulSet,所以需要通过如下命令设置 PD StatefulSet spec.replicas 为 1

     

    kubectl patch sts ${cluster_name}-pd -n ${namespace} -p '{"spec":{"replicas": 1}}'

    通过如下命令确认 PD Pod 已经启动:

     

    kubectl get pod -n ${namespace}

第 4 步:使用 PD Recover 恢复 PD 集群

  1. 通过 port-forward 暴露 PD 服务:

     

    kubectl port-forward -n ${namespace} svc/${cluster_name}-pd 2379:2379

  2. 打开一个终端标签或窗口,进入到 pd-recover 所在的目录,使用 pd-recover 恢复 PD 集群:

     

    ./pd-recover -endpoints http://127.0.0.1:2379 -cluster-id ${cluster_id} -alloc-id ${alloc_id}

    ${cluster_id} 是获取 Cluster ID 步骤中获取的 Cluster ID,${alloc_id} 是获取 Alloc ID 步骤中获取的 pd_cluster_id 的最大值再乘以 100

    pd-recover 命令执行成功后,会打印如下输出:

     

    recover success! please restart the PD cluster

  3. 回到 port-forward 命令所在窗口,按 Ctrl+C 停止并退出。

第 5 步:重启 PD Pod

  1. 删除 PD Pod:

     

    kubectl delete pod ${cluster_name}-pd-0 -n ${namespace}

  2. Pod 正常启动后,通过 port-forward 暴露 PD 服务:

     

    kubectl port-forward -n ${namespace} svc/${cluster_name}-pd 2379:2379

  3. 打开一个终端标签或窗口,通过如下命令确认 Cluster ID 为获取 Cluster ID 步骤中获取的 Cluster ID:

     

    curl 127.0.0.1:2379/pd/api/v1/cluster

  4. 回到 port-forward 命令所在窗口,按 Ctrl+C 停止并退出。

第 6 步:扩容 PD 集群

通过如下命令设置 spec.pd.replicas 为期望的 Pod 数量:

 

kubectl patch tc ${cluster_name} -n ${namespace} --type merge -p '{"spec":{"pd":{"replicas": $replicas}}}'

第 7 步:重启 TiDB 和 TiKV

使用以下命令重启 TiDB 和 TiKV 实例:

 

kubectl delete pod -l app.kubernetes.io/component=tidb,app.kubernetes.io/instance=${cluster_name} -n ${namespace} && kubectl delete pod -l app.kubernetes.io/component=tikv,app.kubernetes.io/instance=${cluster_name} -n ${namespace}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天读点书学堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值