Skip to content

KingBaseES 手动主备切换

概述

手动主备切换是指在 KingBaseES 高可用集群中,管理员主动将主库角色切换到备库的操作。这种操作通常用于计划性维护,如主库升级、硬件更换或性能优化等场景。手动切换需要管理员严格按照流程执行,确保数据一致性和服务连续性。

切换前准备

环境检查

  1. 集群状态验证

    bash
    # 检查主库状态
    /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT * FROM sys_stat_replication;"
    
    # 检查备库状态
    /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT * FROM sys_stat_wal_receiver;"
  2. 数据同步检查

    bash
    # 主库查看 LSN 位置
    /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT pg_current_wal_lsn();"
    
    # 备库查看已接收和已应用的 LSN
    /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT received_lsn, flushed_lsn, applied_lsn FROM sys_stat_wal_receiver;"
  3. 系统资源检查

    bash
    # 检查 CPU 使用率
    top -bn1 | grep "Cpu(s)"
    
    # 检查内存使用情况
    free -h
    
    # 检查磁盘空间
    df -h
  4. 应用连接检查

    bash
    # 查看当前连接数
    /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT count(*) FROM sys_stat_activity WHERE application_name != 'ksql';"

准备工作清单

检查项要求验证命令/方法
主备同步状态完全同步(LSN 一致)sys_stat_replicationsys_stat_wal_receiver
备库状态正常运行,无错误sys_stat_wal_receiver 状态正常
系统资源CPU < 70%,内存 < 80%,磁盘空间 > 20%topfreedf
应用连接业务低峰期,连接数较少sys_stat_activity
备份状态最近备份成功检查备份日志
监控系统无告警检查监控平台

切换流程

步骤 1:确认主备角色

bash
# 主库执行
/opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT pg_is_in_recovery();"
# 结果应为 f

# 备库执行
/opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT pg_is_in_recovery();"
# 结果应为 t

步骤 2:停止应用写入

在切换前,需要确保应用不再向主库写入数据,以避免数据丢失。可以通过以下方式实现:

  1. 通知业务方暂停写入操作
  2. 关闭应用服务
  3. 调整负载均衡配置,将流量导向备库(如果支持)

步骤 3:主库执行切换命令

bash
# 主库执行切换命令
/opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/kswitchover -h <primary_host> -p <primary_port> -U <user> -d <database> -w

参数说明:

  • -h:主库主机名或 IP 地址
  • -p:主库端口号
  • -U:数据库用户名
  • -d:数据库名
  • -w:自动输入密码(或使用 -W 交互式输入)

步骤 4:监控切换过程

切换过程中,可以通过以下方式监控进度:

  1. 查看日志文件

    bash
    tail -f /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/log/kingserver.log
  2. 检查切换状态

    bash
    # 检查新主库状态
    /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT pg_is_in_recovery();"
    # 结果应为 f
    
    # 检查新备库状态
    /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT pg_is_in_recovery();"
    # 结果应为 t

步骤 5:验证新主库状态

bash
# 检查新主库复制状态
/opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT * FROM sys_stat_replication;"

# 检查数据库连接
/opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT version();"

步骤 6:恢复应用服务

  1. 调整负载均衡配置,将流量导向新主库
  2. 启动应用服务
  3. 通知业务方恢复写入操作

切换后验证

数据一致性验证

bash
# 主库执行
/opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT pg_current_wal_lsn();"

# 备库执行
/opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT received_lsn, flushed_lsn, applied_lsn FROM sys_stat_wal_receiver;"

应用访问验证

bash
# 验证应用连接
curl -i http://<application_url>/health

# 验证读写操作
/opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "INSERT INTO test_table (id, name) VALUES (1, 'test');"
/opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT * FROM test_table WHERE id = 1;"

集群状态验证

bash
# 检查集群状态
/opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT * FROM sys_stat_replication;"

# 检查所有节点状态
for host in <primary_host> <standby_host>;
do
  echo "=== $host ==="
  /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -h $host -U system -d test -c "SELECT pg_is_in_recovery(), version();"
done

故障处理

切换失败场景

  1. 切换命令执行失败

    • 检查主备连接是否正常
    • 检查数据库用户权限
    • 查看日志文件,分析具体错误信息
  2. 数据不一致

    • 检查备库是否已应用所有 WAL 日志
    • 考虑重新搭建备库
    • 恢复最近的全量备份
  3. 新主库启动失败

    • 检查新主库配置文件
    • 查看新主库日志文件
    • 尝试手动启动新主库

