Skip to content

TDSQL 故障切换流程

什么是故障切换

故障切换是指在主数据库发生故障时,自动或手动将从数据库切换为主数据库,确保业务连续性的过程。故障切换是高可用性数据库系统的核心功能之一。

故障切换的重要性

  • 业务连续性:确保在主数据库故障时,业务能够继续运行
  • 减少停机时间:快速恢复数据库服务,减少业务损失
  • 提高系统可用性:提高数据库系统的整体可用性
  • 符合合规要求:满足行业和法规对高可用性的要求

TDSQL 故障切换架构

TDSQL 采用主从复制架构,支持自动故障切换,主要包括:

  • 主库:处理所有写操作和部分读操作
  • 从库:复制主库的数据,处理读操作
  • 监控系统:监控数据库状态,检测故障
  • 切换管理器:管理故障切换过程
  • VIP(虚拟IP):提供统一的访问入口,支持快速切换

故障检测

故障类型

TDSQL 需要检测的故障类型包括:

  • 主库宕机:主库服务器故障或数据库服务停止
  • 网络故障:主库网络中断
  • 性能故障:主库性能严重下降
  • 存储故障:主库存储设备故障
  • 软件故障:主库数据库软件故障

检测机制

TDSQL 采用多种检测机制确保故障能够被及时发现:

心跳检测

  • 检测频率:默认每1秒发送一次心跳
  • 检测方式:主库和从库之间互发心跳包
  • 超时时间:默认3秒,超过超时时间认为节点不可用
  • 检测内容:节点状态、复制延迟等

服务状态检测

  • 监控数据库进程:监控TDSQL数据库进程是否正常运行
  • 监控端口:监控数据库监听端口是否可达
  • 监控系统资源:监控CPU、内存、磁盘等资源使用情况
  • 监控数据库状态:监控数据库内部状态,如连接数、锁等待等

复制状态检测

  • 监控复制延迟:监控从库复制主库的延迟情况
  • 监控复制错误:监控复制过程中是否出现错误
  • 监控复制线程状态:监控复制线程是否正常运行

故障判定

TDSQL 采用多数派原则判定主库故障:

  • 当超过半数的从库无法连接到主库时,判定主库故障
  • 结合心跳检测、服务状态检测和复制状态检测的结果
  • 支持自定义故障判定规则

自动故障切换

切换条件

自动故障切换需要满足以下条件:

  • 自动切换功能已启用:配置参数 tdsql_auto_failover = ON
  • 主库故障已确认:通过故障检测机制确认主库故障
  • 至少有一个健康的从库:存在可切换的健康从库
  • 从库复制延迟在允许范围内:从库复制延迟 < max_failover_delay

切换流程

自动故障切换的详细流程如下:

  1. 故障检测:监控系统检测到主库故障
  2. 故障确认:通过多数派原则确认主库故障
  3. 从库选择:选择最合适的从库作为新主库
  4. 切换准备:准备切换所需的资源和配置
  5. 执行切换:将选中的从库提升为主库
  6. 更新配置:更新其他从库的主库信息
  7. VIP 切换:将VIP切换到新主库
  8. 通知应用:通知应用程序主库已切换
  9. 验证切换:验证新主库和从库的状态

从库选择策略

TDSQL 支持多种从库选择策略:

优先级策略

  • 为每个从库设置优先级
  • 选择优先级最高的健康从库
  • 配置参数:tdsql_failover_priority

复制延迟策略

  • 选择复制延迟最小的健康从库
  • 配置参数:tdsql_failover_delay_based

权重策略

  • 为每个从库设置权重
  • 选择权重最高的健康从库
  • 配置参数:tdsql_failover_weight

自定义策略

  • 支持根据自定义规则选择从库
  • 可以结合多种因素进行选择

手动故障切换

适用场景

手动故障切换适用于以下场景:

  • 自动切换功能未启用:自动切换功能被禁用
  • 计划内维护:如主库升级、迁移等
  • 自动切换失败:自动切换过程中出现问题
  • 需要选择特定从库:需要指定特定的从库作为新主库

切换流程

手动故障切换的详细流程如下:

  1. 确认主库状态:确认主库故障或需要切换的原因
  2. 选择目标从库:选择合适的从库作为新主库
  3. 停止主库:如果主库仍在运行,停止主库服务
  4. 提升从库:将选中的从库提升为主库
  5. 更新其他从库:将其他从库指向新主库
  6. 更新VIP:将VIP切换到新主库
  7. 验证切换:验证新主库和从库的状态
  8. 恢复业务:通知应用程序恢复业务

切换命令

TDSQL 提供了手动故障切换的命令:

sql
-- 查看当前主从状态
SHOW TDSQL REPLICA STATUS;

-- 手动切换主库,将指定从库提升为主库
ALTER TDSQL INSTANCE 'slave_host:3306' PROMOTE TO PRIMARY;

-- 更新其他从库的主库信息
ALTER TDSQL INSTANCE 'other_slave_host:3306' CHANGE MASTER TO MASTER_HOST='new_master_host', MASTER_PORT=3306;

-- 启动复制
START SLAVE;

切换验证

验证内容

故障切换后需要验证以下内容:

新主库状态

  • 服务状态:新主库服务是否正常运行
  • 连接状态:是否能够正常连接新主库
  • 写操作:新主库是否能够处理写操作
  • 系统资源:新主库的CPU、内存、磁盘等资源使用情况

从库状态

  • 复制状态:其他从库是否正常复制新主库的数据
  • 复制延迟:从库复制延迟是否在允许范围内
  • 读操作:从库是否能够处理读操作

业务验证

  • 应用连接:应用程序是否能够正常连接数据库
  • 业务功能:核心业务功能是否正常
  • 性能指标:业务性能是否符合要求

验证方法

命令行验证

  • SHOW STATUS:查看数据库状态
  • SHOW SLAVE STATUS:查看复制状态
  • SELECT:执行简单查询验证连接
  • INSERT/UPDATE/DELETE:执行写操作验证主库功能

监控工具验证

  • TDSQL Manager:图形化界面查看数据库状态
  • Performance Schema:查看详细的性能统计
  • 第三方监控工具:如 Prometheus + Grafana 监控系统指标

业务验证

  • 运行业务测试用例:运行预先准备的业务测试用例
  • 监控业务指标:监控业务系统的关键指标
  • 用户反馈:收集用户反馈,确认业务正常

故障切换后的处理

原主库恢复

当原主库故障恢复后,需要进行以下处理:

  1. 检查原主库状态:确认原主库故障已经修复
  2. 将原主库设置为从库:将原主库配置为新主库的从库
  3. 启动复制:启动原主库的复制进程
  4. 验证复制状态:确认原主库能够正常复制新主库的数据
  5. 调整配置:根据需要调整原主库的配置

最佳实践

1. 配置合适的切换参数

  • 启用自动切换:在生产环境中建议启用自动故障切换
  • 调整心跳频率:根据网络环境调整心跳频率和超时时间
  • 设置合理的复制延迟阈值:根据业务需求设置允许的最大复制延迟
  • 配置从库优先级:为从库设置合适的优先级

2. 定期测试故障切换

  • 计划内测试:定期进行故障切换测试,验证切换流程
  • 模拟故障场景:模拟各种故障场景,测试切换效果
  • 测试业务恢复:测试故障切换后业务是否能够正常恢复
  • 记录测试结果:记录测试结果,分析问题并改进

3. 监控关键指标

  • 监控主从状态:实时监控主从复制状态
  • 监控复制延迟:监控从库复制延迟,及时发现问题
  • 监控系统资源:监控数据库服务器的CPU、内存、磁盘等资源
  • 设置告警:对关键指标设置告警,及时发现故障

4. 优化复制性能

  • 使用半同步复制:提高复制的可靠性
  • 调整复制参数:优化复制相关参数,减少复制延迟
  • 使用并行复制:提高复制速度,减少复制延迟
  • 定期清理日志:定期清理二进制日志,避免日志过多影响复制性能

5. 准备应急预案

  • 制定详细的应急预案:包括故障处理流程、角色分工、联系方式等
  • 准备切换工具:准备手动切换所需的工具和脚本
  • 培训人员:对运维人员进行故障切换培训,确保能够熟练操作
  • 定期演练:定期演练应急预案,提高故障处理能力

6. 使用 VIP 或负载均衡

  • 配置 VIP:使用VIP作为数据库访问入口,支持快速切换
  • 使用负载均衡:对于大规模系统,使用负载均衡分发请求
  • 确保VIP切换速度:优化VIP切换配置,确保切换速度快

常见问题(FAQ)

Q1: 自动故障切换需要多长时间?

A1: 自动故障切换的时间主要取决于以下因素:

  • 故障检测时间:默认3秒
  • 从库选择时间:毫秒级
  • VIP切换时间:毫秒级
  • 从库提升为主库的时间:秒级

总的切换时间通常在5-10秒左右。

Q2: 如何选择合适的从库作为新主库?

A2: 可以根据以下因素选择从库:

  • 复制延迟:选择复制延迟最小的从库
  • 服务器配置:选择配置较好的从库
  • 地理位置:选择与主库地理位置相近的从库
  • 优先级设置:根据预先设置的优先级选择

Q3: 故障切换会导致数据丢失吗?

A3: 使用半同步复制可以减少数据丢失的风险:

  • 异步复制:可能会丢失数据,取决于复制延迟
  • 半同步复制:确保至少有一个从库收到数据后才返回客户端
  • 增强半同步复制:确保多个从库收到数据后才返回客户端

Q4: 如何手动干预自动故障切换?

A4: 可以通过以下方式手动干预:

  • 禁用自动切换:在需要手动干预时禁用自动切换
  • 手动选择从库:使用命令手动选择特定的从库作为新主库
  • 取消正在进行的切换:如果自动切换出现问题,可以取消切换

Q5: 故障切换后需要做哪些检查?

A5: 故障切换后需要检查以下内容:

  • 新主库的服务状态
  • 其他从库的复制状态
  • 应用程序的连接状态
  • 核心业务功能是否正常
  • 系统性能是否符合要求

Q6: 如何优化故障切换的性能?

A6: 可以通过以下方式优化故障切换性能:

  • 减少复制延迟
  • 使用快速的网络
  • 优化VIP切换配置
  • 使用高性能的服务器
  • 配置合适的切换参数