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

tidb教程FG142-TiDB高可用架构设计

fgedu.net.cn

目录

一、基础概念

1.1 高可用定义

高可用(High Availability,HA)是指系统在面对各种故障时,能够保持持续可用的能力。高可用的核心目标是减少系统停机时间,提高系统的可靠性和可用性。

1.2 高可用指标

  • 可用性:系统能够正常运行的时间比例,通常用百分比表示,如99.9%(3个9)、99.99%(4个9)等。
  • RPO(Recovery Point Objective):灾难发生后,系统能够恢复到的最近时间点,衡量数据丢失的程度。
  • RTO(Recovery Time Objective):灾难发生后,系统恢复正常运行所需的时间,衡量系统恢复的速度。

1.3 TiDB高可用架构

TiDB采用分布式架构,由三个核心组件组成:

  • TiDB:SQL层,负责处理客户端请求,执行SQL语句。
  • TiKV:存储层,负责存储数据,采用Raft协议保证数据一致性。
  • PD:元数据管理组件,负责管理集群元数据,调度TiKV集群。

1.4 高可用机制

  • 数据复制:TiKV使用Raft协议进行数据复制,确保数据的高可用性。
  • 自动故障转移:当节点发生故障时,系统自动进行故障转移,确保服务持续可用。
  • 负载均衡:通过负载均衡,将请求分发到不同的节点,提高系统的可用性和性能。
  • 跨区域部署:通过跨区域部署,提高系统的容灾能力。

二、规划建议

2.1 架构设计

  • 单区域部署:所有节点部署在同一区域,适合对RTO和RPO要求不高的场景。
  • 跨区域部署:节点部署在多个区域,适合对RTO和RPO要求较高的场景。
  • 混合部署:结合单区域和跨区域部署的优点。

2.2 节点规划

  • TiDB节点:建议部署至少2个节点,实现负载均衡和故障转移。
  • TiKV节点:建议部署至少3个节点,实现数据复制和高可用。
  • PD节点:建议部署至少3个节点,实现高可用的元数据管理。

2.3 存储规划

  • 存储类型:使用高性能存储,如SSD。
  • 存储容量:根据数据量规划存储容量。
  • 存储冗余:使用RAID或其他冗余方案,提高存储的可靠性。

2.4 网络规划

  • 网络带宽:确保节点之间有足够的网络带宽。
  • 网络延迟:尽量减少节点之间的网络延迟。
  • 网络冗余:使用多网络接口和链路聚合,提高网络的可靠性。

三、实施方案

3.1 单区域高可用部署

部署拓扑

# 拓扑文件示例
tiup cluster template > topology.yaml

# 编辑拓扑文件
# 配置3个PD节点,3个TiKV节点,2个TiDB节点

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

# 启动集群
tiup cluster start tidb-ha

# 查看集群状态
tiup cluster display tidb-ha
Cluster type:       tidb
Cluster name:       tidb-ha
Cluster version:    v7.5.0风哥提示:
...
PD nodes:
  192.168.1.10:2379    RUNNING
  192.168.1.11:2379    RUNNING
  192.168.1.12:2379    RUNNING
TiKV nodes:
  192.168.1.13:20160    RUNNING
  192.168.1.14:20160    RUNNING
  192.168.1.15:20160    RUNNING
TiDB nodes:
  192.168.1.16:4000    RUNNING
  192.168.1.17:4000    RUNNING

配置负载均衡

# 安装Nginx
apt-get update
apt-get install -y nginx

# 配置Nginx负载均衡
cat > /etc/nginx/conf.d/tidb.conf << EOF
upstream tidb_servers {
    server 192.168.1.16:4000;
    server 192.168.1.17:4000;
}

