使用 BR 备份集群

本文介绍备份 TiDB 集群的方式,包括:

如果你还不熟悉备份工具,建议先阅读以下文档,充分了解备份工具的使用方法和限制:

如果需要全量备份少量数据(例如小于 50 GB),且不要求备份速度,也可以选择 Dumpling 导出数据,实现备份。具体备份操作,参考使用 Dumpling 备份全量数据

备份 TiDB 集群快照

TiDB 集群快照数据是只包含某个物理时间点上集群满足事务一致性的数据。使用 br backup full 可以备份 TiDB 最新的或者指定时间点的快照数据。执行 br backup full --help 可获取该命令的使用帮助。

用例:将时间为 '2022-01-30 07:42:23' 的集群快照数据备份到 S3 的名为 backup-data bucket 下的 2022-01-30/ 前缀目录中。

br backup full \ --pd "${PDIP}:2379" \ --backupts '2022-01-30 07:42:23' \ --storage "s3://backup-data/2022-01-30/" \ --ratelimit 128 \ --log-file backupfull.log

以上命令中:

  • --backupts:快照对应的物理时间点。如果该快照的数据被 GC 了,那么 br backup 命令会报错退出;如果你没有指定该参数,那么 BR 会选取备份开始的时间点所对应的快照。
  • --ratelimit每个 TiKV 执行备份任务的速度上限(单位 MiB/s)。
  • --log-file:BR log 写入的目标文件。

备份期间有进度条在终端中显示,显示效果如下。当进度条前进到 100% 时,说明备份已完成。

br backup full \ --pd "${PDIP}:2379" \ --storage "s3://backup-data/2022-01-30/" \ --ratelimit 128 \ --log-file backupfull.log Full Backup <---------/................................................> 17.12%.

在完成备份后,BR 会将备份数据的 checksum 同集群 admin checksum table 的结果比较,以确保备份数据正确性。

备份 TiDB 集群的指定库表的数据

BR 支持只备份集群快照和增量数据中指定库/表的局部数据。该功能在快照备份和增量数据备份的基础上,过滤掉不需要的数据,帮助用户备份实现只备份关键业务的数据。

备份单个数据库的数据

要备份集群中指定单个数据库的数据,可使用 br backup db 命令。同样可通过 br backup db --help 来获取子命令 db 的使用帮助。

用例:将数据库 test 备份到 s3 的名为 backup-data 的 bucket 下面的 db-test/2022-01-30/ 前缀目录下。

br backup db \ --pd "${PDIP}:2379" \ --db test \ --storage "s3://backup-data/db-test/2022-01-30/" \ --ratelimit 128 \ --log-file backuptable.log

db 子命令的选项为 --db,用来指定数据库名。其他选项的含义与备份 TiDB 集群快照相同。

备份单张表的数据

要备份集群中指定单张表的数据,可使用 br backup table 命令。同样可通过 br backup table --help 来获取子命令 table 的使用帮助。

用例:将表 test.usertable 备份到 s3 的名为 backup-data 的 bucket 下面的 table-db-usertable/2022-01-30/ 前缀目录下。

br backup table \ --pd "${PDIP}:2379" \ --db test \ --table usertable \ --storage "s3://backup-data/table-db-usertable/2022-01-30/" \ --ratelimit 128 \ --log-file backuptable.log

table 子命令有 --db--table 两个选项,分别用来指定数据库名和表名。其他选项的含义与备份 TiDB 集群快照相同。

使用表库过滤功能备份多张表的数据

如果你需要以更复杂的过滤条件来备份多个库/表,执行 br backup full 命令,并使用 --filter-f 来指定表库过滤规则。

用例:以下命令将所有 db*.tbl* 形式的表格数据备份到 s3 的名为 backup-data 的 bucket 下面的 table-filter/2022-01-30/ 前缀目录下。

br backup full \ --pd "${PDIP}:2379" \ --filter 'db*.tbl*' \ --storage "s3://backup-data/table-filter/2022-01-30/" \ --ratelimit 128 \ --log-file backupfull.log

备份数据到远端存储

BR 支持将数据备份到 Amazon S3、Google Cloud Storage、Azure Blob Storage、NFS 或者实现 S3 协议的其他文件存储服务。下面逐一介绍如何备份数据到对应的备份存储中。

备份 TiDB 集群增量数据

TiDB 集群增量数据包含某个时间段的起始和结束两个快照的差异变化的数据。 增量数据相对比快照数据而言数据量更小,适合配合快照备份一起使用,来减少备份的数据量。

如果想要备份增量数据,只需要使用 br backup 进行备份的时候指定上一次的备份时间戳 --lastbackupts 即可。你可以使用 validate 指令获取上一次备份的时间戳,示例如下:

LAST_BACKUP_TS=`br validate decode --field="end-version" -s s3://backup-data/2022-01-30/ | tail -n1`
br backup full\ --pd ${PDIP}:2379 \ --ratelimit 128 \ --storage "s3://backup-data/2022-01-30/incr" \ --lastbackupts ${LAST_BACKUP_TS}

