1. 首页 > 国产数据库教程 > TiDB教程 > 正文

tidb教程FG134-TiDB高可用与灾备最佳实践

fgedu.net.cn

目录

一、基础概念

1.1 高可用定义

高可用(High Availability,HA)是指系统在面对各种故障时能够保持正常运行的能力。TiDB通过多副本存储、自动故障转移等机制实现高可用。

1.2 灾备定义

灾备(Disaster Recovery,DR)是指在发生自然灾害、人为失误等灾难时,能够快速恢复系统运行的能力。TiDB通过跨区域复制、定期备份等机制实现灾备。

1.3 关键指标

  • 可用性:系统正常运行的时间比例,通常用几个9表示(如99.99%)
  • RTO(恢复时间目标):从故障发生到系统恢复正常运行的时间
  • RPO(恢复点目标):故障发生后,系统能够恢复到的最近数据点
  • 数据一致性:主备系统之间的数据一致性程度

二、规划建议

2.1 高可用架构规划

  • 多副本部署:TiKV默认3副本,确保数据安全
  • 跨可用区部署:将节点分布在不同的可用区,提高容灾能力
  • 负载均衡:使用负载均衡器分发请求
  • 自动故障转移:当节点故障时,自动切换到健康节点

2.2 灾备架构规划

  • 跨区域复制:使用TiCDC实现跨区域数据同步
  • 定期备份:使用BR工具定期备份数据
  • 灾备演练:定期进行灾备演练,确保灾备系统可用
  • RTO和RPO规划:根据业务需求设定合理的RTO和RPO目标

2.3 网络规划

  • 内部网络:集群内部使用高速网络
  • 跨区域网络:确保跨区域网络带宽和延迟满足需求
  • 网络安全:配置防火墙,确保网络安全

三、实施方案

3.1 高可用部署

多副本部署

# 部署TiDB集群
# 编辑拓扑文件
tiup cluster template > topology.yaml

# 配置多副本
# 在拓扑文件中配置3个TiKV节点

# 部署集群
tiup cluster deploy tidb-cluster v7.5.0 topology.yaml --user root -p

# 启动集群
tiup cluster start tidb-cluster

# 查看集群状态
tiup cluster status tidb-cluster
Cluster type: tidb
Cluster name: tidb-cluster
Cluster version: v7.5.0

ID                Role          Host          Ports       Status  Data Dir                     Deploy Dir
--                ----          ----          -----       ------  --------                     ----------
192.168.1.10:2379  pd            192.168.1.10  2379/2380   Up      /tidb/data/pd                /tidb/deploy/pd-2379
192.168.1.11:2379  pd            192.168.1.11  2379/2380   Up      /tidb/data/pd                /tidb/deploy/pd-2379
192.168.1.12:2379  pd            192.168.1.12  2379/2380   Up      /tidb/data/pd                /tidb/deploy/pd-2379
192.168.1.13:4000  tidb          192.168.1.13  4000/10080  Up      -                            /tidb/deploy/tidb-4000
192.168.1.14:4000  tidb          192.168.1.14  4000/10080  Up      -                            /tidb/deploy/tidb-4000
192.168.1.15:20160 tikv          192.168.1.15  20160/20180 Up      /tidb/data/tikv              /tidb/deploy/tikv-20160
192.168.1.16:20160 tikv          192.168.1.16  20160/20180 Up      /tidb/data/tikv              /tidb/deploy/tikv-20160
192.168.1.17:20160 tikv          192.168.1.17  20160/20180 Up      /tidb/data/tikv              /tidb/deploy/tikv-20160

跨可用区部署

风哥提示:

# 编辑拓扑文件,配置跨可用区部署
# topology.yaml示例
global:
  user: "root"
  ssh_port: 22
  deploy_dir: "/tidb/deploy"
  data_dir: "/tidb/data"

server_configs:
  pd:
    replication:
      location-labels: ["zone", "rack", "host"]

