外观
KingBaseES 手动主备切换
概述
手动主备切换是指在 KingBaseES 高可用集群中,管理员主动将主库角色切换到备库的操作。这种操作通常用于计划性维护,如主库升级、硬件更换或性能优化等场景。手动切换需要管理员严格按照流程执行,确保数据一致性和服务连续性。
切换前准备
环境检查
集群状态验证
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;"数据同步检查
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;"系统资源检查
bash# 检查 CPU 使用率 top -bn1 | grep "Cpu(s)" # 检查内存使用情况 free -h # 检查磁盘空间 df -h应用连接检查
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_replication 和 sys_stat_wal_receiver |
| 备库状态 | 正常运行,无错误 | sys_stat_wal_receiver 状态正常 |
| 系统资源 | CPU < 70%,内存 < 80%,磁盘空间 > 20% | top、free、df |
| 应用连接 | 业务低峰期,连接数较少 | 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:停止应用写入
在切换前,需要确保应用不再向主库写入数据,以避免数据丢失。可以通过以下方式实现:
- 通知业务方暂停写入操作
- 关闭应用服务
- 调整负载均衡配置,将流量导向备库(如果支持)
步骤 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:监控切换过程
切换过程中,可以通过以下方式监控进度:
查看日志文件
bashtail -f /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/log/kingserver.log检查切换状态
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:恢复应用服务
- 调整负载均衡配置,将流量导向新主库
- 启动应用服务
- 通知业务方恢复写入操作
切换后验证
数据一致性验证
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故障处理
切换失败场景
切换命令执行失败
- 检查主备连接是否正常
- 检查数据库用户权限
- 查看日志文件,分析具体错误信息
数据不一致
- 检查备库是否已应用所有 WAL 日志
- 考虑重新搭建备库
- 恢复最近的全量备份
新主库启动失败
- 检查新主库配置文件
- 查看新主库日志文件
- 尝试手动启动新主库
回滚操作
如果切换过程中出现严重错误,需要执行回滚操作:
恢复原主库
bash# 启动原主库 systemctl start kingbase # 检查原主库状态 /opt/Kingbase/ES/V8/KESRealPro/V008R006C007B0013/Server/bin/ksql -U system -d test -c "SELECT pg_is_in_recovery();"重新配置备库
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 R6 | V8 R7 |
|---|---|---|
| 切换命令 | kswitchover | 保留 kswitchover,新增 sys_switchover 函数 |
| 切换方式 | 仅命令行 | 命令行 + 函数调用 |
| 切换速度 | 较慢 | 优化了切换流程,速度更快 |
| 自动验证 | 基本验证 | 增强了自动验证机制 |
| 日志输出 | 简单日志 | 详细的切换过程日志 |
| 回滚机制 | 手动回滚 | 支持自动回滚 |
V8 R7 新特性
新增
sys_switchover函数sql-- 在主库执行 SELECT sys_switchover();增强的切换验证 V8 R7 在切换前会自动验证:
- 备库是否可用
- 数据同步状态
- 系统资源情况
- 应用连接数
自动回滚机制 如果切换过程中出现错误,V8 R7 会自动回滚到切换前状态,减少管理员干预。
最佳实践
选择合适的时间窗口
- 在业务低峰期执行切换
- 提前通知相关团队
- 预留足够的回滚时间
做好备份准备
- 切换前执行全量备份
- 确保备份文件可用
- 测试备份恢复流程
严格按照流程执行
- 遵循标准操作流程
- 记录每一步操作
- 执行前进行预演
监控切换过程
- 实时监控日志
- 关注系统资源变化
- 验证数据一致性
切换后验证
- 验证应用访问
- 检查集群状态
- 观察一段时间后再结束维护窗口
常见问题
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
done2. 切换后应用无法连接
问题描述:切换完成后,应用无法连接到新主库。
解决方法:
- 检查新主库监听地址和端口
- 检查防火墙配置
- 检查应用连接字符串配置
- 验证数据库用户权限
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 kingbase4. 切换过程中主库崩溃
问题描述:切换过程中,主库意外崩溃。
解决方法:
- 检查新主库状态,确认是否已切换成功
- 如果切换成功,按照正常流程完成后续验证
- 如果切换失败,启动原主库或重新搭建备库
5. 切换后数据丢失
问题描述:切换完成后,发现部分数据丢失。
解决方法:
- 立即停止应用写入
- 恢复最近的全量备份
- 应用增量备份或 WAL 日志
- 重新同步备库
- 分析数据丢失原因,避免再次发生
总结
手动主备切换是 KingBaseES 高可用集群管理中的重要操作,需要管理员具备丰富的经验和严格的操作流程。通过本文的指导,管理员可以掌握手动切换的完整流程,确保在计划性维护中安全、高效地完成主备角色切换。
在实际操作中,建议管理员:
- 定期进行切换演练,熟悉操作流程
- 保持文档更新,反映最新的操作步骤
- 关注版本更新,利用新特性简化操作
- 建立完善的监控和告警机制,及时发现问题
通过这些措施,可以提高 KingBaseES 高可用集群的管理效率,确保业务系统的连续性和数据安全性。
