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 确认要移除的节点
不是所有从库都适合被移除,我们需要考虑:
- 不能移除所有同步复制节点(如果有的话)
- 优先移除负载较低的节点
- 考虑业务访问模式(某些从库可能被特定业务直接访问)
-- 查看从库负载情况(在从库上执行)
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
解决方案:
- 确保从库服务已完全停止
- 如果从库无法恢复,可以强制删除:
SELECT pg_drop_replication_slot('standby1_slot', true);
7. 技术优缺点分析
7.1 优点
- 资源优化:释放不必要的硬件资源,降低运营成本
- 简化运维:减少需要维护的节点数量,降低复杂度
- 灵活性:可根据业务负载动态调整集群规模
7.2 缺点
- 容错能力下降:可用节点减少,系统整体容错能力降低
- 性能影响:如果移除的是分担读负载的从库,可能影响查询性能
- 操作风险:不当操作可能导致数据不一致或服务中断
8. 应用场景建议
流复制缩容特别适合以下场景:
- 季节性业务:如电商在促销季结束后缩减集群规模
- 业务调整:某些业务下线或迁移,不再需要原有规模的数据库支持
- 资源优化:通过监控发现某些从库长期利用率低下
- 测试环境:临时搭建的测试集群在使用后需要清理
9. 关键注意事项
- 业务低峰期操作:尽量选择业务量小的时间段进行缩容
- 逐步操作:不要一次性移除过多节点,建议逐个操作
- 监控先行:操作前确保监控系统正常工作,能及时发现问题
- 回滚计划:准备好回滚方案,如备份和数据恢复流程
- 文档更新:及时更新集群拓扑文档和相关配置文档
10. 总结
openGauss的流复制缩容是一项看似简单但需要谨慎操作的任务。通过本文详细的步骤指南和实际示例,相信你已经掌握了安全移除从库节点的全套流程。记住,任何集群变更操作都应该遵循"先规划、再测试、最后生产"的原则。
在实际操作中,每个环境都可能有其特殊性,建议首次操作在测试环境充分演练。同时,随着openGauss版本的更新,某些细节可能会发生变化,建议参考对应版本的官方文档。
最后提醒一点:缩容后不要忘记调整你的监控告警阈值和备份策略,确保它们与新的集群规模相匹配。
评论