使用 TiDB Lightning 恢复 S3 兼容存储上的备份数据
本文描述了将 Kubernetes 上通过 TiDB Operator 备份的数据恢复到 TiDB 集群的操作过程。底层通过使用 TiDB Lightning 来恢复数据。
本文使用的恢复方式基于 TiDB Operator 新版(v1.1 及以上)的 CustomResourceDefinition (CRD) 实现。基于 Helm Charts 实现的备份和恢复方式可参考基于 Helm Charts 实现的 TiDB 集群备份恢复。
AWS 账号的三种权限授予方式
如果使用 Amazon S3 来备份恢复集群,可以使用三种权限授予方式授予权限,参考使用 BR 工具备份 AWS 上的 TiDB 集群,使用 Ceph 作为后端存储测试备份恢复时,是通过 AccessKey 和 SecretKey 模式授权。
以下示例将兼容 S3 的存储(指定路径)上的备份数据恢复到 TiDB 集群。
环境准备
参考环境准备
数据库账户权限
权限 | 作用域 |
---|---|
SELECT | Tables |
INSERT | Tables |
UPDATE | Tables |
DELETE | Tables |
CREATE | Databases, tables |
DROP | Databases, tables |
ALTER | Tables |
将指定备份数据恢复到 TiDB 集群
注意:
由于
rclone
存在问题,如果使用 Amazon S3 存储备份,并且 Amazon S3 开启了AWS-KMS
加密,需要在本节示例中的 yaml 文件里添加如下spec.s3.options
配置以保证备份恢复成功:spec: ... s3: ... options: - --ignore-checksum
创建 Restore customer resource (CR),将制定备份数据恢复至 TiDB 集群
创建 Restore custom resource (CR),通过 AccessKey 和 SecretKey 授权的方式将指定的备份数据由 Ceph 恢复至 TiDB 集群:
kubectl apply -f restore.yaml
restore.yaml
文件内容如下:--- apiVersion: pingcap.com/v1alpha1 kind: Restore metadata: name: demo2-restore namespace: test2 spec: backupType: full to: host: ${tidb_host} port: ${tidb_port} user: ${tidb_user} secretName: restore-demo2-tidb-secret s3: provider: ceph endpoint: ${endpoint} secretName: s3-secret path: s3://${backup_path} # storageClassName: local-storage storageSize: 1Gi
创建 Restore custom resource (CR),通过 AccessKey 和 SecretKey 授权的方式将指定的备份数据由 Amazon S3 恢复至 TiDB 集群:
kubectl apply -f restore.yaml
restore.yaml
文件内容如下:--- apiVersion: pingcap.com/v1alpha1 kind: Restore metadata: name: demo2-restore namespace: test2 spec: backupType: full to: host: ${tidb_host} port: ${tidb_port} user: ${tidb_user} secretName: restore-demo2-tidb-secret s3: provider: aws region: ${region} secretName: s3-secret path: s3://${backup_path} # storageClassName: local-storage storageSize: 1Gi
创建 Restore custom resource (CR),通过 IAM 绑定 Pod 授权的方式将指定的备份数据恢复至 TiDB 集群:
kubectl apply -f restore.yaml
restore.yaml
文件内容如下:--- apiVersion: pingcap.com/v1alpha1 kind: Restore metadata: name: demo2-restore namespace: test2 annotations: iam.amazonaws.com/role: arn:aws:iam::123456789012:role/user spec: backupType: full to: host: ${tidb_host} port: ${tidb_port} user: ${tidb_user} secretName: restore-demo2-tidb-secret s3: provider: aws region: ${region} path: s3://${backup_path} # storageClassName: local-storage storageSize: 1Gi
创建 Restore custom resource (CR),通过 IAM 绑定 ServiceAccount 授权的方式将指定的备份数据恢复至 TiDB 集群:
kubectl apply -f restore.yaml
restore.yaml
文件内容如下:--- apiVersion: pingcap.com/v1alpha1 kind: Restore metadata: name: demo2-restore namespace: test2 spec: backupType: full serviceAccount: tidb-backup-manager to: host: ${tidb_host} port: ${tidb_port} user: ${tidb_user} secretName: restore-demo2-tidb-secret s3: provider: aws region: ${region} path: s3://${backup_path} # storageClassName: local-storage storageSize: 1Gi
创建好
Restore
CR 后,可通过以下命令查看恢复的状态:kubectl get rt -n test2 -owide
以上示例将兼容 S3 的存储(spec.s3.path
路径下)中的备份数据恢复到 TiDB 集群 (spec.to.host
)。有关兼容 S3 的存储的配置项,可以参考 backup-s3.yaml。
更多 Restore
CR 字段的详细解释:
.spec.metadata.namespace
:Restore
CR 所在的 namespace。.spec.to.host
:待恢复 TiDB 集群的访问地址。.spec.to.port
:待恢复 TiDB 集群的访问端口。.spec.to.user
:待恢复 TiDB 集群的访问用户。.spec.to.secretName
:存储.spec.to.user
用户的密码的 secret。.spec.storageClassName
:指定恢复时所需的 PV 类型。.spec.storageSize
:指定恢复集群时所需的 PV 大小。该值应大于 TiDB 集群备份的数据大小。
注意:
TiDB Operator 会创建一个 PVC,用于数据恢复,备份数据会先从远端存储下载到 PV,然后再进行恢复。如果恢复完成后想要删掉这个 PVC,可以参考删除资源先把恢复 Pod 删掉,然后再把 PVC 删掉。
故障诊断
在使用过程中如果遇到问题,可以参考故障诊断。