基于 EBS 卷快照的备份恢复功能架构
基于 EBS 卷快照的备份恢复功能以 TiDB Operator 为使用入口。本文以使用 TiDB Operator 进行备份恢复为例,介绍备份和恢复的功能架构和流程。
基于 EBS 卷快照的备份恢复功能架构如下:
备份 EBS 卷快照
EBS 卷快照备份流程如下:
用户提交备份 CRD
- TiDB Operator 检查和收集当前集群 TiKV 已挂载卷信息。
- TiDB Operator 使用挂载卷信息创建备份任务。
BR 暂停 TiDB 集群调度以及 GC
- pause region scheduler:BR 向 TiDB Cluster 发起暂停调度请求。
- pause gc:BR 向 TiDB Cluster 发起暂停 GC 请求。
BR 获取备份数据 backupts
- retrieve backupts:BR 向 TiDB Cluster 获取 backupts。
BR 向 AWS 服务发起创建卷快照请求
- ec2 create snapshot:BR 向 AWS 服务发起创建卷快照请求。
BR 恢复 TiDB 集群调度以及 GC,并等待所有的 EBS 卷的快照创建完成。
- resume region scheduler:BR 向 TiDB Cluster 发起恢复调度请求。
- resume gc:BR 请求 TiDB Cluster 恢复 GC。
BR 保存元数据信息到 S3 并退出。备份完成。
- ec2 snapshot complete:BR 向 AWS 服务查询所有卷的快照状态,直到所有卷达到 Complete 状态。
- save backupmeta to s3:BR 保存备份元数据到 S3。
恢复 EBS 卷快照
EBS 卷快照恢复流程如下:
用户以恢复模式创建 TiDB 集群,即在 Spec 中指定
spec.recoveryMode:true
。- 恢复模式创建的 TiDB 集群,将会首先启动 PD 节点,不启动 TiKV 节点,同时等待用户创建恢复任务进行下一步恢复。
用户创建恢复任务。
- enter recovery mode:BR 设置 TiDB 集群为 recovery mode。
- retrieve backupmeta from s3:BR 获取备份元数据信息,并从中提取已备份的快照以及 backupts。
- create volume from snapshot:BR 调用 AWS API,从备份快照创建卷,并返回给 TiDB Operator。
TiDB Operator 使用恢复的 EBS 卷配置 TiDB 集群,同时启动所有的 TiKV 节点。
- TiDB Operator 配置 Kubernetes,并挂载恢复的卷到相应的节点。
- config cluster and start tikv:配置完成后,启动 TiKV 节点。TiKV 进入 recovery mode,等待下一步的数据恢复。在 recovery mode 下,raft 状态机以及相关的状态检查操作被停止。
TiDB Operator 启动 BR 数据恢复子任务,获取并恢复 TiDB Cluster 数据。
- raft log recovery:BR 读取集群的 region meta, 汇总计算决策出每个 region 的 leader,让 leader 在 TiKV 上主动发起竞选来启动 raft 共识层的日志恢复。
- k-v data recovery:BR 使用备份的
backupts
进行数据恢复。BR 删除数据版本大于backupts
的 key-value 数据,从而确保事务数据集群级别的一致性。 - exit recovery mode:TiDB 集群退出恢复模式,数据恢复完成。BR 返回给 TiDB Operator
data complete
。
TiDB Operator 启动 TiDB Cluster 的 TiDB 节点,整个恢复任务完成。
- start tidb:TiDB Operator 启动 TiDB Cluster 的所有 TiDB 节点,集群对外提供服务。
备份元数据信息
.
├── backupmeta
│ ├── cluster-info
│ │ ├── version
│ │ ├── backup_type
│ │ ├── resolved_ts
│ ├── store_volumes
│ │ ├── volume_id
│ │ ├── volume_type
│ │ ├── snapshot_id
│ │ ├── volume_az
│ ├── kubernetes
│ │ ├── pvcs
│ │ ├── crd
具体示例如下
{
"cluster_info": {
"cluster_version": "6.3.0-alpha",
"full_backup_type": "aws-ebs",
"resolved_ts": 436732770870624257,
},
"tikv": {
"replicas": 1,
"stores": [
{
"store_id": 1,
"volumes": [
{
"volume_id": "vol-0bedb7ec0993f8a41",
"type": "raft-engine.dir",
"snapshot_id": "snap-074769e94078a89b7",
"volume_az": "us-west-2a",
},
{
"volume_id": "vol-08b303894657288a9",
"type": "storage.data-dir",
"snapshot_id": "snap-07b969994a363fdab",
"volume_az": "us-west-2a",
}
]
},
]
},
"kubernetes": {
"pvs": [
],
"pvcs": [
],
"crd_tidb_cluster": {
},
},
}