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