server {
    listen 4000;
    server_name localhost;

    location / {
        proxy_pass http://tidb_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
EOF

# 重启Nginx
systemctl restart nginx

# 验证负载均衡
mysql -h 192.168.1.10 -P 4000 -u root -p -e "SELECT @@tidb_server_address;"
+------------------------+
| @@tidb_server_address  |
+------------------------+
| 192.168.1.16:4000      |
+------------------------+

# 再次执行,应该返回不同的TiDB服务器地址
+------------------------+
| @@tidb_server_address  |
+------------------------+
| 192.168.1.17:4000      |
+------------------------+

3.2 跨区域高可用部署

部署拓扑

# 拓扑文件示例
tiup cluster template > topology-multi-region.yaml

# 编辑拓扑文件
# 配置跨区域部署,每个区域部署PD、TiKV和TiDB节点

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

# 启动集群
tiup cluster start tidb-multi-region

# 查看集群状态
tiup cluster display tidb-multi-region
Cluster type:       tidb
Cluster name:       tidb-multi-region
Cluster version:    v7.5.0
...
PD nodes:
  192.168.1.10:2379    RUNNING  # 区域A
  192.168.2.10:2379    RUNNING  # 区域B
  192.168.3.10:2379    RUNNING  # 区域C
TiKV nodes:
  192.168.1.13:20160    RUNNING  # 区域A
  192.168.1.14:20160    RUNNING  # 区域A
  192.168.2.13:20160    RUNNING  # 区域B
  192.168.2.14:20160    RUNNING  # 区域B
  192.168.3.13:20160    RUNNING  # 区域C
  192.168.3.14:20160    RUNNING  # 区域C
TiDB nodes:
  192.168.1.16:4000    RUNNING  # 区域A
  192.168.2.16:4000    RUNNING  # 区域B
  192.168.3.16:4000    RUNNING  # 区域C

学习交流加群风哥QQ113257174

配置TiCDC跨区域同步

# 创建TiCDC配置文件
cat > cdc-multi-region.yaml << EOF
# cdc-multi-region.yaml
[cdc]
# 日志级别
log-level = "info"

[sink]
# 目标TiDB集群信息
tidb-host = "192.168.2.16"
tidb-port = 4000
tidb-user = "root"
tidb-password = "root123"

[filter]
# 过滤规则
rules = [
  "fgedudb.*"
]
EOF

# 创建TiCDC changefeed
tiup ctl:v7.5.0 cdc changefeed create --pd=http://192.168.1.10:2379 --sink-uri="tidb://root:root123@192.168.2.16:4000" --config=cdc-multi-region.yaml

# 查看TiCDC changefeed状态
tiup ctl:v7.5.0 cdc changefeed list --pd=http://192.168.1.10:2379
[{
  "id": "multi-region-sync",
  "summary": {
    "state": "running",
    "tso": 43651234567890,
    "checkpoint": "2024-04-09 10:00:00"
  }
}]

3.3 高可用测试

节点故障测试

# 模拟TiDB节点故障
systemctl stop tidb-server@4000

# 验证服务可用性
mysql -h 192.168.1.10 -P 4000 -u root -p -e "SELECT 1;"

# 查看集群状态
tiup cluster display tidb-ha

# 恢复TiDB节点
systemctl start tidb-server@4000

# 模拟TiKV节点故障
systemctl stop tikv-server@20160

# 验证服务可用性
mysql -h 192.168.1.10 -P 4000 -u root -p -e "SELECT * FROM fgedudb.fgedu_users;"

# 查看集群状态
tiup cluster display tidb-ha

# 恢复TiKV节点
systemctl start tikv-server@20160

# 模拟PD节点故障
systemctl stop pd-server@2379

# 验证服务可用性
mysql -h 192.168.1.10 -P 4000 -u root -p -e "SELECT 1;"

# 查看集群状态
tiup cluster display tidb-ha

# 恢复PD节点
systemctl start pd-server@2379
+---+
| 1 |
+---+
| 1 |
+---+

# 集群状态显示TiDB节点已停止,但服务仍然可用

+------+----------+------------------+-----+---------------------+
| id   | username | email            | age | created_at          |
+------+----------+------------------+-----+---------------------+
|    1 | admin    | admin@example.com |  34 | 2024-04-09 10:00:00 |
|    2 | user1    | user1@example.com |  25 | 2024-04-09 10:00:00 |
|    3 | user3    | user3@example.com |  35 | 2024-04-09 11:00:00 |
+------+----------+------------------+-----+

# 集群状态显示TiKV节点已停止,但服务仍然可用

+---+
| 1 |
+---+
| 1 |
+---+

# 集群状态显示PD节点已停止,但服务仍然可用

区域故障测试

# 模拟区域A故障
# 关闭区域A的所有节点

# 验证服务可用性
mysql -h 192.168.2.10 -P 4000 -u root -p -e "SELECT 1;"

# 查看集群状态
tiup cluster display tidb-multi-region

# 恢复区域A的节点
# 启动区域A的所有节点

# 验证数据同步
mysql -h 192.168.1.10 -P 4000 -u root -p -e "SELECT * FROM fgedudb.fgedu_users;"
mysql -h 192.168.2.10 -P 4000 -u root -p -e "SELECT * FROM fgedudb.fgedu_users;"
+---+
| 1 |
+---+
| 1 |
+---+

# 集群状态显示区域A的节点已停止,但服务仍然可用

+------+----------+------------------+-----+---------------------+
| id   | username | email            | age | created_at          |
+------+----------+------------------+-----+---------------------+
|    1 | admin    | admin@example.com |  34 | 2024-04-09 10:00:00 |
|    2 | user1    | user1@example.com |  25 | 2024-04-09 10:00:00 |
|    3 | user3    | user3@example.com |  35 | 2024-04-09 11:00:00 |
+------+----------+------------------+-----+

# 两个区域的数据一致

3.4 高可用配置

配置TiKV高可用

# 编辑TiKV配置文件
tiup cluster edit-config tidb-ha

# 在TiKV配置中添加以下内容
# tikv:
#   config:
#     raft:
#       election-timeout: 10s
#       heartbeat-interval: 2s
#     server:
#       status-port: 20180

# 重载配置
tiup cluster reload tidb-ha -R tikv

配置PD高可用

# 编辑PD配置文件
tiup cluster edit-config tidb-ha

# 在PD配置中添加以下内容
# pd:
#   config:
#     replication:
#       max-replicas: 3
#       location-labels: ["zone", "rack", "host"]

# 重载配置
tiup cluster reload tidb-ha -R pd

四、实战案例

4.1 生产环境高可用部署

场景:企业需要在生产环境中部署高可用的TiDB集群,确保系统的稳定运行。

步骤1:规划架构

# 架构规划
# - 区域A:3个PD节点,3个TiKV节点,2个TiDB节点
# - 区域B:3个PD节点,3个TiKV节点,2个TiDB节点
# - 区域C:3个PD节点,3个TiKV节点,2个TiDB节点

# 网络规划
# - 区域内网络:10Gbps
# - 区域间网络:1Gbps

# 存储规划
# - TiKV节点:SSD,每节点1TB
# - PD节点:SSD,每节点200GB
# - TiDB节点:SSD,每节点200GB

步骤2:部署集群

# 生成拓扑文件
tiup cluster template > topology-prod.yaml

# 编辑拓扑文件
# 配置跨区域部署

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

# 启动集群
tiup cluster start tidb-prod

# 查看集群状态
tiup cluster display tidb-prod
Cluster type:       tidb
Cluster name:       tidb-prod
Cluster version:    v7.5.0
...
PD nodes:
  192.168.1.10:2379    RUNNING  # 区域A
  192.168.1.11:2379    RUNNING  # 区域A
  192.168.1.12:2379    RUNNING  # 区域A
  192.168.2.10:2379    RUNNING  # 区域B
  192.168.2.11:2379    RUNNING  # 区域B
  192.168.2.12:2379    RUNNING  # 区域B
  192.168.3.10:2379    RUNNING  # 区域C
  192.168.3.11:2379    RUNNING  # 区域C
  192.168.3.12:2379    RUNNING  # 区域C
TiKV nodes:
  192.168.1.13:20160    RUNNING  # 区域A
  192.168.1.14:20160    RUNNING  # 区域A
  192.168.1.15:20160    RUNNING  # 区域A
  192.168.2.13:20160    RUNNING  # 区域B
  192.168.2.14:20160    RUNNING  # 区域B
  192.168.2.15:20160    RUNNING  # 区域B
  192.168.3.13:20160    RUNNING  # 区域C
  192.168.3.14:20160    RUNNING  # 区域C
  192.168.3.15:20160    RUNNING  # 区域C
TiDB nodes:
  192.168.1.16:4000    RUNNING  # 区域A
  192.168.1.17:4000    RUNNING  # 区域A
  192.168.2.16:4000    RUNNING  # 区域B
  192.168.2.17:4000    RUNNING  # 区域B
  192.168.3.16:4000    RUNNING  # 区域C
  192.168.3.17:4000    RUNNING  # 区域C

步骤3:配置负载均衡

# 部署HAProxy
apt-get update
apt-get install -y haproxy

# 配置HAProxy
cat > /etc/haproxy/haproxy.cfg << EOF
global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log     global
    mode    tcp
    option  tcplog
    option  dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000

frontend tidb-frontend
    bind *:4000
    default_backend tidb-backend

backend tidb-backend
    balance roundrobin
    server tidb1 192.168.1.16:4000 check
    server tidb2 192.168.1.17:4000 check
    server tidb3 192.168.2.16:4000 check
    server tidb4 192.168.2.17:4000 check
    server tidb5 192.168.3.16:4000 check
    server tidb6 192.168.3.17:4000 check
EOF

# 重启HAProxy
systemctl restart haproxy

# 验证负载均衡
mysql -h 192.168.1.10 -P 4000 -u root -p -e "SELECT @@tidb_server_address;"
+------------------------+
| @@tidb_server_address  |
+------------------------+
| 192.168.1.16:4000      |
+------------------------+

# 再次执行,应该返回不同的TiDB服务器地址
+------------------------+
| @@tidb_server_address  |
+------------------------+
| 192.168.1.17:4000      |
+------------------------+

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

# 创建TiCDC配置文件
cat > cdc-prod.yaml << EOF
# cdc-prod.yaml
[cdc]
log-level = "info"

[sink]
tidb-host = "192.168.2.16"
tidb-port = 4000
tidb-user = "root"
tidb-password = "root123"

[filter]
rules = [
  "fgedudb.*"
]
EOF

# 创建TiCDC changefeed
tiup ctl:v7.5.0 cdc changefeed create --pd=http://192.168.1.10:2379 --sink-uri="tidb://root:root123@192.168.2.16:4000" --config=cdc-prod.yaml

# 查看TiCDC changefeed状态
tiup ctl:v7.5.0 cdc changefeed list --pd=http://192.168.1.10:2379
[{
  "id": "prod-sync",
  "summary": {
    "state": "running",
    "tso": 43651234567890,
    "checkpoint": "2024-04-09 10:00:00"
  }
}]

步骤5:高可用测试

# 模拟区域A故障
# 关闭区域A的所有节点

# 验证服务可用性
mysql -h 192.168.1.10 -P 4000 -u root -p -e "SELECT 1;"

# 验证数据一致性
mysql -h 192.168.1.10 -P 4000 -u root -p -e "INSERT INTO fgedudb.fgedu_users VALUES (4, 'user4', 'user4@example.com', 40, NOW());"
mysql -h 192.168.2.10 -P 4000 -u root -p -e "SELECT * FROM fgedudb.fgedu_users WHERE id = 4;"

# 恢复区域A的节点
# 启动区域A的所有节点

# 验证数据同步
mysql -h 192.168.1.10 -P 4000 -u root -p -e "SELECT * FROM fgedudb.fgedu_users WHERE id = 4;"
+---+
| 1 |
+---+
| 1 |
+---+

# 服务仍然可用

+------+----------+------------------+-----+---------------------+
| id   | username | email            | age | created_at          |
+------+----------+------------------+-----+---------------------+
|    4 | user4    | user4@example.com |  40 | 2024-04-09 12:00:00 |
+------+----------+------------------+-----+

# 数据已同步到区域B

+------+----------+------------------+-----+---------------------+
| id   | username | email            | age | created_at          |
+------+----------+------------------+-----+---------------------+
|    4 | user4    | user4@example.com |  40 | 2024-04-09 12:00:00 |
+------+----------+------------------+-----+

# 区域A恢复后,数据已同步

五、经验总结

5.1 高可用架构设计最佳实践

  • 多副本部署:部署足够的节点,确保数据和服务的高可用。
  • 跨区域部署:通过跨区域部署,提高系统的容灾能力。
  • 负载均衡:配置负载均衡,提高系统的可用性和性能。
  • 数据同步:使用TiCDC等工具实现跨区域数据同步。
  • 监控和告警:配置完善的监控和告警系统,及时发现和处理问题。
  • 定期测试:定期进行故障演练,确保系统在故障时能够正常运行。
  • 合理配置:根据实际情况合理配置系统参数,提高系统的可靠性。
  • 文档和流程:编写完善的文档和流程,确保系统的维护和管理。

5.2 常见问题与解决方案

问题 原因 解决方案
节点故障 硬件故障、网络问题等 及时更换硬件,修复网络问题,确保节点恢复
区域故障 自然灾害、电力故障等 实现跨区域部署,确保系统在区域故障时仍能运行
数据不一致 网络延迟、同步配置不当 优化网络配置,调整同步参数,确保数据一致性
性能下降 负载过高、资源不足 增加资源,优化配置,使用负载均衡
故障转移失败 配置不当、网络问题 检查配置,修复网络问题,确保故障转移正常

5.3 高可用架构检查清单

检查项 配置要求 状态
节点部署 部署足够的节点,确保高可用
跨区域部署 实现跨区域部署,提高容灾能力
负载均衡 配置负载均衡,提高可用性和性能
数据同步 配置跨区域数据同步
监控和告警 配置完善的监控和告警系统
故障演练 定期进行故障演练
配置优化 合理配置系统参数
文档和流程 编写完善的文档和流程

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

© 2024 TiDB数据库培训文档

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

联系我们

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

微信号:itpux-com

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