以上命令会备份 (LAST_BACKUP_TS, current PD timestamp] 之间的增量数据,以及这段时间内的 DDL。在恢复的时候,BR 会先把所有 DDL 恢复,而后才会恢复数据。

备份数据加密

BR 支持在备份端,或备份到 Amazon S3 的时候在存储服务端,进行备份数据加密,用户可以根据自己情况选择其中一种使用。

备份端加密备份数据

自 TiDB v5.3.0 起,你可配置下列参数在备份过程中到达加密数据的效果:

  • --crypter.method:加密算法,支持 aes128-ctr/aes192-ctr/aes256-ctr 三种算法,缺省值为 plaintext,表示不加密
  • --crypter.key:加密密钥,十六进制字符串格式,aes128-ctr 对应 128 位(16 字节)密钥长度,aes192-ctr 为 24 字节,aes256-ctr 为 32 字节
  • --crypter.key-file:密钥文件,可直接将存放密钥的文件路径作为参数传入,此时 crypter.key 不需要传入

备份加密的示例如下:

br backup full\ --pd ${PDIP}:2379 \ --storage "s3://backup-data/2022-01-30/" \ --crypter.method aes128-ctr \ --crypter.key 0123456789abcdef0123456789abcdef

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

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

校验备份数据

使用 BR 完成数据备份后,你可以对备份数据进行校验,包括检查备份数据是否完整,以及通过解码 backupmeta 来查看 TSO 等元信息。

检查备份数据的完整性

要检查数据完整性,可以执行 tiup br debug checksum 命令对备份数据计算校验和。

用例:在 Amazon S3 上名为 backup-data 的 bucket 下,计算 ${prefix} 前缀目录下备份的校验和。

br debug checksum \ --storage 's3://backup-data/${prefix}' \ --s3.endpoint '${S3-endpoint-URL}' \ --log-file checksum.log

将备份的 backupmeta 解码为 json 格式的可读文件

在备份完成后,可通过 tiup br debug decode 命令将备份的 backupmeta 解码为 json 格式的可读文件,从而查看快照对应的 TSO 等元信息。

用例:在 Amazon S3 上名为 backup-data 的 bucket 下,将 ${prefix} 前缀目录下备份的 backupmeta 解码为 json 格式的文件 backupmeta.json,解码后的文件存储路径为 s3://backup-data/${prefix}/backupmeta.json

br debug decode \ --storage 's3://backup-data/${prefix}' \ --s3.endpoint '${S3-endpoint-URL}' \ --log-file decode-backupmeta.log

然后打开 backupmeta.json 文件,搜索 end_version 可以查看到快照对应的 TSO。

如有需要,你也可以将 json 格式的 backupmeta 文件编码回解码前的状态。执行 tiup br debug encode 命令,生成的文件名为 backupmeta_from_json

用例:在 Amazon S3 上名为 backup-data 的 bucket 下,将 ${prefix} 前缀目录下备份的 backupmeta.json 文件编码为 backupmeta 文件,编码后的文件名为 backupmeta_from_json,存储路径为 s3://backup-data/${prefix}/backupmeta_from_json

br debug encode \ --storage 's3://backup-data/${prefix}' \ --s3.endpoint '${S3-endpoint-URL}' \ --log-file encode-backupmeta.log

备份性能和影响

TiDB 备份功能对集群性能(事务延迟和 QPS)有一定的影响,但是可以通过调整备份的线程数 backup.num-threads ,以及增加集群配置,来降低备份对集群性能的影响。

为了更加具体说明备份对集群的影响,这里列举了多次快照备份测试结论来说明影响的范围:

  • (使用 5.3 及之前版本)BR 在单 TiKV 存储节点上备份线程数量是节点 CPU 总数量的 75% 的时候,QPS 会下降到备份之前的 30% 左右。
  • (使用 5.4 及以后版本)当 BR 在单 TiKV 存储节点上备份的线程数量不大于 8、集群总 CPU 利用率不超过 80% 时,BR 备份任务对集群(无论读写负载)影响最大在 20% 左右。
  • (使用 5.4 及以后版本)当 BR 在单 TiKV 存储节点上备份的线程数量不大于 8、集群总 CPU 利用率不超过 75% 时,BR 备份任务对集群(无论读写负载)影响最大在 10% 左右。
  • (使用 5.4 及以后版本)当 BR 在单 TiKV 存储节点上备份的线程数量不大于 8、集群总 CPU 利用率不超过 60% 时,BR 备份任务对集群(无论读写负载)几乎没有影响。

通过限制备份的线程数量可以降低备份对集群性能的影响,但是这会影响到备份的性能,以上的多次备份测试结果显示:(单 TiKV 存储节点上)备份速度和备份线程数量呈正比,在线程数量量较少的时候,速度大概是 20M/线程数。例如,单节点 5 个备份线程可达到 100M/s。

BR 在 5.3 版本引入自动调节备份线程数的功能(默认开启),它可以帮助用户将备份期间集群总 CPU 使用率尽量维持在 80% 以下,具体介绍可以参考 备份线程自动调节