pd_servers:
  - host: 192.168.1.10
    ssh_port: 22
    port: 2379
    status_port: 2380
    deploy_dir: "/tidb/deploy/pd-2379"
    data_dir: "/tidb/data/pd"
    labels:
      zone: "zone1"
      rack: "rack1"
      host: "host1"
  - host: 192.168.1.11
    ssh_port: 22
    port: 2379
    status_port: 2380
    deploy_dir: "/tidb/deploy/pd-2379"
    data_dir: "/tidb/data/pd"
    labels:
      zone: "zone2"
      rack: "rack2"
      host: "host2"
  - host: 192.168.1.12
    ssh_port: 22
    port: 2379
    status_port: 2380
    deploy_dir: "/tidb/deploy/pd-2379"
    data_dir: "/tidb/data/pd"
    labels:
      zone: "zone3"
      rack: "rack3"
      host: "host3"

tidb_servers:
  - host: 192.168.1.13
    ssh_port: 22
    port: 4000
    status_port: 10080
    deploy_dir: "/tidb/deploy/tidb-4000"
    labels:
      zone: "zone1"
      rack: "rack1"
      host: "host1"
  - host: 192.168.1.14
    ssh_port: 22
    port: 4000
    status_port: 10080
    deploy_dir: "/tidb/deploy/tidb-4000"
    labels:
      zone: "zone2"
      rack: "rack2"
      host: "host2"

tikv_servers:
  - host: 192.168.1.15
    ssh_port: 22
    port: 20160
    status_port: 20180
    deploy_dir: "/tidb/deploy/tikv-20160"
    data_dir: "/tidb/data/tikv"
    labels:
      zone: "zone1"
      rack: "rack1"
      host: "host1"
  - host: 192.168.1.16
    ssh_port: 22
    port: 20160
    status_port: 20180
    deploy_dir: "/tidb/deploy/tikv-20160"
    data_dir: "/tidb/data/tikv"
    labels:
      zone: "zone2"
      rack: "rack2"
      host: "host2"
  - host: 192.168.1.17
    ssh_port: 22
    port: 20160
    status_port: 20180
    deploy_dir: "/tidb/deploy/tikv-20160"
    data_dir: "/tidb/data/tikv"
    labels:
      zone: "zone3"
      rack: "rack3"
      host: "host3"

# 部署集群
tiup cluster deploy tidb-cluster v7.5.0 topology.yaml --user root -p
学习交流加群风哥QQ113257174
# 启动集群
tiup cluster start tidb-cluster

3.2 灾备方案

使用TiCDC实现跨区域复制

# 部署TiCDC
# 在拓扑文件中添加TiCDC配置

# 启动TiCDC
tiup cluster start tidb-cluster

# 创建跨区域同步任务
tiup ctl:v7.5.0 cdc changefeed create --pd=http://192.168.1.10:2379 --sink-uri="tidb://root:root123@192.168.2.13:4000/fgedudb" --config=cdc-task.yaml

# cdc-task.yaml配置示例
[cdc]
sink-uri = "tidb://root:root123@192.168.2.13:4000/fgedudb"

[mounter]
enable = true
worker-num = 4

[cyclic-replication]
enable = false
id = ""
filter-replica-id = []

[scheduler]
type = "table"
polling-time = "100ms"

# 查看同步任务状态
tiup ctl:v7.5.0 cdc changefeed query --pd=http://192.168.1.10:2379 --changefeed-id=cdc-cross-region
{
  "id": "cdc-cross-region",
  "summary": {
    "state": "running",
    "tso": 436578901234567890,
    "checkpoint": "2024-04-09 10:00:00",
    "error": null
  }
}

定期备份

# 执行全量备份
tiup br backup full --pd "192.168.1.10:2379" --storage "s3://tidb-backup/full/$(date +%Y%m%d)"

