备份存储

TiDB 支持 Amazon S3、Google Cloud Storage (GCS)、Azure Blob Storage 和 NFS 作为备份恢复的存储。具体来说,可以在 br--storage-s 选项中指定备份存储的 URI。本文介绍不同外部存储服务中 URI 的定义格式、存储过程中的鉴权方案以及存储服务端加密

BR 向 TiKV 发送凭证

命令行参数描述默认值
--send-credentials-to-tikv是否将 BR 获取到的权限凭证发送给 TiKV。true

在默认情况下,使用 Amazon S3、Google Cloud Storage (GCS)、Azure Blob Storage 存储时,BR 会将凭证发送到每个 TiKV 节点,以减少设置的复杂性。该操作由参数 --send-credentials-to-tikv(或简写为 -c)控制。

但是,这个操作不适合云端环境,如果采用了 IAM Role 方式授权,那么每个节点都有自己的角色和权限。在这种情况下,你需要设置 --send-credentials-to-tikv=false(或简写为 -c=0)来禁止发送凭证:

./br backup full -c=0 -u pd-service:2379 --storage 's3://bucket-name/prefix'

使用 SQL 进行备份恢复时,可加上 SEND_CREDENTIALS_TO_TIKV = FALSE 选项:

BACKUP DATABASE * TO 's3://bucket-name/prefix' SEND_CREDENTIALS_TO_TIKV = FALSE;

URI 格式

格式说明

本部分介绍存储服务的 URI 格式:

[scheme]://[host]/[path]?[parameters]
  • Amazon S3
  • GCS
  • Azure Blob Storage
  • schemes3

  • hostbucket name

  • parameters

    • access-key:访问密钥
    • secret-access-key:秘密访问密钥
    • session-token:会话令牌
    • use-accelerate-endpoint:是否在 Amazon S3 上使用加速端点,默认为 false
    • endpoint:Amazon S3 兼容服务自定义端点的 URL,例如 <https://s3.example.com/>
    • force-path-style:使用路径类型 (path-style),而不是虚拟托管类型 (virtual-hosted-style),默认为 true
    • storage-class:上传对象的存储类别,例如 STANDARDSTANDARD_IA
    • sse:加密上传的服务端加密算法,可以设置为空、AES256aws:kms
    • sse-kms-key-id:如果 sse 设置为 aws:kms,则使用该参数指定 KMS ID
    • acl:上传对象的标准 ACL (Canned ACL),例如 privateauthenticated-read
    • role-arn:当需要使用特定的 IAM 角色来访问第三方 Amazon S3 的数据时,使用这个参数来指定 IAM 角色的对应 Amazon Resource Name (ARN)(例如 arn:aws:iam::888888888888:role/my-role)。关于使用 IAM 角色访问第三方 Amazon S3 数据的场景,请参考 AWS 相关文档介绍
    • external-id:当需要使用特定的 IAM 角色来访问第三方 Amazon S3 的数据时,可能需要同时提供正确的外部 ID 来确保用户有权限代入该 IAM 角色。这个参数用来指定对应的外部 ID,确保成功代入 IAM 角色。外部 ID 可以是任意字符串,并且不是必须的,一般由控制 Amazon S3 数据访问的第三方来指定。如果第三方对于 IAM 角色没有要求指定外部 ID,则可以不需要提供该参数也能顺利代入对应的 IAM 角色,从而访问对应的 Amazon S3 数据。
  • schemegcsgs

  • hostbucket name

  • parameters

    • credentials-file:迁移工具节点上凭证 JSON 文件的路径
    • storage-class:上传对象的存储类别,例如 STANDARDCOLDLINE
    • predefined-acl:上传对象的预定义 ACL,例如 privateproject-private
  • schemeazureazblob

  • hostcontainer name

  • parameters

    • account-name:存储账户名
    • account-key:访问密钥
    • access-tier:上传对象的存储类别,例如 HotCoolArchive,默认为 Hot

URI 示例

本部分示例以 host(上表中 bucket namecontainer name)为 external 为例进行介绍。

  • Amazon S3
  • GCS
  • Azure Blob Storage

备份快照数据到 Amazon S3

./br backup full -u "${PD_IP}:2379" \ --storage "s3://external/backup-20220915?access-key=${access-key}&secret-access-key=${secret-access-key}"

从 Amazon S3 恢复快照备份数据

./br restore full -u "${PD_IP}:2379" \ --storage "s3://external/backup-20220915?access-key=${access-key}&secret-access-key=${secret-access-key}"

备份快照数据到 GCS

./br backup full --pd "${PD_IP}:2379" \ --storage "gcs://external/backup-20220915?credentials-file=${credentials-file-path}"

从 GCS 恢复快照备份数据

./br restore full --pd "${PD_IP}:2379" \ --storage "gcs://external/backup-20220915?credentials-file=${credentials-file-path}"

备份快照数据到 Azure Blob Storage

./br backup full -u "${PD_IP}:2379" \ --storage "azure://external/backup-20220915?account-name=${account-name}&account-key=${account-key}"

从 Azure Blob Storage 恢复快照备份数据中 test 数据库

