Skip to content

GaussDB 集群故障处理

节点故障处理

主节点故障

故障表现

  • 主节点进程崩溃
  • 无法连接到主节点
  • 集群自动触发故障转移

处理流程

  1. 确认故障

    bash
    # 检查主节点状态
    gs_ctl status -D /opt/huawei/install/data/dn
    
    # 检查集群状态
    gs_om -t status
  2. 查看故障日志

    bash
    # 查看主节点日志
    tail -n 100 /opt/huawei/install/data/dn/pg_log/postgresql-$(date +%Y-%m-%d).log
  3. 等待自动故障转移

    • 检查备节点是否成功提升为主节点
    • 验证新主节点状态
  4. 恢复原主节点

    bash
    # 修复原主节点故障
    # 启动原主节点(将作为备节点加入集群)
    gs_ctl start -D /opt/huawei/install/data/dn
    
    # 检查复制状态
    gsql -d postgres -c "SELECT * FROM pg_stat_replication;"
  5. 验证集群状态

    bash
    gs_om -t status

备节点故障

故障表现

  • 备节点进程崩溃
  • 主备复制中断
  • 备节点状态异常

处理流程

  1. 确认故障

    sql
    -- 查看复制状态
    SELECT * FROM pg_stat_replication;
  2. 查看故障日志

    bash
    tail -n 100 /opt/huawei/install/data/dn/pg_log/postgresql-$(date +%Y-%m-%d).log
  3. 恢复备节点

    bash
    # 修复备节点故障
    # 启动备节点
    gs_ctl start -D /opt/huawei/install/data/dn
    
    # 检查复制状态
    gsql -d postgres -c "SELECT * FROM pg_stat_replication;"
  4. 验证复制状态

    sql
    SELECT 
      application_name, 
      state, 
      sync_state, 
      pg_wal_lsn_diff(sent_lsn, replay_lsn) AS lsn_diff
    FROM pg_stat_replication;

网络故障处理

网络分区

故障表现

  • 集群被分割为多个子网
  • 节点间无法通信
  • 可能出现脑裂现象

处理流程

  1. 确认网络分区

    bash
    # 检查节点间通信
    ping node2
    
    # 检查集群状态
    gs_om -t status
  2. 隔离少数派节点

    • 确定多数派和少数派节点
    • 隔离少数派节点,避免脑裂
  3. 修复网络问题

    • 联系网络管理员修复网络
    • 验证网络恢复
  4. 恢复集群

    bash
    # 重启少数派节点
    gs_ctl restart -D /opt/huawei/install/data/dn
    
    # 检查集群状态
    gs_om -t status

网络延迟

故障表现

  • 主备复制延迟增加
  • 事务提交延迟增加
  • 集群性能下降

处理流程

  1. 确认网络延迟

    bash
    # 测试节点间网络延迟
    ping -c 10 node2
  2. 调整复制模式

    sql
    -- 临时调整为异步复制
    ALTER SYSTEM SET synchronous_commit = off;
    
    -- 或调整同步备节点数量
    ALTER SYSTEM SET synchronous_standby_names = 'ANY 1 (standby1, standby2)';
  3. 监控复制延迟

    sql
    SELECT 
      application_name, 
      pg_wal_lsn_diff(sent_lsn, replay_lsn) AS lsn_diff,
      now() - replay_timestamp AS replay_delay
    FROM pg_stat_replication;
  4. 修复网络问题

    • 优化网络配置
    • 增加网络带宽
    • 调整网络拓扑

存储故障处理

磁盘损坏

故障表现

  • 节点无法启动
  • 磁盘 I/O 错误
  • 存储相关进程崩溃

处理流程

  1. 确认磁盘故障

    bash
    # 检查磁盘状态
    fdisk -l
    
    # 检查文件系统
    df -h
  2. 隔离故障节点

    bash
    # 停止故障节点
    gs_ctl stop -D /opt/huawei/install/data/dn -m fast
  3. 更换故障磁盘

    • 联系硬件维护人员更换磁盘
    • 重新格式化和挂载磁盘
  4. 恢复数据

    bash
    # 使用备份恢复数据
    gs_restore -D /opt/huawei/install/data/dn -F t /backup/backup_file.tar
    
    # 启动节点
    gs_ctl start -D /opt/huawei/install/data/dn
  5. 验证节点状态

    bash
    gs_ctl status -D /opt/huawei/install/data/dn

存储空间不足

故障表现

  • 数据库写入失败
  • 磁盘空间告警
  • 日志写入失败

