使用 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 集群。

环境准备

参考环境准备

将指定备份数据恢复到 TiDB 集群

注意:

由于 rclone 存在问题,如果使用 Amazon S3 存储备份,并且 Amazon S3 开启了 AWS-KMS 加密,需要在本节示例中的 yaml 文件里添加如下 spec.s3.options 配置以保证备份恢复成功:

spec:
  ...
  s3:
    ...
    options:
    - --ignore-checksum
  1. 创建 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
      
  2. 创建好 Restore CR 后,可通过以下命令查看恢复的状态:

    kubectl get rt -n test2 -owide
    

以上示例将兼容 S3 的存储(spec.s3.path 路径下)中的备份数据恢复到 TiDB 集群 (spec.to.host)。有关兼容 S3 的存储的配置项,可以参考 backup-s3.yaml

更多 Restore CR 字段的详细解释:

  • .spec.metadata.namespaceRestore 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 集群备份的数据大小。