一、先决条件
-
我们按照 TIDB 官方说的,尽量使用共享存储,因为在使用
br
恢复数据时需要将所有节点的数据手动拷贝到一起,同时执行br
命令的机器上还存在backupmeta
元数据文件。 -
本文将使用
NFS
网络共享存储进行实现 TIDB 备份与恢复
注意:本文
br
主机选择 TIDB中控机
1.1 安装 NFS 服务
- 安装并启动 NFS 软件
[root@tidb ~]# yum -y install nfs-utils rpcbind
[root@tidb ~]# systemctl start rpcbind
[root@tidb ~]# systemctl enable rpcbind
- 创建 TIDB 共享备份路径
[root@tidb ~]# mkdir -p /backup
[root@tidb ~]# chown nfsnobody.nfsnobody /backup
-
编辑 NFS 网络共享目录配置文件
-
因为对 NFS 权限控制理解有限,本文将使用
高位权限目录
all_squash
参数: 共享文件的 UID 和 GID 映射nfsnobody
用户,适合公用目录
-
但为了安全,将连接挂载来源
指定 TIDB 每个节点的 IP 地址
-
[root@tidb ~]# echo -e "/backup 10.25.21.21/32(rw,sync,all_squash)" >> /etc/exports
[root@tidb ~]# echo -e "/backup 10.25.21.22/32(rw,sync,all_squash)" >> /etc/exports
[root@tidb ~]# echo -e "/backup 10.25.21.23/32(rw,sync,all_squash)" >> /etc/exports
- 启动 NFS 服务,并设置开机自启动
[root@tidb ~]# systemctl start nfs-server
[root@tidb ~]# systemctl enable nfs-server
1.2 挂载 NFS 服务
-
挂载将在其余
3
个 TIDB 节点操作( 客户端 ) -
安装 nfs 客户端
-
注意:NFS 客户端与服务端都在一个安装包内,所以与服务端安装的软件包一致,但不需要启动 NFS 服务
-
使用
root
用户执行以下命令
-
-
检查 NFS 可挂载目录
$ showmount -e 10.25.21.20
# Export list for 10.25.21.20:
# /backup 10.25.21.23/32,10.25.21.22/32,10.25.21.21/32
-
命令交互式挂载 NFS 远程共享目录
- 不建议将 NFS 挂载配置写入
/etc/fstab
文件中,如果 NFS 服务端与 NFS 客户端网络通信出现问题,那么在 NFS 客户端重启服务器时将出现一直卡在连接 NFS 服务端这一步骤。
- 不建议将 NFS 挂载配置写入
$ yum -y install rpcbind nfs-utils
$ mkdir /home/tidb/backup
$ chown -R tidb.tidb /home/tidb/backup
$ mount -t nfs 10.25.21.20:/backup /home/tidb/backup
- 检查 NFS 挂载状态
$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
(略)....
10.25.21.20:/backup nfs4 97G 2.4G 95G 3% /home/tidb/backup
1.3 安装 BR 工具
-
下载 TIDB 工具集,压缩包内包含 BR 工具
[root@tidb ~]# wget https://download.pingcap.org/tidb-toolkit-v4.0.8-linux-amd64.tar.gz
[root@tidb ~]# tar xf tidb-toolkit-v4.0.8-linux-amd64.tar.gz -C /data
[root@tidb ~]# mv /data/tidb-toolkit-v4.0.8-linux-amd64 /data/tidb_tools
[root@tidb ~]# ll -sh /data/tidb_tools/bin/br
92M -rwxr-xr-x 1 root root 92M Oct 30 19:08 /data/tidb_tools/bin/br
二、BR 物理备份
-
本文环境将
br
工具安装到了中控机
,所以在中控机
切换到tidb
用户下执行备份命令
backup
:br
的子命令
full
:backup
的子命令
-s
或--storage
:备份保存的路径
"local:///tmp/backup"
:-s
的参数,保存的路径为各个 TiKV 节点本地磁盘的/tmp/backup
--pd
:PD 服务地址
"${PDIP}:2379"
:--pd
的参数
-
本次全量备份使用了
13
秒- 注意:使用
tidb
普通用户进行备份
- 注意:使用
[root@tidb ~]# su - tidb
[tidb@tidb ~]# /data/tidb_tools/bin/br backup full --pd "10.25.21.21:2379" --storage "local:///home/tidb/backup/$(date +%F)"
Detail BR log in /tmp/br.log.2021-02-07T16.57.52+0800
Full backup <------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> 100.00%
Checksum <---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> 100.00%
[2021/02/07 16:58:07.339 +08:00] [INFO] [collector.go:60] ["Full backup Success summary: total backup ranges: 20, total success: 20,
total failed: 0, total take(Full backup time): 13.300581029s, total take(real time): 14.349676637s, total kv: 4000000, total size(MB): 484.45, avg speed(MB/s): 36.42"] ["backup checksum"=953.957019ms]
["backup fast checksum"=2.867024ms] ["backup total regions"=20] [BackupTS=422756554643341314] [Size=217705873]
-
du 命令检查备份大小 ( 在中控机查看,因为已经配置 NFS 共享存储 )
-
本文数据是由 sysbench 压测工具生成的 10 张表,每张表 200 万数据,4 个字段
-
3
个TIKV
节点数据总量 1.7 GB 左右。1.7 GB / 3 副本 = 550M,备份压缩后 208 MB。本次测试压缩比大约2.5
倍
-
[tidb@tidb ~]# du -sh /backup/2021-02-07
208M /backup/2021-02-07
- 查看全量备份元数据文件 ( backupmeta )
[tidb@tidb ~]$ ll -sh /home/tidb/backup/2021-02-07/backupmeta
32K -rw-r--r-- 1 tidb tidb 30K Feb 7 17:13 /home/tidb/backup/2021-02-07/backupmeta
- 查看备份锁文件( 备份锁文件用于指定的备份目录是否已经存在备份文件 )
[tidb@tidb ~]$ ll -sh /home/tidb/backup/2021-02-07/backup.lock
4.0K -rw-r--r-- 1 tidb tidb 78 Feb 7 17:13 /home/tidb/backup/2021-02-07/backup.lock
三、BR 物理恢复
- 模拟数据删除( testdb 库存放 sysbench 生成的 2000 万数据的 10 张表 )
mysql> drop database testdb;
Query OK, 0 rows affected (1.08 sec)
-
恢复 TIDB 全量数据准备
拷贝备份元数据文件 ( backupmeta ) 到全量备份目录,因为在恢复数据时 BR 工具读取备份时产生的一些元数据
[tidb@tidb ~]$ /data/tidb_tools/bin/br restore full --pd "10.25.21.21:2379" --storage "local:///home/tidb/backup/2021-02-08" --ratelimit 128 --log-file restorefull.log
Detail BR log in restorefull.log
Full restore <-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------> 100.00%
[2021/02/08 15:35:36.572 +08:00] [INFO] [collector.go:60] ["Full restore Success summary: total restore files: 21, total success: 21,
total failed: 0, total take(Full restore time): 31.044878842s, total take(real time): 19.166926089s, total kv: 4000000, total size(MB): 484.45, avg speed(MB/s): 15.60"] ["split region"=133.540058ms]
["restore checksum"=17.982576436s] ["restore ranges"=20] [Size=217762628]
PS:记录一个使用
BR
的臭水坑
在恢复时指定
--storage "local:///home/tidb/backup/$(date +%F)"
代表获取 TIKV 数据到本地的/home/tidb/backup
目录。那么在进行数据恢复时应该还指定
/home/tidb/backup
目录,不能因为上传到了 NFS 服务器的/backup
目录就指定/backup
目录下面代码块内是指定 NFS 服务器
/backup
目录恢复数据时出现的错误,这种情况下只能恢复表结构。但恢复数据需要读取备份sst
文件,因为TIKV
节点去读取本地/backup
目录时时没有权限的,就算有权限也没有备份文件。
[tidb@tidb ~]$ /data/tidb_tools/bin/br restore full --pd "10.25.21.21:2379" --storage "local:///backup/2021-02-07" --ratelimit 128 --log-file restorefull.log
Detail BR log in restorefull.log
Full restore <-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------> 100.00%
Error:
permission denied: [BR:KV:ErrKVDownloadFailed]download sst failed;
permission denied: [BR:KV:ErrKVDownloadFailed]download sst failed;
permission denied: [BR:KV:ErrKVDownloadFailed]download sst failed;
permission denied: [BR:KV:ErrKVDownloadFailed]download sst failed;
permission denied: [BR:KV:ErrKVDownloadFailed]download sst failed;
permission denied: [BR:KV:ErrKVDownloadFailed]download sst failed;
permission denied: [BR:KV:ErrKVDownloadFailed]download sst failed;
permission denied: [BR:KV:ErrKVDownloadFailed]download sst failed;