# 执行增量备份
tiup br backup incremental --pd "192.168.1.10:2379" --storage "s3://tidb-backup/incremental/$(date +%Y%m%d%H)" --last-backup "s3://tidb-backup/full/$(date +%Y%m%d)"

# 验证备份
tiup br validate --storage "s3://tidb-backup/full/$(date +%Y%m%d)"

# 清理过期备份
aws s3 rm --recursive "s3://tidb-backup/full/$(date -d '30 days ago' +%Y%m%d)"
aws s3 rm --recursive "s3://tidb-backup/incremental/$(date -d '7 days ago' +%Y%m%d)"

# 设置定时任务
# 编辑crontab
crontab -e

# 添加定时任务
# 每日凌晨2:00执行全量备份
0 2 * * * /path/to/full_backup.sh >> /var/log/tidb_backup.log 2>&1

# 每小时执行增量备份
0 * * * * /path/to/incremental_backup.sh >> /var/log/tidb_backup.log 2>&1

3.3 故障转移与恢复

TiDB节点故障转移

# 模拟TiDB节点故障
# 停止TiDB节点
tiup cluster stop tidb-cluster --node 192.168.1.13:4000

# 查看集群状态
tiup cluster status tidb-cluster

# 客户端连接测试
# 客户端会自动连接到健康的TiDB节点
mysql -h 192.168.1.13 -P 4000 -u root -p root123 -e "SELECT 1;"

# 启动故障节点
tiup cluster start tidb-cluster --node 192.168.1.13:4000

# 查看集群状态
tiup cluster status tidb-cluster

TiKV节点故障转移

# 模拟TiKV节点故障
# 停止TiKV节点
tiup cluster stop tidb-cluster --node 192.168.1.15:20160

# 查看集群状态
tiup cluster status tidb-cluster

# 查看PD状态,确认数据重新平衡
curl http://192.168.1.10:2379/pd/api/v1/status

# 启动故障节点
tiup cluster start tidb-cluster --node 192.168.1.15:20160

# 查看集群状态
tiup cluster status tidb-cluster

PD节点故障转移

# 模拟PD节点故障
# 停止PD节点
tiup cluster stop tidb-cluster --node 192.168.1.10:2379

# 查看集群状态
tiup cluster status tidb-cluster

# 查看PD leader
curl http://192.168.1.11:2379/pd/api/v1/leader

# 启动故障节点
tiup cluster start tidb-cluster --node 192.168.1.10:2379

# 查看集群状态
tiup cluster status tidb-cluster

四、实战案例

4.1 跨区域灾备部署

场景:企业需要部署跨区域灾备系统,确保在主区域发生灾难时能够快速切换到灾备区域。

步骤1:部署主集群

# 部署主集群
tiup cluster deploy primary-cluster v7.5.0 primary-topology.yaml --user root -p
tiup cluster start primary-cluster

步骤2:部署灾备集群

# 部署灾备集群
tiup cluster deploy dr-cluster v7.5.0 dr-topology.yaml --user root -p
tiup cluster start dr-cluster

步骤3:配置TiCDC跨区域同步

# 创建跨区域同步任务
tiup ctl:v7.5.0 cdc changefeed create --pd=http://primary-pd:2379 --sink-uri="tidb://root:root123@dr-tidb:4000/fgedudb" --config=cdc-dr.yaml

# 查看同步任务状态
tiup ctl:v7.5.0 cdc changefeed query --pd=http://primary-pd:2379 --changefeed-id=cdc-dr
{
  "id": "cdc-dr",
  "summary": {
    "state": "running",
    "tso": 436578901234567890,
    "checkpoint": "2024-04-09 10:00:00",
    "error": null
  }
}

步骤4:灾备演练

# 模拟主区域故障
# 停止主集群
tiup cluster stop primary-cluster

# 验证灾备集群数据
mysql -h dr-tidb -P 4000 -u root -p root123 -e "SELECT COUNT(*) FROM fgedudb.fgedu_users;"