回滚操作

如果切换过程中出现严重错误,需要执行回滚操作:

  1. 恢复原主库

    bash
    # 启动原主库
    systemctl start kingbase
    
    # 检查原主库状态
    /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT pg_is_in_recovery();"
  2. 重新配置备库

    bash
    # 停止备库
    systemctl stop kingbase
    
    # 重新配置备库
    rm -rf /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/data/*
    
    # 重新同步数据
    /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/pg_basebackup -h <primary_host> -p <primary_port> -U system -D /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/data -Fp -Xs -P
    
    # 启动备库
    systemctl start kingbase

版本差异

V8 R6 vs V8 R7

特性V8 R6V8 R7
切换命令kswitchover保留 kswitchover,新增 sys_switchover 函数
切换方式仅命令行命令行 + 函数调用
切换速度较慢优化了切换流程,速度更快
自动验证基本验证增强了自动验证机制
日志输出简单日志详细的切换过程日志
回滚机制手动回滚支持自动回滚

V8 R7 新特性

  1. 新增 sys_switchover 函数

    sql
    -- 在主库执行
    SELECT sys_switchover();
  2. 增强的切换验证 V8 R7 在切换前会自动验证:

    • 备库是否可用
    • 数据同步状态
    • 系统资源情况
    • 应用连接数
  3. 自动回滚机制 如果切换过程中出现错误,V8 R7 会自动回滚到切换前状态,减少管理员干预。

最佳实践

  1. 选择合适的时间窗口

    • 在业务低峰期执行切换
    • 提前通知相关团队
    • 预留足够的回滚时间
  2. 做好备份准备

    • 切换前执行全量备份
    • 确保备份文件可用
    • 测试备份恢复流程
  3. 严格按照流程执行

    • 遵循标准操作流程
    • 记录每一步操作
    • 执行前进行预演
  4. 监控切换过程

    • 实时监控日志
    • 关注系统资源变化
    • 验证数据一致性
  5. 切换后验证

    • 验证应用访问
    • 检查集群状态
    • 观察一段时间后再结束维护窗口

常见问题

1. 切换时提示备库不同步

问题描述:执行切换命令时,提示备库与主库数据不同步。

解决方法

bash
# 检查备库同步状态
/opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT * FROM sys_stat_wal_receiver;"

# 等待备库同步完成
while true; do
  sync_status=$(ksql -U system -d test -c "SELECT CASE WHEN received_lsn = applied_lsn THEN 'synced' ELSE 'syncing' END FROM sys_stat_wal_receiver;")
  if [[ $sync_status == *"synced"* ]]; then
    break
  fi
  sleep 5
done

2. 切换后应用无法连接

问题描述:切换完成后,应用无法连接到新主库。

解决方法

  • 检查新主库监听地址和端口
  • 检查防火墙配置
  • 检查应用连接字符串配置
  • 验证数据库用户权限

3. 切换后原主库无法作为备库启动

问题描述:切换完成后,原主库无法作为备库启动。

解决方法

bash
# 清理原主库数据目录
rm -rf /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/data/*

# 从新主库重新同步数据
/opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/pg_basebackup -h <new_primary_host> -p <new_primary_port> -U system -D /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/data -Fp -Xs -P

# 启动原主库(作为备库)
systemctl start kingbase

4. 切换过程中主库崩溃

问题描述:切换过程中,主库意外崩溃。

解决方法

  • 检查新主库状态,确认是否已切换成功
  • 如果切换成功,按照正常流程完成后续验证
  • 如果切换失败,启动原主库或重新搭建备库

5. 切换后数据丢失

问题描述:切换完成后,发现部分数据丢失。

解决方法

  • 立即停止应用写入
  • 恢复最近的全量备份
  • 应用增量备份或 WAL 日志
  • 重新同步备库
  • 分析数据丢失原因,避免再次发生

总结

手动主备切换是 KingBaseES 高可用集群管理中的重要操作,需要管理员具备丰富的经验和严格的操作流程。通过本文的指导,管理员可以掌握手动切换的完整流程,确保在计划性维护中安全、高效地完成主备角色切换。

在实际操作中,建议管理员:

  • 定期进行切换演练,熟悉操作流程
  • 保持文档更新,反映最新的操作步骤
  • 关注版本更新,利用新特性简化操作
  • 建立完善的监控和告警机制,及时发现问题

通过这些措施,可以提高 KingBaseES 高可用集群的管理效率,确保业务系统的连续性和数据安全性。