Skip to content

GaussDB 手动故障切换

手动故障切换的定义

手动故障切换是指在主节点故障或需要维护时,由管理员手动将备节点提升为主节点的过程。手动故障切换是GaussDB高可用性架构中的重要组成部分,用于在自动故障切换失效或需要计划性维护时确保系统连续性。

手动故障切换的场景

  1. 自动故障切换失效:自动故障切换机制故障或未启用
  2. 计划性维护:主节点需要进行计划性维护,如硬件升级、软件升级等
  3. 性能优化:将备节点切换为主节点以优化性能
  4. 故障恢复测试:定期进行故障切换测试,验证系统可用性
  5. 主节点性能下降:主节点性能下降,需要切换到性能更好的备节点

手动故障切换的原则

  1. 数据一致性优先:确保切换过程中数据不丢失
  2. 最小化业务影响:尽量减少切换对业务的影响
  3. 操作可回滚:确保切换操作可以回滚,避免不可逆的错误
  4. 操作标准化:制定标准化的切换流程,确保操作一致性
  5. 充分测试:在测试环境中充分测试切换流程
  6. 详细记录:记录切换过程中的每一步操作和结果

手动故障切换前的准备

环境检查

  1. 检查主备状态

    bash
    gs_om -t status --detail
  2. 检查主备同步状态

    sql
    SELECT * FROM pg_stat_replication;
  3. 检查备节点状态

    bash
    gs_ctl status -D /data/gaussdb/data
  4. 检查网络连接

    bash
    ping 主节点IP
    ping 备节点IP
  5. 检查系统资源

    bash
    top
    df -h
    free -m

数据一致性检查

  1. 检查主备同步延迟

    sql
    SELECT 
      client_addr,
      state,
      replay_lag
    FROM pg_stat_replication;
  2. 检查WAL位置

    • 在主节点上执行:
      sql
      SELECT pg_current_wal_lsn();
    • 在备节点上执行:
      sql
      SELECT pg_last_wal_replay_lsn();
  3. 验证数据一致性

    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;

工具准备

  1. 确保gs_ctl工具可用

    bash
    gs_ctl --version
  2. 确保gs_om工具可用

    bash
    gs_om --version
  3. 准备切换脚本

    bash
    # 切换脚本示例
    #!/bin/bash
    
    # 检查主备状态
    gs_om -t status --detail
    
    # 执行故障切换
    gs_ctl failover -D /data/gaussdb/data
    
    # 检查切换后的状态
    gs_om -t status --detail

手动故障切换的执行步骤

场景1:主节点故障,备节点正常

操作步骤

  1. 确认主节点故障

    bash
    ping 主节点IP
    telnet 主节点IP 5432
    gs_ctl status -D /data/gaussdb/data  # 在主节点上执行
  2. 检查备节点状态

    bash
    gs_ctl status -D /data/gaussdb/data  # 在备节点上执行
  3. 在备节点上执行故障切换

    bash
    gs_ctl failover -D /data/gaussdb/data
  4. 验证切换结果

    bash
    gs_om -t status --detail
  5. 更新应用连接配置

    • 将应用程序的数据库连接指向新的主节点
    • 验证应用程序连接正常

场景2:主节点正常,计划性维护

操作步骤

  1. 在主节点上执行切换前检查

    sql
    SELECT * FROM pg_stat_replication;
  2. 将主节点设置为只读模式(可选):

    sql
    ALTER SYSTEM SET default_transaction_read_only = on;
    SELECT pg_reload_conf();
  3. 等待备节点同步完成

    sql
    SELECT 
      client_addr,
      state,
      replay_lag
    FROM pg_stat_replication WHERE replay_lag IS NULL;
  4. 在备节点上执行故障切换

    bash
    gs_ctl failover -D /data/gaussdb/data
  5. 验证切换结果

    bash
    gs_om -t status --detail
  6. 更新应用连接配置

    • 将应用程序的数据库连接指向新的主节点
    • 验证应用程序连接正常
  7. 在原主节点上执行维护操作

    • 进行硬件升级、软件升级等维护操作
  8. 将原主节点重新加入集群作为备节点

    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:级联复制环境下的切换

操作步骤

  1. 检查级联复制状态

    bash
    gs_om -t status --detail
  2. 从最上层备节点开始切换

    • 先切换一级备节点,再切换二级备节点
  3. 执行故障切换

    bash
    # 在一级备节点上执行
    gs_ctl failover -D /data/gaussdb/data
    
    # 在二级备节点上执行
    gs_ctl failover -D /data/gaussdb/data
  4. 验证切换结果

    bash
    gs_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 30

gs_ctl promote

gs_ctl promote命令用于将备节点提升为主节点,不进行故障检测。

语法

bash
gs_ctl promote -D DATADIR [OPTIONS]

常用选项

  • -D DATADIR:指定数据库数据目录
  • -t TIMEOUT:设置超时时间(秒)

示例

bash
gs_ctl promote -D /data/gaussdb/data

gs_om命令

gs_om命令用于管理集群状态和配置。

常用命令

bash
# 查看集群状态
gs_om -t status --detail

# 查看主备同步状态
gs_om -t status --replication

# 重启集群
gs_om -t restart

# 停止集群
gs_om -t stop

手动故障切换后的验证

集群状态验证

  1. 检查集群状态

    bash
    gs_om -t status --detail
  2. 检查新主节点状态

    bash
    gs_ctl status -D /data/gaussdb/data
  3. 检查备节点状态

    bash
    gs_ctl status -D /data/gaussdb/data