# 切换应用到灾备集群
# 修改应用配置,指向灾备集群

# 恢复主集群
tiup cluster start primary-cluster

# 重新配置TiCDC同步(反向同步)
tiup ctl:v7.5.0 cdc changefeed create --pd=http://dr-pd:2379 --sink-uri="tidb://root:root123@primary-tidb:4000/fgedudb" --config=cdc-primary.yaml

# 验证数据同步
tiup ctl:v7.5.0 cdc changefeed query --pd=http://dr-pd:2379 --changefeed-id=cdc-primary

4.2 故障恢复演练

场景:企业需要定期进行故障恢复演练,确保在发生故障时能够快速恢复。

步骤1:准备演练环境

# 部署测试集群
tiup cluster deploy test-cluster v7.5.0 test-topology.yaml --user root -p
tiup cluster start test-cluster

# 导入测试数据
mysql -h test-tidb -P 4000 -u root -p root123 < test-data.sql

步骤2:执行全量备份

# 执行全量备份
tiup br backup full --pd "test-pd:2379" --storage "local:///tidb/backup/full/test"

# 验证备份
tiup br validate --storage "local:///tidb/backup/full/test"

# 模拟数据损坏
mysql -h test-tidb -P 4000 -u root -p root123 -e "DROP DATABASE fgedudb;"

# 验证数据损坏
mysql -h test-tidb -P 4000 -u root -p root123 -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

步骤3:执行恢复

# 执行全量恢复
tiup br restore full --pd "test-pd:2379" --storage "local:///tidb/backup/full/test"

# 验证数据恢复
mysql -h test-tidb -P 4000 -u root -p root123 -e "SHOW DATABASES;"
mysql -h test-tidb -P 4000 -u root -p root123 -e "SELECT COUNT(*) FROM fgedudb.fgedu_users;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| fgedudb            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

+----------+
| COUNT(*) |
+----------+
|   100000 |
+----------+

五、经验总结

5.1 高可用与灾备最佳实践

  • 多副本部署:部署足够的副本数,确保数据安全
  • 跨可用区部署:将节点分布在不同的可用区,提高容灾能力
  • 定期备份:制定完善的备份策略,确保数据可恢复
  • 跨区域复制:使用TiCDC实现跨区域数据同步
  • 灾备演练:定期进行灾备演练,确保灾备系统可用
  • 监控与告警:建立完善的监控和告警机制,及时发现和处理问题
  • 文档更新:保持高可用和灾备文档的更新

5.2 故障处理最佳实践

  • 快速定位故障:使用监控系统快速定位故障原因
  • 自动故障转移:配置自动故障转移,减少人工干预
  • 优先级处理:优先处理影响业务的故障
  • 记录故障处理过程:记录故障处理过程,总结经验教训
  • 持续改进:根据故障处理经验,持续改进系统架构

5.3 常见问题与解决方案

问题 原因 解决方案
TiKV节点故障 硬件故障、网络问题 重启节点,等待数据重新平衡
PD节点故障 网络问题、内存不足 重启节点,等待leader选举
TiDB节点故障 CPU使用率高、内存不足 重启节点,优化SQL语句
跨区域同步延迟 网络延迟、数据量过大 优化网络环境,增加TiCDC资源
备份失败 网络中断、存储故障 检查网络连接,确保存储可用

5.4 高可用与灾备检查清单

检查项 配置要求 状态
多副本部署 TiKV至少3副本 □
跨可用区部署 节点分布在不同可用区 □
备份策略 定期执行全量和增量备份 □
跨区域复制 配置TiCDC跨区域同步 □
灾备演练 定期进行灾备演练 □
监控告警 配置完善的监控和告警 □
故障处理流程 制定完善的故障处理流程 □
文档更新 及时更新高可用和灾备文档 □

更多视频教程www.fgedu.net.cn

© 2024 TiDB数据库培训文档

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息