处理流程

  1. 确认存储空间不足

    bash
    # 检查磁盘空间
    df -h
    
    # 查看大文件
    du -sh /opt/huawei/install/data/dn/* | sort -rh | head -10
  2. 临时清理空间

    bash
    # 清理旧日志文件
    rm /opt/huawei/install/data/dn/pg_log/postgresql-2023*.log
    
    # 清理临时文件
    rm -rf /opt/huawei/install/data/dn/base/pgsql_tmp/*
  3. 永久解决方案

    • 增加磁盘容量
    • 调整 WAL 保留策略
    # 调整 WAL 保留时间
    wal_keep_segments = 1024
    • 优化备份策略
    • 归档历史数据
  4. 验证空间释放

    bash
    df -h

软件故障处理

数据库进程崩溃

故障表现

  • 无法连接到数据库
  • 数据库进程不存在
  • 集群状态异常

处理流程

  1. 确认进程崩溃

    bash
    # 检查数据库进程
    ps -ef | grep postgres
    
    # 检查进程状态
    gs_ctl status -D /opt/huawei/install/data/dn
  2. 查看崩溃日志

    bash
    # 查看核心转储文件
    ls -la /opt/huawei/install/data/dn/core.*
    
    # 查看错误日志
    tail -n 200 /opt/huawei/install/data/dn/pg_log/postgresql-$(date +%Y-%m-%d).log
  3. 重启数据库

    bash
    # 重启数据库
    gs_ctl restart -D /opt/huawei/install/data/dn -m fast
    
    # 检查状态
    gs_ctl status -D /opt/huawei/install/data/dn
  4. 分析崩溃原因

    • 检查最近的操作记录
    • 分析 SQL 语句
    • 检查参数配置
  5. 修复根本原因

    • 调整参数配置
    • 优化 SQL 查询
    • 应用补丁或升级版本

配置错误

故障表现

  • 数据库无法启动
  • 服务异常
  • 日志中出现配置错误信息

处理流程

  1. 查看错误日志

    bash
    tail -n 100 /opt/huawei/install/data/dn/pg_log/postgresql-$(date +%Y-%m-%d).log
  2. 恢复正确配置

    bash
    # 使用备份的配置文件
    cp /backup/postgresql.conf /opt/huawei/install/data/dn/
    cp /backup/pg_hba.conf /opt/huawei/install/data/dn/
  3. 重启数据库

    bash
    gs_ctl restart -D /opt/huawei/install/data/dn -m fast
  4. 验证配置

    sql
    -- 查看参数配置
    SHOW parameter_name;

数据故障处理

数据损坏

故障表现

  • 数据库启动失败
  • 查询特定表时出错
  • 日志中出现数据损坏信息

处理流程

  1. 确认数据损坏

    bash
    # 执行数据一致性检查
    gs_checkdata -D /opt/huawei/install/data/dn
  2. 隔离故障节点

    bash
    gs_ctl stop -D /opt/huawei/install/data/dn -m fast
  3. 恢复数据

    bash
    # 使用最新备份恢复
    gs_restore -D /opt/huawei/install/data/dn -F t /backup/latest_backup.tar
    
    # 应用 WAL 日志恢复到故障前状态
    gs_ctl promote -D /opt/huawei/install/data/dn
  4. 验证数据完整性

    sql
    -- 执行数据库完整性检查
    VACUUM ANALYZE VERBOSE;
    
    -- 检查表数据
    SELECT count(*) FROM critical_table;

数据一致性问题

故障表现

  • 主备数据不一致
  • 复制延迟持续增加
  • 数据校验失败

处理流程

  1. 确认数据不一致

    sql
    -- 查看复制状态
    SELECT 
      application_name, 
      pg_wal_lsn_diff(sent_lsn, replay_lsn) AS lsn_diff
    FROM pg_stat_replication;
  2. 重新同步数据

    bash
    # 停止备节点
    gs_ctl stop -D /opt/huawei/install/data/dn_slave
    
    # 清空备节点数据目录
    rm -rf /opt/huawei/install/data/dn_slave/*
    
    # 使用主节点基础备份重建备节点
    gs_basebackup -D /opt/huawei/install/data/dn_slave -F p -X stream -h master_host -p 5432 -U repl_user
    
    # 启动备节点
    gs_ctl start -D /opt/huawei/install/data/dn_slave
  3. 验证数据一致性

    sql
    -- 检查复制状态
    SELECT * FROM pg_stat_replication;
    
    -- 对比主备数据
    -- 在主节点执行
    SELECT md5(CAST((SELECT * FROM critical_table ORDER BY id) AS text));
    
    -- 在备节点执行相同查询,对比结果

人为故障处理

误删除数据

故障表现

  • 数据丢失
  • 用户报告数据不存在
  • 误操作日志记录

处理流程

  1. 确认误操作

    bash
    # 查看操作日志
    tail -n 100 /opt/huawei/install/data/dn/pg_log/postgresql-$(date +%Y-%m-%d).log
  2. 立即停止写入

    bash
    # 禁止新的写入操作(如果可能)
    gs_ctl stop -D /opt/huawei/install/data/dn -m smart
  3. 使用备份恢复

    bash
    # 使用时间点恢复到误操作前
    gs_restore -d postgres -F t -P "2023-01-01 12:00:00" /backup/backup_file.tar
  4. 验证数据恢复

    sql
    -- 检查恢复的数据
    SELECT * FROM critical_table WHERE id = deleted_id;

误修改配置

故障表现

  • 数据库性能下降
  • 服务异常
  • 配置与预期不符

处理流程

  1. 查看当前配置

    sql
    SHOW parameter_name;
  2. 恢复正确配置

    sql
    -- 恢复参数到默认值
    ALTER SYSTEM RESET parameter_name;
    
    -- 或恢复到特定值
    ALTER SYSTEM SET parameter_name = 'correct_value';
    
    -- 重新加载配置
    SELECT pg_reload_conf();
  3. 验证配置效果

    • 监控数据库性能
    • 检查服务状态
    • 验证业务功能

集群故障预防措施

定期备份

bash
# 制定定期备份策略
# 全量备份
0 2 * * * gs_basebackup -D /backup/$(date +%Y%m%d) -F t -X stream -v

# 增量备份
0 */6 * * * gs_basebackup -D /backup/incremental/$(date +%Y%m%d_%H%M) -F t -X stream -c fast -v

