1. 前言:为什么需要流复制缩容?

在日常的数据库运维中,我们经常会遇到需要调整数据库集群规模的情况。就像我们家里的衣柜,衣服多了需要整理,数据库集群也需要根据业务需求进行扩容或缩容。今天我们要聊的就是openGauss数据库中一个非常实用的功能——流复制缩容,也就是安全地移除从库节点。

想象一下这样的场景:你的业务高峰期过去了,原先为了应对高并发部署的多个从库现在显得有些"多余",继续维护它们不仅浪费资源,还增加了运维复杂度。这时候,流复制缩容就派上用场了。

2. openGauss 流复制基础回顾

在深入缩容操作之前,我们先简单回顾一下openGauss的流复制机制。openGauss采用主从复制架构,主库(primary)将WAL日志通过流复制方式传输到从库(standby),从库应用这些日志来保持与主库的数据同步。

流复制有两种模式:

  • 同步复制:主库等待至少一个从库确认收到数据后才向客户端返回成功
  • 异步复制:主库不需要等待从库确认,性能更高但可能丢失数据

理解这一点很重要,因为缩容操作会根据复制模式的不同而有所差异。

3. 缩容前的准备工作

3.1 检查集群状态

在进行任何缩容操作前,首先要全面检查集群的健康状态。这就像医生做手术前要先看体检报告一样重要。

-- 在主库上执行以下SQL检查集群状态
SELECT peer_role, peer_state, sync_state FROM pg_stat_replication;
/*
peer_role   | peer_state | sync_state
------------+------------+-----------
Standby     | Normal     | Async
Standby     | Normal     | Sync
*/

注释说明:

  • peer_role: 显示节点的角色(Standby表示从库)
  • peer_state: 节点状态,Normal表示正常
  • sync_state: 复制模式,Async表示异步,Sync表示同步

3.2 确认要移除的节点

不是所有从库都适合被移除,我们需要考虑:

  1. 不能移除所有同步复制节点(如果有的话)
  2. 优先移除负载较低的节点
  3. 考虑业务访问模式(某些从库可能被特定业务直接访问)
-- 查看从库负载情况(在从库上执行)
SELECT now(), usename, application_name, client_addr, state, 
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)) as lag
FROM pg_stat_replication;

3.3 备份关键配置

在修改任何配置前,做好备份是必须的:

# 备份postgresql.conf
cp $GAUSSDATA/postgresql.conf $GAUSSDATA/postgresql.conf.bak

# 备份pg_hba.conf
cp $GAUSSDATA/pg_hba.conf $GAUSSDATA/pg_hba.conf.bak

4. 安全移除从库的详细步骤

4.1 第一步:调整复制模式(如有必要)

如果要移除的是同步复制节点,必须先调整同步复制设置:

-- 查看当前同步复制配置
SELECT name, setting FROM pg_settings WHERE name LIKE 'synchronous%';

-- 修改同步复制配置(假设我们要移除名为'standby1'的节点)
ALTER SYSTEM SET synchronous_standby_names TO 'standby2';
SELECT pg_reload_conf();

4.2 第二步:停止从库服务

在要移除的从库节点上停止openGauss服务:

# 停止从库服务
gs_ctl stop -D $GAUSSDATA

# 确认服务已停止
gs_ctl status -D $GAUSSDATA

4.3 第三步:在主库上移除复制槽

openGauss使用复制槽来确保主库不会过早删除从库需要的WAL日志。移除从库后,对应的复制槽也应该清理:

-- 查看当前复制槽
SELECT * FROM pg_replication_slots;

-- 删除对应从库的复制槽(假设槽名为'standby1_slot')
SELECT pg_drop_replication_slot('standby1_slot');

4.4 第四步:更新主库配置

从主库的pg_hba.conf中移除对已删除从库的访问权限:

# 编辑pg_hba.conf,找到对应从库的条目并删除
vi $GAUSSDATA/pg_hba.conf

# 重新加载配置
gs_ctl reload -D $GAUSSDATA

4.5 第五步:清理从库数据(可选)

如果确定不再需要该从库,可以清理其数据目录:

# 谨慎操作!这将永久删除数据
rm -rf $GAUSSDATA

5. 操作后的验证与监控

缩容操作完成后,必须进行全面的验证:

5.1 验证集群状态

-- 在主库上验证剩余的从库连接
SELECT pid, application_name, client_addr, state, sync_state 
FROM pg_stat_replication;

5.2 监控性能指标

缩容后要特别注意主库的负载情况:

  • CPU使用率
  • 磁盘I/O
  • 复制延迟(如果有其他从库)
# 使用gs_checkperf检查性能
gs_checkperf -U omm -d $GAUSSDATA

6. 常见问题与解决方案

6.1 问题一:移除同步节点导致主库卡住

症状:执行DML操作时hang住,无法完成

原因:同步复制配置未正确更新,主库仍在等待已移除的从库确认

解决方案

-- 紧急情况下可临时设置为0(不推荐生产环境长期使用)
ALTER SYSTEM SET synchronous_standby_names TO '';
SELECT pg_reload_conf();

6.2 问题二:复制槽无法删除

错误信息:ERROR: replication slot "xxx" is active

解决方案

  1. 确保从库服务已完全停止
  2. 如果从库无法恢复,可以强制删除:
SELECT pg_drop_replication_slot('standby1_slot', true);

7. 技术优缺点分析

7.1 优点

  1. 资源优化:释放不必要的硬件资源,降低运营成本
  2. 简化运维:减少需要维护的节点数量,降低复杂度
  3. 灵活性:可根据业务负载动态调整集群规模

7.2 缺点

  1. 容错能力下降:可用节点减少,系统整体容错能力降低
  2. 性能影响:如果移除的是分担读负载的从库,可能影响查询性能
  3. 操作风险:不当操作可能导致数据不一致或服务中断

8. 应用场景建议

流复制缩容特别适合以下场景:

  1. 季节性业务:如电商在促销季结束后缩减集群规模
  2. 业务调整:某些业务下线或迁移,不再需要原有规模的数据库支持
  3. 资源优化:通过监控发现某些从库长期利用率低下
  4. 测试环境:临时搭建的测试集群在使用后需要清理

9. 关键注意事项

  1. 业务低峰期操作:尽量选择业务量小的时间段进行缩容
  2. 逐步操作:不要一次性移除过多节点,建议逐个操作
  3. 监控先行:操作前确保监控系统正常工作,能及时发现问题
  4. 回滚计划:准备好回滚方案,如备份和数据恢复流程
  5. 文档更新:及时更新集群拓扑文档和相关配置文档

10. 总结

openGauss的流复制缩容是一项看似简单但需要谨慎操作的任务。通过本文详细的步骤指南和实际示例,相信你已经掌握了安全移除从库节点的全套流程。记住,任何集群变更操作都应该遵循"先规划、再测试、最后生产"的原则。

在实际操作中,每个环境都可能有其特殊性,建议首次操作在测试环境充分演练。同时,随着openGauss版本的更新,某些细节可能会发生变化,建议参考对应版本的官方文档。

最后提醒一点:缩容后不要忘记调整你的监控告警阈值和备份策略,确保它们与新的集群规模相匹配。