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,节假日休息