天天看點

使用 TiDB Lightning 恢複 Kubernetes 上的叢集資料

本文介紹了如何使用 TiDB Lightning 快速恢複 Kubernetes 上的 TiDB 叢集資料。

TiDB Lightning 包含兩個元件:tidb-lightning 和 tikv-importer。在 Kubernetes 上,tikv-importer 位于單獨的 Helm chart 内,被部署為一個副本數為 1 (replicas=1) 的 StatefulSet;tidb-lightning 位于單獨的 Helm chart 内,被部署為一個 Job。

為了使用 TiDB Lightning 恢複資料,tikv-importer 和 tidb-lightning 都必須分别部署。

部署 tikv-importer

可以通過 tikv-importer Helm chart 來部署 tikv-importer,示例如下:

確定 PingCAP Helm 庫是最新的:

helm repo update

helm search tikv-importer -l

擷取預設的 values.yaml 檔案以友善自定義:

helm inspect values pingcap/tikv-importer --version=${chart_version} > values.yaml

修改 values.yaml 檔案以指定目标 TiDB 叢集。示例如下:

clusterName: demo

image: pingcap/tidb-lightning:v3.0.8

imagePullPolicy: IfNotPresent

storageClassName: local-storage

storage: 20Gi

pushgatewayImage: prom/pushgateway:v0.3.1

pushgatewayImagePullPolicy: IfNotPresent

config: |

log-level = "info"

[metric]

job = "tikv-importer"

interval = "15s"

address = "localhost:9091"

clusterName 必須比對目标 TiDB 叢集。

部署 tikv-importer:

helm install pingcap/tikv-importer --name=${cluster_name} --namespace=${namespace} --version=${chart_version} -f values.yaml

注意:

tikv-importer 必須與目标 TiDB 叢集安裝在相同的命名空間中。

部署 tidb-lightning

配置 TiDB Lightning

使用如下指令獲得 TiDB Lightning 的預設配置:

helm inspect values pingcap/tidb-lightning --version=${chart_version} > tidb-lightning-values.yaml

tidb-lightning Helm chart 支援恢複本地或遠端的備份資料。

本地模式:

本地模式要求 Mydumper 備份資料位于其中一個 Kubernetes 節點上。要啟用該模式,你需要将 dataSource.local.nodeName 設定為該節點名稱,将 dataSource.local.hostPath 設定為 Mydumper 備份資料目錄路徑,該路徑中需要包含名為 metadata 的檔案。

遠端模式:

與本地模式不同,遠端模式需要使用 rclone 将 Mydumper 備份 tarball 檔案從網絡存儲中下載下傳到 PV 中。遠端模式能在 rclone 支援的任何雲存儲下工作,目前已經有以下存儲進行了相關測試:Google Cloud Storage (GCS)、Amazon S3 和 Ceph Object Storage。

使用遠端模式恢複備份資料的步驟如下:

確定 values.yaml 中的 dataSource.local.nodeName 和 dataSource.local.hostPath 被注釋掉。

建立一個包含 rclone 配置的 Secret。rclone 配置示例如下。一般隻需要配置一種雲存儲。有關其他的雲存儲,請參考 rclone 官方文檔。和使用 BR 和 Mydumper 進行資料恢複時一樣,使用 Amazon S3 作為後端存儲時,同樣存在三種權限授予方式,參考使用 BR 工具備份 AWS 上的 TiDB 叢集。在使用不同的權限授予方式時,需要使用不用的配置。

使用 Amazon S3 AccessKey 和 SecretKey 權限授予方式,或者使用 Ceph、GCS 作為存儲後端時:

apiVersion: v1

kind: Secret

metadata:

name: cloud-storage-secret

type: Opaque

stringData:

rclone.conf: |

[s3]

type = s3

provider = AWS

env_auth = false

access_key_id = ${access_key}

secret_access_key = ${secret_key}

region = us-east-1

[ceph]

provider = Ceph

endpoint = ${endpoint}

region = :default-placement

[gcs]

type = google cloud storage

# 該服務賬号必須被授予 Storage Object Viewer 角色。

# 該内容可以通過

cat ${service-account-file} | jq -c .