./br restore db --db test -u "${PD_IP}:2379" \ --storage "azure://external/backup-20220915account-name=${account-name}&account-key=${account-key}"

鉴权

将数据存储到云服务存储系统时,根据云服务供应商的不同,需要设置不同的鉴权参数。本部分介绍使用 Amazon S3、GCS 及 Azure Blob Storage 时所用存储服务的鉴权方式以及如何配置访问相应存储服务的账户。

  • Amazon S3
  • GCS
  • Azure Blob Storage

在备份之前,需要为 br 命令行工具访问 Amazon S3 中的备份目录设置相应的访问权限:

  • 备份时 TiKV 和 br 命令行工具需要的访问备份数据目录的最小权限:s3:ListBuckets3:PutObjects3:AbortMultipartUpload
  • 恢复时 TiKV 和 br 命令行工具需要的访问备份数据目录的最小权限:s3:ListBuckets3:GetObject

如果你还没有创建备份数据保存目录,可以参考创建存储桶在指定的区域中创建一个 S3 存储桶。如果需要使用文件夹,可以参考使用文件夹在 Amazon S3 控制台中组织对象在存储桶中创建一个文件夹。

配置访问 Amazon S3 的账户可以通过以下两种方式:

  • 方式一:指定访问密钥

    如果指定访问密钥和秘密访问密钥,将按照指定的访问密钥和秘密访问密钥进行鉴权。除了在 URI 中指定密钥外,还支持以下方式:

    • br 命令行工具读取 $AWS_ACCESS_KEY_ID$AWS_SECRET_ACCESS_KEY 环境变量
    • br 命令行工具读取 $AWS_ACCESS_KEY$AWS_SECRET_KEY 环境变量
    • br 命令行工具读取共享凭证文件,路径由 $AWS_SHARED_CREDENTIALS_FILE 环境变量指定
    • br 命令行工具读取共享凭证文件,路径为 ~/.aws/credentials
  • 方式二:基于 IAM Role 进行访问

    为运行 TiKV 和 br 命令行工具的 EC2 实例关联一个配置了访问 S3 访问权限的 IAM role。正确设置后,br 命令行工具可以直接访问对应的 S3 中的备份目录,而不需要额外的设置。

    br backup full --pd "${PD_IP}:2379" \ --storage "s3://${host}/${path}"

配置访问 GCS 的账户可以通过指定访问密钥的方式。如果指定了 credentials-file 参数,将按照指定的 credentials-file 进行鉴权。除了在 URI 中指定密钥文件外,还支持以下方式:

  • br 命令行工具读取位于 $GOOGLE_APPLICATION_CREDENTIALS 环境变量所指定路径的文件内容
  • br 命令行工具读取位于 ~/.config/gcloud/application_default_credentials.json 的文件内容
  • 在 GCE 或 GAE 中运行时,从元数据服务器中获取的凭证
  • 方式一:指定访问密钥

    在 URI 配置 account-nameaccount-key,则使用该参数指定的密钥。除了在 URI 中指定密钥文件外,还支持 br 命令行工具读取 $AZURE_STORAGE_KEY 的方式。

  • 方式二:使用 Azure AD 备份恢复

    在 br 命令行工具运行环境配置环境变量 $AZURE_CLIENT_ID$AZURE_TENANT_ID$AZURE_CLIENT_SECRET

    • 当集群使用 TiUP 启动时,TiKV 会使用 systemd 服务。以下示例介绍如何为 TiKV 配置上述三个环境变量:

      1. 假设该节点上 TiKV 端口为 24000,即 systemd 服务名为 tikv-24000

        systemctl edit tikv-24000
      2. 编辑三个环境变量的信息:

        [Service] Environment="AZURE_CLIENT_ID=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" Environment="AZURE_TENANT_ID=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" Environment="AZURE_CLIENT_SECRET=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      3. 重新加载配置并重启 TiKV:

        systemctl daemon-reload systemctl restart tikv-24000
    • 为命令行启动的 TiKV 和 br 命令行工具配置 Azure AD 的信息,只需要确定运行环境中存在 $AZURE_CLIENT_ID$AZURE_TENANT_ID$AZURE_CLIENT_SECRET。通过运行下列命令行,可以确认 br 命令行工具和 TiKV 运行环境中是否存在这三个环境变量:

      echo $AZURE_CLIENT_ID echo $AZURE_TENANT_ID echo $AZURE_CLIENT_SECRET
    • 使用 br 命令行工具将数据备份至 Azure Blob Storage:

      ./br backup full -u "${PD_IP}:2379" \ --storage "azure://external/backup-20220915?account-name=${account-name}"

存储服务端加密

Amazon S3 存储服务端加密备份数据

TiDB 备份恢复功能支持对备份到 Amazon S3 的数据进行 S3 服务端加密 (SSE)。S3 服务端加密也支持使用用户自行创建的 AWS KMS 密钥,详细信息请参考 BR S3 服务端加密

存储服务其他功能支持

TiDB 备份恢复功能从 v6.3.0 支持 AWS S3 Object Lock 功能。你可以在 AWS 中开启 S3 Object Lock 功能来防止备份数据写入后被修改或者删除。