外观
GaussDB 手动故障切换
手动故障切换的定义
手动故障切换是指在主节点故障或需要维护时,由管理员手动将备节点提升为主节点的过程。手动故障切换是GaussDB高可用性架构中的重要组成部分,用于在自动故障切换失效或需要计划性维护时确保系统连续性。
手动故障切换的场景
- 自动故障切换失效:自动故障切换机制故障或未启用
- 计划性维护:主节点需要进行计划性维护,如硬件升级、软件升级等
- 性能优化:将备节点切换为主节点以优化性能
- 故障恢复测试:定期进行故障切换测试,验证系统可用性
- 主节点性能下降:主节点性能下降,需要切换到性能更好的备节点
手动故障切换的原则
- 数据一致性优先:确保切换过程中数据不丢失
- 最小化业务影响:尽量减少切换对业务的影响
- 操作可回滚:确保切换操作可以回滚,避免不可逆的错误
- 操作标准化:制定标准化的切换流程,确保操作一致性
- 充分测试:在测试环境中充分测试切换流程
- 详细记录:记录切换过程中的每一步操作和结果
手动故障切换前的准备
环境检查
检查主备状态:
bashgs_om -t status --detail检查主备同步状态:
sqlSELECT * FROM pg_stat_replication;检查备节点状态:
bashgs_ctl status -D /data/gaussdb/data检查网络连接:
bashping 主节点IP ping 备节点IP检查系统资源:
bashtop df -h free -m
数据一致性检查
检查主备同步延迟:
sqlSELECT client_addr, state, replay_lag FROM pg_stat_replication;检查WAL位置:
- 在主节点上执行:sql
SELECT pg_current_wal_lsn(); - 在备节点上执行:sql
SELECT pg_last_wal_replay_lsn();
- 在主节点上执行:
验证数据一致性:
bash# 在主节点上执行 SELECT md5(random()::text); INSERT INTO test_table (id, value) VALUES (1, md5(random()::text)); SELECT * FROM test_table WHERE id = 1; # 在备节点上执行 SELECT * FROM test_table WHERE id = 1;
工具准备
确保gs_ctl工具可用:
bashgs_ctl --version确保gs_om工具可用:
bashgs_om --version准备切换脚本:
bash# 切换脚本示例 #!/bin/bash # 检查主备状态 gs_om -t status --detail # 执行故障切换 gs_ctl failover -D /data/gaussdb/data # 检查切换后的状态 gs_om -t status --detail
手动故障切换的执行步骤
场景1:主节点故障,备节点正常
操作步骤:
确认主节点故障:
bashping 主节点IP telnet 主节点IP 5432 gs_ctl status -D /data/gaussdb/data # 在主节点上执行检查备节点状态:
bashgs_ctl status -D /data/gaussdb/data # 在备节点上执行在备节点上执行故障切换:
bashgs_ctl failover -D /data/gaussdb/data验证切换结果:
bashgs_om -t status --detail更新应用连接配置:
- 将应用程序的数据库连接指向新的主节点
- 验证应用程序连接正常
场景2:主节点正常,计划性维护
操作步骤:
在主节点上执行切换前检查:
sqlSELECT * FROM pg_stat_replication;将主节点设置为只读模式(可选):
sqlALTER SYSTEM SET default_transaction_read_only = on; SELECT pg_reload_conf();等待备节点同步完成:
sqlSELECT client_addr, state, replay_lag FROM pg_stat_replication WHERE replay_lag IS NULL;在备节点上执行故障切换:
bashgs_ctl failover -D /data/gaussdb/data验证切换结果:
bashgs_om -t status --detail更新应用连接配置:
- 将应用程序的数据库连接指向新的主节点
- 验证应用程序连接正常
在原主节点上执行维护操作:
- 进行硬件升级、软件升级等维护操作
将原主节点重新加入集群作为备节点:
bash# 清理原主节点数据目录 rm -rf /data/gaussdb/data/* # 从新主节点创建基础备份 gs_basebackup -D /data/gaussdb/data -h 新主节点IP -p 5432 -U repluser -F p -X stream # 启动原主节点作为备节点 gs_ctl start -D /data/gaussdb/data -M standby
场景3:级联复制环境下的切换
操作步骤:
检查级联复制状态:
bashgs_om -t status --detail从最上层备节点开始切换:
- 先切换一级备节点,再切换二级备节点
执行故障切换:
bash# 在一级备节点上执行 gs_ctl failover -D /data/gaussdb/data # 在二级备节点上执行 gs_ctl failover -D /data/gaussdb/data验证切换结果:
bashgs_om -t status --detail
手动故障切换的命令详解
gs_ctl failover
gs_ctl failover命令用于执行手动故障切换,将备节点提升为主节点。
语法:
bash
gs_ctl failover -D DATADIR [OPTIONS]常用选项:
-D DATADIR:指定数据库数据目录-f:强制故障切换,忽略数据一致性检查-t TIMEOUT:设置超时时间(秒)-m MODE:设置故障切换模式(fast/smart/immediate)
示例:
bash
# 正常故障切换
gs_ctl failover -D /data/gaussdb/data
# 强制故障切换
gs_ctl failover -D /data/gaussdb/data -f
# 设置超时时间为30秒
gs_ctl failover -D /data/gaussdb/data -t 30gs_ctl promote
gs_ctl promote命令用于将备节点提升为主节点,不进行故障检测。
语法:
bash
gs_ctl promote -D DATADIR [OPTIONS]常用选项:
-D DATADIR:指定数据库数据目录-t TIMEOUT:设置超时时间(秒)
示例:
bash
gs_ctl promote -D /data/gaussdb/datags_om命令
gs_om命令用于管理集群状态和配置。
常用命令:
bash
# 查看集群状态
gs_om -t status --detail
# 查看主备同步状态
gs_om -t status --replication
# 重启集群
gs_om -t restart
# 停止集群
gs_om -t stop手动故障切换后的验证
集群状态验证
检查集群状态:
bashgs_om -t status --detail检查新主节点状态:
bashgs_ctl status -D /data/gaussdb/data检查备节点状态:
bashgs_ctl status -D /data/gaussdb/data
数据一致性验证
检查数据完整性:
sqlSELECT COUNT(*) FROM important_table;检查最近事务:
sqlSELECT * FROM recent_transactions ORDER BY id DESC LIMIT 10;验证业务功能:
- 执行关键业务查询
- 执行数据写入操作
- 验证数据读取操作
应用连接验证
更新应用连接配置:
- 将应用程序的数据库连接指向新的主节点
- 重启应用程序或刷新连接池
验证应用连接:
- 执行应用程序的健康检查
- 验证应用程序的读写功能
- 监控应用程序的响应时间
手动故障切换的最佳实践
操作流程标准化
制定详细的切换流程文档:
- 包括切换前的准备、切换步骤、验证步骤和回滚步骤
- 明确每个步骤的责任人、操作命令和预期结果
定期演练切换流程:
- 每季度至少进行一次故障切换演练
- 在测试环境中模拟各种故障场景
- 记录演练过程中的问题和改进点
建立操作审批机制:
- 重大切换操作需要经过审批
- 记录操作的原因、时间和结果
风险控制
数据一致性优先:
- 在切换前确保主备数据同步
- 避免使用强制切换,除非万不得已
操作可回滚:
- 确保切换操作可以回滚
- 准备回滚方案
最小化业务影响:
- 在业务低峰期进行切换操作
- 提前通知相关业务团队
- 快速完成切换和验证
监控与告警
建立完善的监控体系:
- 监控主备状态和同步延迟
- 监控数据库连接和性能指标
- 监控应用程序的可用性
配置告警规则:
- 配置主备状态告警
- 配置同步延迟告警
- 配置应用连接告警
建立应急响应机制:
- 明确应急响应流程
- 建立应急响应团队
- 准备应急联系人列表
手动故障切换的常见问题
切换失败
原因:
- 主备同步状态异常
- 备节点状态异常
- 网络连接问题
- 权限问题
- 数据目录权限问题
处理方法:
查看日志信息:
bashtail -n 100 /data/gaussdb/log/gaussdb.log检查备节点状态:
bashgs_ctl status -D /data/gaussdb/data尝试强制切换(仅作为最后手段):
bashgs_ctl failover -D /data/gaussdb/data -f重建主备关系:
bash# 在备节点上执行 gs_ctl stop -D /data/gaussdb/data rm -rf /data/gaussdb/data/* gs_basebackup -D /data/gaussdb/data -h 主节点IP -p 5432 -U repluser -F p -X stream gs_ctl start -D /data/gaussdb/data -M standby
切换后数据不一致
原因:
- 主备同步延迟较大
- 切换过程中主节点仍有写入
- 强制切换导致数据丢失
处理方法:
检查数据差异:
- 比较主备节点的数据
- 确定数据不一致的范围
恢复数据一致性:
- 从备份恢复数据
- 使用数据同步工具同步数据
- 手动修复数据差异
加强监控:
- 加强主备同步状态监控
- 配置同步延迟告警
- 定期进行数据一致性检查
切换后应用无法连接
原因:
- 应用连接配置未更新
- 新主节点监听配置问题
- 防火墙配置问题
- 新主节点连接数限制
处理方法:
检查应用连接配置:
- 确认应用连接指向新的主节点
- 确认端口和数据库名称正确
检查新主节点监听配置:
sqlSHOW listen_addresses; SHOW port;检查防火墙配置:
bashiptables -L检查连接数限制:
sqlSHOW max_connections; SELECT count(*) FROM pg_stat_activity;
常见问题(FAQ)
Q1: 手动故障切换和自动故障切换有什么区别?
A1: 手动故障切换和自动故障切换的区别:
- 触发方式:手动故障切换由管理员手动触发,自动故障切换由系统自动触发
- 适用场景:手动故障切换适用于自动故障切换失效或计划性维护,自动故障切换适用于主节点突发故障
- 操作流程:手动故障切换需要管理员执行一系列操作,自动故障切换由系统自动完成
- 恢复时间:手动故障切换恢复时间较长,自动故障切换恢复时间较短
Q2: 什么时候应该使用手动故障切换?
A2: 应该使用手动故障切换的场景:
- 自动故障切换机制故障或未启用
- 需要进行计划性维护,如硬件升级、软件升级等
- 主节点性能下降,需要切换到性能更好的备节点
- 进行故障恢复测试
- 自动故障切换失败后的补救措施
Q3: 手动故障切换前需要做哪些准备?
A3: 手动故障切换前的准备工作:
- 检查主备状态和同步状态
- 检查备节点的健康状态
- 检查网络连接
- 验证数据一致性
- 准备切换工具和脚本
- 通知相关业务团队
- 准备回滚方案
Q4: 如何确保手动故障切换的数据一致性?
A4: 确保手动故障切换数据一致性的方法:
- 在切换前检查主备同步状态
- 确保备节点已经回放了所有的WAL日志
- 避免在主节点有大量未同步数据时进行切换
- 尽量避免使用强制切换
- 切换后验证数据一致性
Q5: 手动故障切换的回滚方案是什么?
A5: 手动故障切换的回滚方案:
- 如果切换尚未完成,可以终止切换操作
- 如果切换已完成但未更新应用连接,可以将原主节点恢复为主节点
- 如果已更新应用连接,需要考虑业务影响,谨慎回滚
- 回滚前备份数据,避免数据丢失
- 回滚后验证数据一致性和应用连接
Q6: 如何提高手动故障切换的效率?
A6: 提高手动故障切换效率的方法:
- 制定详细的切换流程文档
- 定期进行切换演练
- 准备自动化的切换脚本
- 建立清晰的责任分工
- 优化切换步骤,减少不必要的操作
- 加强监控,提前发现问题
Q7: 级联复制环境下如何进行手动故障切换?
A7: 级联复制环境下的手动故障切换:
- 从最上层备节点开始切换,逐步向下切换
- 确保每个节点切换后状态正常
- 切换前检查各级节点的同步状态
- 切换后验证整个集群的状态
Q8: 如何验证手动故障切换的成功?
A8: 验证手动故障切换成功的方法:
- 检查集群状态,确认新主节点状态正常
- 检查备节点状态,确认备节点与新主节点同步正常
- 验证应用程序可以连接到新主节点
- 验证应用程序的读写功能正常
- 检查业务数据的完整性和一致性
手动故障切换案例分析
案例1:自动故障切换失效后的手动切换
问题描述:主节点突发故障,但自动故障切换机制失效,需要手动进行故障切换。
处理过程:
- 确认主节点故障:通过ping和telnet命令确认主节点无法访问
- 检查备节点状态:确认备节点状态正常,同步延迟较小
- 执行手动故障切换:在备节点上执行
gs_ctl failover -D /data/gaussdb/data - 验证切换结果:检查集群状态,确认备节点已提升为主节点
- 更新应用连接:将应用程序的数据库连接指向新的主节点
- 验证应用连接:验证应用程序可以正常连接和读写
- 恢复原主节点:修复原主节点故障,将其作为备节点重新加入集群
优化效果:
- 成功完成故障切换,业务中断时间控制在5分钟以内
- 验证了手动故障切换流程的有效性
- 发现了自动故障切换机制的问题,进行了修复
案例2:计划性维护中的手动切换
问题描述:主节点需要进行硬件升级,需要进行计划性的手动故障切换。
处理过程:
- 提前通知:提前通知相关业务团队,安排在业务低峰期进行切换
- 检查环境:检查主备状态、同步状态和系统资源
- 执行切换:将主节点设置为只读模式,等待备节点同步完成,然后执行手动故障切换
- 验证结果:检查集群状态和应用连接
- 进行维护:对原主节点进行硬件升级
- 恢复集群:将原主节点作为备节点重新加入集群
优化效果:
- 成功完成计划性维护,业务未受到明显影响
- 验证了计划性维护的切换流程
- 提高了运维团队的故障切换能力
案例3:级联复制环境下的手动切换
问题描述:级联复制环境中的主节点故障,需要进行手动故障切换。
处理过程:
- 检查级联复制状态:确认各级节点的状态
- 执行切换:先切换一级备节点,再切换二级备节点
- 验证结果:检查整个集群的状态
- 更新应用连接:将应用连接指向新的主节点
- 恢复原主节点:修复原主节点故障,将其加入集群
优化效果:
- 成功完成级联复制环境下的故障切换
- 验证了级联复制环境下的切换流程
- 提高了运维团队处理复杂环境的能力