监控与告警

  • 配置关键指标监控
  • 设置合理的告警阈值
  • 实时监控集群状态
  • 定期检查日志

高可用配置

  • 配置多副本
  • 实现自动故障转移
  • 部署跨可用区架构
  • 配置负载均衡

定期演练

  • 定期进行故障演练
  • 测试故障转移流程
  • 验证恢复时间
  • 完善故障处理文档

权限管理

  • 严格控制数据库权限
  • 实施操作审计
  • 多人复核重要操作
  • 限制敏感操作

故障处理工具

内置工具

  • gs_ctl:节点管理工具
  • gs_om:集群管理工具
  • gs_checkperf:性能检查工具
  • gs_checkdata:数据一致性检查工具
  • gs_basebackup:基础备份工具
  • gs_restore:恢复工具

第三方工具

  • Prometheus + Grafana:监控与可视化
  • Zabbix:系统监控
  • ELK Stack:日志分析

故障处理案例分析

案例一:主节点硬件故障

故障描述

  • 主节点服务器突然断电
  • 导致主节点无法启动
  • 集群自动触发故障转移

处理过程

  1. 确认故障

    bash
    gs_om -t status
  2. 验证新主节点

    bash
    gs_ctl status -D /opt/huawei/install/data/dn_slave
  3. 修复原主节点

    • 更换故障硬件
    • 重新安装操作系统
    • 恢复数据库软件
  4. 重建复制

    bash
    gs_basebackup -D /opt/huawei/install/data/dn -F p -X stream -h new_master_host -p 5432 -U repl_user
    gs_ctl start -D /opt/huawei/install/data/dn
  5. 验证集群状态

    bash
    gs_om -t status

经验教训

  • 定期检查硬件状态
  • 配置完善的监控和告警
  • 定期进行故障演练

案例二:网络分区故障

故障描述

  • 数据中心网络分区
  • 集群被分为两个子网
  • 出现双主节点情况

处理过程

  1. 确认网络分区

    bash
    ping node2
  2. 识别多数派

    • 确认每个子网的节点数量
    • 识别多数派节点
  3. 隔离少数派

    • 关闭少数派节点
    • 避免数据不一致
  4. 修复网络

    • 联系网络管理员修复网络
    • 验证网络恢复
  5. 恢复集群

    bash
    gs_ctl restart -D /opt/huawei/install/data/dn

经验教训

  • 配置网络分区检测
  • 实现自动隔离机制
  • 优化网络拓扑

常见问题(FAQ)

Q1: 如何快速定位集群故障?

A1: 快速定位集群故障的方法:

  1. 检查集群状态:gs_om -t status
  2. 检查节点状态:gs_ctl status -D /path/to/data
  3. 查看日志文件:tail -n 200 /path/to/data/pg_log/postgresql.log
  4. 检查硬件状态:磁盘、内存、CPU 等
  5. 检查网络连接:pingtelnet 等命令

Q2: 集群自动故障转移失败怎么办?

A2: 集群自动故障转移失败的处理方法:

  1. 手动执行故障转移:gs_ctl promote -D /path/to/slave/data
  2. 检查故障转移日志,分析失败原因
  3. 修复故障转移配置
  4. 测试故障转移功能

Q3: 如何避免集群脑裂?

A3: 避免集群脑裂的方法:

  1. 配置多数派机制
  2. 实现网络分区检测
  3. 部署共享存储锁定
  4. 配置 fencing 机制
  5. 定期检查集群状态

Q4: 如何恢复损坏的数据?

A4: 恢复损坏数据的方法:

  1. 使用最新备份恢复
  2. 应用 WAL 日志进行时间点恢复
  3. 对于单表损坏,可使用从其他节点导出的数据恢复
  4. 严重损坏时可能需要重建节点

Q5: 如何预防人为故障?

A5: 预防人为故障的方法:

  1. 严格的权限管理
  2. 操作审计和日志记录
  3. 多人复核重要操作
  4. 定期培训和演练
  5. 自动化操作脚本,减少手动操作

Q6: 如何测试集群的高可用性?

A6: 测试集群高可用性的方法:

  1. 模拟节点故障:关闭主节点,检查故障转移
  2. 模拟网络故障:断开节点间网络连接
  3. 模拟存储故障:填满磁盘空间
  4. 定期进行故障演练
  5. 测试恢复时间目标(RTO)和恢复点目标(RPO)