数据库集群的容量调整是运维中常见的需求。在openGauss高可用架构中,流复制技术通过实时同步数据保障业务连续性。但当业务规模变化时,如何安全移除冗余从库节点?本文将以真实环境为背景,详细拆解操作流程、提供生产级示例,并梳理避坑要点。


一、为什么要移除从库?典型的应用场景

应用场景一:资源利用率优化 某电商公司大促后,原集群配置的6个从库中,有3台资源利用率长期低于20%。通过缩容每年可节省约45%的硬件成本。

应用场景二:架构重构 某金融系统将原有"一主三从"架构改为"两地三中心"模式,需下线本地冗余节点,同步升级到新版本数据库。

场景验证方法:

-- 查询当前复制拓扑(技术栈:openGauss 3.0)
SELECT peer_role, peer_state, sync_state FROM pg_stat_get_stream_replications();
/* 输出示例:
 peer_role | peer_state | sync_state  
-----------+------------+------------
 Primary   | Normal     | Quorum
 Standby   | Normal     | Async
 Standby   | Normal     | Async
*/

二、操作前的关键准备

  1. 同步状态验证 通过gs_ctl query -D 数据目录确认从库处于正常同步状态:
gs_ctl query -D /opt/huawei/install/data/dn1
# 预期看到"Senders info"包含待移除节点的PID
  1. 业务流量确认 通过性能视图排查是否存在从库承担只读查询:
SELECT client_addr, application_name 
FROM pg_stat_activity 
WHERE backend_type='client backend';
-- 若发现连接来自待移除节点,需先迁移查询流量

三、分步操作流程与生产级示例

3.1 停用流复制通道
# 在待移除的从库执行(技术栈:openGauss 3.1)
gs_ctl stop -D /opt/ogdata/dn1 -m fast
# -m fast:快速关闭,适用于生产环境
3.2 修改主库配置文件
# 主库修改postgresql.conf
vim /opt/ogdata/dn1/postgresql.conf
# 注释或删除以下配置项:
# synchronous_standby_names = 'standby1,standby2'
# 修改后保存并重载配置
gs_ctl reload -D /opt/ogdata/dn1
3.3 清理复制槽(关键步骤)
-- 查询复制槽
SELECT slot_name, active FROM pg_replication_slots;
-- 删除对应从库的复制槽
SELECT pg_drop_replication_slot('standby2_slot');
/* 注意:
   若未清理复制槽,可能导致WAL日志堆积
   检查pg_xlog目录占用情况:du -sh /opt/ogdata/dn1/pg_xlog
*/

四、实战中的技术陷阱

4.1 幽灵连接问题

某运维团队移除从库后,主库仍显示复制连接:

SELECT pid, application_name 
FROM pg_stat_activity 
WHERE backend_type = 'walsender';
-- 解决方法:主库执行pg_terminate_backend()终止残留进程
4.2 配置残留导致启动失败

某从库重新加入集群时报错"duplicate replication user":

# 检查postgresql.conf中是否有残留配置
grep "primary_conninfo" /opt/ogdata/dn1/postgresql.conf
# 必须完全清除旧的主库连接信息

五、技术方案优劣分析

优势比较表:

方法类型 操作复杂度 停机时间 风险等级
直接关闭从库 ★☆☆ 秒级 ★★★★
滚动移除 ★★★☆ ★★☆

流复制缩容的特殊优势:

  • 数据零丢失:确保移除前后事务完整性
  • 弹性扩展:与扩容操作形成闭环管理
  • 版本兼容:支持混合版本集群缩容(需满足最小版本要求)

六、必须掌握的注意事项

  1. 顺序敏感操作
# 错误操作顺序示例:
停止主库->移除从库   # 会导致业务中断
# 正确顺序:
停止从库->修改主配置->清理资源
  1. 监控空窗期处理 建议在操作后立即检查:
SELECT * FROM pg_stat_get_stream_replications() 
WHERE peer_role = 'Standby';
-- 确保目标节点已不在复制拓扑中
  1. 备份策略调整 移除节点后需重新计算备份窗口:
原备份策略:
全量备份(每天01:00) + 6节点并行
新策略建议:
全量备份(每天02:00) + 3节点交叉备份

七、总结与建议

通过三阶段验证法确保操作成功:

  1. 拓扑验证:确认目标节点已移出复制列表
  2. 配置验证:检查所有相关参数文件
  3. 业务验证:模拟故障确保高可用机制生效

建议结合OM工具完成操作:

# 使用openGauss OM工具
gs_om -t remove-node -N standby2
# 优势:自动完成配置同步和检查