外观
TDSQL 故障切换流程
什么是故障切换
故障切换是指在主数据库发生故障时,自动或手动将从数据库切换为主数据库,确保业务连续性的过程。故障切换是高可用性数据库系统的核心功能之一。
故障切换的重要性
- 业务连续性:确保在主数据库故障时,业务能够继续运行
- 减少停机时间:快速恢复数据库服务,减少业务损失
- 提高系统可用性:提高数据库系统的整体可用性
- 符合合规要求:满足行业和法规对高可用性的要求
TDSQL 故障切换架构
TDSQL 采用主从复制架构,支持自动故障切换,主要包括:
- 主库:处理所有写操作和部分读操作
- 从库:复制主库的数据,处理读操作
- 监控系统:监控数据库状态,检测故障
- 切换管理器:管理故障切换过程
- VIP(虚拟IP):提供统一的访问入口,支持快速切换
故障检测
故障类型
TDSQL 需要检测的故障类型包括:
- 主库宕机:主库服务器故障或数据库服务停止
- 网络故障:主库网络中断
- 性能故障:主库性能严重下降
- 存储故障:主库存储设备故障
- 软件故障:主库数据库软件故障
检测机制
TDSQL 采用多种检测机制确保故障能够被及时发现:
心跳检测
- 检测频率:默认每1秒发送一次心跳
- 检测方式:主库和从库之间互发心跳包
- 超时时间:默认3秒,超过超时时间认为节点不可用
- 检测内容:节点状态、复制延迟等
服务状态检测
- 监控数据库进程:监控TDSQL数据库进程是否正常运行
- 监控端口:监控数据库监听端口是否可达
- 监控系统资源:监控CPU、内存、磁盘等资源使用情况
- 监控数据库状态:监控数据库内部状态,如连接数、锁等待等
复制状态检测
- 监控复制延迟:监控从库复制主库的延迟情况
- 监控复制错误:监控复制过程中是否出现错误
- 监控复制线程状态:监控复制线程是否正常运行
故障判定
TDSQL 采用多数派原则判定主库故障:
- 当超过半数的从库无法连接到主库时,判定主库故障
- 结合心跳检测、服务状态检测和复制状态检测的结果
- 支持自定义故障判定规则
自动故障切换
切换条件
自动故障切换需要满足以下条件:
- 自动切换功能已启用:配置参数
tdsql_auto_failover = ON - 主库故障已确认:通过故障检测机制确认主库故障
- 至少有一个健康的从库:存在可切换的健康从库
- 从库复制延迟在允许范围内:从库复制延迟 <
max_failover_delay
切换流程
自动故障切换的详细流程如下:
- 故障检测:监控系统检测到主库故障
- 故障确认:通过多数派原则确认主库故障
- 从库选择:选择最合适的从库作为新主库
- 切换准备:准备切换所需的资源和配置
- 执行切换:将选中的从库提升为主库
- 更新配置:更新其他从库的主库信息
- VIP 切换:将VIP切换到新主库
- 通知应用:通知应用程序主库已切换
- 验证切换:验证新主库和从库的状态
从库选择策略
TDSQL 支持多种从库选择策略:
优先级策略
- 为每个从库设置优先级
- 选择优先级最高的健康从库
- 配置参数:
tdsql_failover_priority
复制延迟策略
- 选择复制延迟最小的健康从库
- 配置参数:
tdsql_failover_delay_based
权重策略
- 为每个从库设置权重
- 选择权重最高的健康从库
- 配置参数:
tdsql_failover_weight
自定义策略
- 支持根据自定义规则选择从库
- 可以结合多种因素进行选择
手动故障切换
适用场景
手动故障切换适用于以下场景:
- 自动切换功能未启用:自动切换功能被禁用
- 计划内维护:如主库升级、迁移等
- 自动切换失败:自动切换过程中出现问题
- 需要选择特定从库:需要指定特定的从库作为新主库
切换流程
手动故障切换的详细流程如下:
- 确认主库状态:确认主库故障或需要切换的原因
- 选择目标从库:选择合适的从库作为新主库
- 停止主库:如果主库仍在运行,停止主库服务
- 提升从库:将选中的从库提升为主库
- 更新其他从库:将其他从库指向新主库
- 更新VIP:将VIP切换到新主库
- 验证切换:验证新主库和从库的状态
- 恢复业务:通知应用程序恢复业务
切换命令
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. 监控关键指标
- 监控主从状态:实时监控主从复制状态
- 监控复制延迟:监控从库复制延迟,及时发现问题
- 监控系统资源:监控数据库服务器的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切换配置
- 使用高性能的服务器
- 配置合适的切换参数