指令擷取。

service_account_credentials = ${service_account_json_file_content}

使用 Amazon S3 IAM 綁定 Pod 的授權方式或者 Amazon S3 IAM 綁定 ServiceAccount 授權方式時,可以省略 s3.access_key_id 以及 `s3.secret_access_key:

env_auth = true

access_key_id =

secret_access_key =

使用你的實際配置替換上述配置中的占位符,并将該檔案存儲為 secret.yaml。然後通過 kubectl apply -f secret.yaml -n ${namespace} 指令建立該 Secret。

将 dataSource.remote.storageClassName 設定為 Kubernetes 叢集中現有的一個存儲類型。

部署 TiDB Lightning

部署 TiDB Lightning 的方式根據不同的權限授予方式及存儲方式,有不同的情況。

使用 Amazon S3 AccessKey 和 SecretKey 權限授予方式,或者使用 Ceph,GCS 作為存儲後端時,運作以下指令部署 TiDB Lightning:

helm install pingcap/tidb-lightning --name=${release_name} --namespace=${namespace} --set failFast=true -f tidb-lightning-values.yaml --version=${chart_version}

使用 Amazon S3 IAM 綁定 Pod 的授權方式時,需要做以下步驟:

建立 IAM 角色:

可以參考 AWS 官方文檔來為賬号建立一個 IAM 角色,并且通過 AWS

QQ靓号買号

官方文檔為 IAM 角色賦予需要的權限。由于 Lightning 需要通路 AWS 的 S3 存儲,是以這裡給 IAM 賦予了 AmazonS3FullAccess 的權限。

修改 tidb-lightning-values.yaml, 找到字段 annotations,增加 annotation iam.amazonaws.com/role: arn:aws:iam::123456789012:role/user。

部署 Tidb-Lightning:

arn:aws:iam::123456789012:role/user 為步驟 1 中建立的 IAM 角色。

使用 Amazon S3 IAM 綁定 ServiceAccount 授權方式時:

在叢集上為服務帳戶啟用 IAM 角色:

可以參考 AWS 官方文檔 開啟所在的 EKS 叢集的 IAM 角色授權。

可以參考 AWS 官方文檔建立一個 IAM 角色,為角色賦予 AmazonS3FullAccess 的權限,并且編輯角色的 Trust relationships。

綁定 IAM 到 ServiceAccount 資源上:

kubectl annotate sa ${servieaccount} -n eks.amazonaws.com/role-arn=arn:aws:iam::123456789012:role/user

helm install pingcap/tidb-lightning --name=${release_name} --namespace=${namespace} --set-string failFast=true,serviceAccount=${servieaccount} -f tidb-lightning-values.yaml --version=${chart_version}

arn:aws:iam::123456789012:role/user 為步驟 1 中建立的 IAM 角色。 ${service-account} 為 tidb-lightning 使用的 ServiceAccount,預設為 default。

當 TiDB Lightning 未能成功恢複資料時,不能簡單地直接重新開機程序,必須進行手動幹預,否則将很容易出現錯誤。是以,tidb-lightning 的 Job 重新開機政策被設定為 Never。

如果 TiDB Lightning 未能成功恢複資料,需要采用以下步驟進行手動幹預:

運作 kubectl delete job -n ${namespace} ${release_name}-tidb-lightning,删除 lightning Job。

運作 helm template pingcap/tidb-lightning --name ${release_name} --set failFast=false -f tidb-lightning-values.yaml | kubectl apply -n ${namespace} -f -,重新建立禁用 failFast 的 lightning Job。

當 lightning pod 重新運作時,在 lightning 容器中執行 kubectl exec -it -n ${namespace} ${pod_name} sh 指令。

運作 cat /proc/1/cmdline,獲得啟動腳本。

參考故障排除指南,對 lightning 進行診斷。

銷毀 TiDB Lightning

目前,TiDB Lightning 隻能線上下恢複資料。當恢複過程結束、TiDB 叢集需要向外部應用提供服務時,可以銷毀 TiDB Lightning 以節省開支。

删除 tikv-importer 的步驟:

運作 helm delete ${release_name} --purge。

删除 tidb-lightning 的方法: