1. 项目背景与需求分析
在数据库运维工作中,我们经常会遇到需要调整架构的场景。最近接手了一个生产环境改造项目,客户需要将原本采用KingbaseES V8R6集群架构的系统拆分为独立单实例运行。这种架构调整通常出现在以下场景:
- 业务流量下降,不再需要高可用保障
- 系统迁移过渡期的临时方案
- 成本优化,减少集群管理开销
- 特定业务模块需要独立数据库实例
重要提示:架构拆分属于高风险操作,必须选择业务低峰期进行,并提前做好完整备份。我在实际执行时发现,即使文档齐全,现场仍可能出现各种意外情况,建议预留至少4小时维护窗口。
2. 环境准备与前置检查
2.1 集群现状确认
执行拆分前,必须完整记录当前集群状态。通过以下命令获取关键信息:
bash复制# 查看集群节点拓扑
./repmgr cluster show
# 检查流复制状态
./ksql test system -c "select * from sys_stat_replication"
# 确认复制槽信息
./ksql test system -c "select * from sys_replication_slots"
在我的案例中,集群由2节点组成:
- node1 (192.168.40.27): 主节点
- node2 (192.168.40.26): 备节点
2.2 关键参数记录
需要特别记录以下参数,拆分后需要相应调整:
sql复制-- 同步提交模式
show synchronous_commit;
-- 同步备库设置
show synchronous_standby_names;
-- 最大WAL发送进程数
show max_wal_senders;
2.3 备份策略确认
虽然拆分操作理论上不会丢失数据,但必须做好万全准备:
- 执行全量物理备份:
sys_rman backup --backup-mode=full - 导出关键业务表逻辑备份:
sys_dump -t 表名 库名 > 表名.sql - 记录当前WAL位置:
select sys_current_wal_lsn()
3. 集群拆分详细操作步骤
3.1 暂停集群管理服务
首先停止repmgr的监控进程,避免自动故障转移干扰:
bash复制# 在所有节点执行
./repmgr service pause
# 验证暂停状态
./repmgr service status
操作心得:实际执行时发现,如果集群节点间网络不稳定,pause命令可能超时。此时可以手动kill repmgrd进程:
pkill -9 repmgrd
3.2 备节点下线操作
3.2.1 取消备节点注册
bash复制# 在备节点执行
./repmgr standby unregister
这个操作会:
- 将主节点的同步模式从
quorum改为async - 移除
synchronous_standby_names中的备节点信息 - 尝试删除复制槽(如果备库仍在运行会报warning)
3.2.2 停止备库服务
bash复制/opt/kingbase/cluster/install/kingbase/bin/sys_ctl -D /opt/kingbase/cluster/install/kingbase/data/ stop
3.2.3 移除备库标识
bash复制mv /opt/kingbase/cluster/install/kingbase/data/standby.signal /opt/kingbase/cluster/install/kingbase/data/standby.signal.bk
避坑指南:有些运维人员会直接删除这个文件,但建议重命名保留,万一需要回滚可以快速恢复。
3.3 主节点下线操作
3.3.1 取消主节点注册
bash复制./repmgr primary unregister --force
使用--force参数是因为此时备节点已下线,正常注销会失败。
3.3.2 清理残留复制槽
sql复制-- 检查剩余复制槽
select * from sys_replication_slots;
-- 删除备库复制槽
select sys_drop_replication_slot('repmgr_slot_2');
3.4 参数调整与配置清理
3.4.1 修改同步提交模式
sql复制-- 改为本地提交即可
alter system set synchronous_commit=on;
select sys_reload_conf();
3.4.2 清理连接配置
编辑kingbase.auto.conf,注释或删除以下内容:
code复制#primary_conninfo = 'host=192.168.40.27 user=esrep port=54321...'
#primary_slot_name = 'repmgr_slot_2'
3.4.3 禁用集群管理服务
修改/etc/cron.d/KINGBASECRON,注释kbha的定时任务:
code复制#*/1 * * * * kingbase . /etc/profile;/home/kingbase/cluster/R6/R6HA/kingbase/bin/kbha...
4. 拆分后验证与优化
4.1 基础功能验证
bash复制# 启动两个节点的数据库服务
sys_ctl -D $DATA_DIR start
# 检查实例角色
ksql -c "select sys_is_in_recovery()"
# 测试读写功能
create table split_test(id int);
insert into split_test values(1);
4.2 性能参数调整
单实例运行后,可以优化以下参数:
sql复制-- 减少WAL相关进程
alter system set max_wal_senders=0;
-- 调整检查点频率
alter system set checkpoint_timeout='30min';
-- 关闭归档模式(如不再需要)
alter system set archive_mode=off;
4.3 资源释放建议
- 清理集群管理日志:
/opt/kingbase/cluster/log/ - 移除repmgr元数据库:
drop database repmgr - 回收VIP资源(如果之前配置了虚拟IP)
5. 常见问题与解决方案
5.1 拆分后主库无法启动
现象:报错"cannot start postmaster because of replication slot"
解决方案:
sql复制-- 启动时添加参数跳过复制槽检查
sys_ctl -D $DATA_DIR start -o '-c ignore_replication_slot_error=true'
-- 进入数据库后清理无效复制槽
select sys_drop_replication_slot('问题槽名');
5.2 业务连接仍使用旧连接串
现象:应用报连接超时,原连接串指向被注释的VIP或主库地址
解决方案:
- 立即修改应用连接配置
- 临时在数据库层面设置连接重定向:
sql复制alter system set listen_addresses='*';
alter system set port=54321;
select sys_reload_conf();
5.3 磁盘空间未释放
现象:拆分后WAL日志堆积,占用大量空间
原因:原集群配置的wal_keep_segments值过大
解决方法:
sql复制alter system set wal_keep_size='1GB';
select sys_reload_conf();
6. 后续维护建议
-
监控调整:移除集群健康检查项,增加单实例关键指标监控
- 磁盘空间使用率
- 活跃连接数
- 长事务检测
-
备份策略更新:
bash复制# 单实例物理备份示例 sys_rman backup --backup-mode=full --backup-dir=/backups --instance=node1 -
定期健康检查:
sql复制-- 检查表空间使用 select * from sys_tablespace_usage; -- 检查锁等待 select * from sys_locks where not granted;
这次架构拆分项目让我深刻体会到,集群降级操作比升级更考验运维人员的细致程度。每个步骤都需要双重确认,特别是在生产环境执行时,必须准备好完整的回退方案。建议在测试环境先演练至少3次,记录每个环节的时间点和验证方法,形成标准化的操作手册。