数据一致性验证

  1. 检查数据完整性

    sql
    SELECT COUNT(*) FROM important_table;
  2. 检查最近事务

    sql
    SELECT * FROM recent_transactions ORDER BY id DESC LIMIT 10;
  3. 验证业务功能

    • 执行关键业务查询
    • 执行数据写入操作
    • 验证数据读取操作

应用连接验证

  1. 更新应用连接配置

    • 将应用程序的数据库连接指向新的主节点
    • 重启应用程序或刷新连接池
  2. 验证应用连接

    • 执行应用程序的健康检查
    • 验证应用程序的读写功能
    • 监控应用程序的响应时间

手动故障切换的最佳实践

操作流程标准化

  1. 制定详细的切换流程文档

    • 包括切换前的准备、切换步骤、验证步骤和回滚步骤
    • 明确每个步骤的责任人、操作命令和预期结果
  2. 定期演练切换流程

    • 每季度至少进行一次故障切换演练
    • 在测试环境中模拟各种故障场景
    • 记录演练过程中的问题和改进点
  3. 建立操作审批机制

    • 重大切换操作需要经过审批
    • 记录操作的原因、时间和结果

风险控制

  1. 数据一致性优先

    • 在切换前确保主备数据同步
    • 避免使用强制切换,除非万不得已
  2. 操作可回滚

    • 确保切换操作可以回滚
    • 准备回滚方案
  3. 最小化业务影响

    • 在业务低峰期进行切换操作
    • 提前通知相关业务团队
    • 快速完成切换和验证

监控与告警

  1. 建立完善的监控体系

    • 监控主备状态和同步延迟
    • 监控数据库连接和性能指标
    • 监控应用程序的可用性
  2. 配置告警规则

    • 配置主备状态告警
    • 配置同步延迟告警
    • 配置应用连接告警
  3. 建立应急响应机制

    • 明确应急响应流程
    • 建立应急响应团队
    • 准备应急联系人列表

手动故障切换的常见问题

切换失败

原因

  • 主备同步状态异常
  • 备节点状态异常
  • 网络连接问题
  • 权限问题
  • 数据目录权限问题

处理方法

  1. 查看日志信息

    bash
    tail -n 100 /data/gaussdb/log/gaussdb.log
  2. 检查备节点状态

    bash
    gs_ctl status -D /data/gaussdb/data
  3. 尝试强制切换(仅作为最后手段):

    bash
    gs_ctl failover -D /data/gaussdb/data -f
  4. 重建主备关系

    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

切换后数据不一致

原因

  • 主备同步延迟较大
  • 切换过程中主节点仍有写入
  • 强制切换导致数据丢失

处理方法

  1. 检查数据差异

    • 比较主备节点的数据
    • 确定数据不一致的范围
  2. 恢复数据一致性

    • 从备份恢复数据
    • 使用数据同步工具同步数据
    • 手动修复数据差异
  3. 加强监控

    • 加强主备同步状态监控
    • 配置同步延迟告警
    • 定期进行数据一致性检查

切换后应用无法连接

原因

  • 应用连接配置未更新
  • 新主节点监听配置问题
  • 防火墙配置问题
  • 新主节点连接数限制

处理方法

  1. 检查应用连接配置

    • 确认应用连接指向新的主节点
    • 确认端口和数据库名称正确
  2. 检查新主节点监听配置

    sql
    SHOW listen_addresses;
    SHOW port;
  3. 检查防火墙配置

    bash
    iptables -L
  4. 检查连接数限制

    sql
    SHOW 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:自动故障切换失效后的手动切换

问题描述:主节点突发故障,但自动故障切换机制失效,需要手动进行故障切换。

处理过程

  1. 确认主节点故障:通过ping和telnet命令确认主节点无法访问
  2. 检查备节点状态:确认备节点状态正常,同步延迟较小
  3. 执行手动故障切换:在备节点上执行gs_ctl failover -D /data/gaussdb/data
  4. 验证切换结果:检查集群状态,确认备节点已提升为主节点
  5. 更新应用连接:将应用程序的数据库连接指向新的主节点
  6. 验证应用连接:验证应用程序可以正常连接和读写
  7. 恢复原主节点:修复原主节点故障,将其作为备节点重新加入集群

优化效果

  • 成功完成故障切换,业务中断时间控制在5分钟以内
  • 验证了手动故障切换流程的有效性
  • 发现了自动故障切换机制的问题,进行了修复

案例2:计划性维护中的手动切换

问题描述:主节点需要进行硬件升级,需要进行计划性的手动故障切换。

处理过程

  1. 提前通知:提前通知相关业务团队,安排在业务低峰期进行切换
  2. 检查环境:检查主备状态、同步状态和系统资源
  3. 执行切换:将主节点设置为只读模式,等待备节点同步完成,然后执行手动故障切换
  4. 验证结果:检查集群状态和应用连接
  5. 进行维护:对原主节点进行硬件升级
  6. 恢复集群:将原主节点作为备节点重新加入集群

优化效果

  • 成功完成计划性维护,业务未受到明显影响
  • 验证了计划性维护的切换流程
  • 提高了运维团队的故障切换能力

案例3:级联复制环境下的手动切换

问题描述:级联复制环境中的主节点故障,需要进行手动故障切换。

处理过程

  1. 检查级联复制状态:确认各级节点的状态
  2. 执行切换:先切换一级备节点,再切换二级备节点
  3. 验证结果:检查整个集群的状态
  4. 更新应用连接:将应用连接指向新的主节点
  5. 恢复原主节点:修复原主节点故障,将其加入集群

优化效果

  • 成功完成级联复制环境下的故障切换
  • 验证了级联复制环境下的切换流程
  • 提高了运维团队处理复杂环境的能力