外观
GaussDB 跨集群恢复
跨集群恢复场景
灾难恢复
- 主集群发生灾难性故障,需要从备份恢复到备用集群
- 数据中心级故障,需要从异地备份恢复到新的数据中心
- 集群不可恢复,需要在新环境中重建集群
集群迁移
- 从旧集群迁移到新集群,保持数据一致性
- 从测试环境迁移到生产环境
- 从私有云迁移到公有云,或反之
数据共享
- 在多个集群间共享特定数据集
- 跨集群复制特定数据库或表
- 构建数据仓库或数据湖,整合多个集群的数据
跨集群恢复架构
基于备份文件的恢复架构
- 源集群:生成备份文件和WAL日志
- 备份存储:存储源集群的备份文件和WAL日志
- 网络传输:将备份文件从源集群传输到目标集群
- 目标集群:从备份文件恢复数据
基于流复制的恢复架构
- 源集群:作为主集群,生成WAL日志
- 流复制通道:建立源集群到目标集群的流复制连接
- 目标集群:作为备集群,接收并应用WAL日志
- 切换机制:在需要时将备集群切换为主集群
基于逻辑复制的恢复架构
- 源集群:配置逻辑复制发布
- 逻辑复制通道:建立源集群到目标集群的逻辑复制连接
- 目标集群:配置逻辑复制订阅,接收并应用逻辑变更
- 选择性复制:可以选择复制特定数据库、表或行
跨集群恢复配置要求
源集群配置
启用归档模式
basharchive_mode = on archive_command = 'cp %p /archive/wal/%f'配置WAL级别
bash# 对于物理复制,设置为replica;对于逻辑复制,设置为logical wal_level = logical配置最大WAL发送器数量
bashmax_wal_senders = 10配置复制用户
sql-- 创建复制用户 CREATE USER replication WITH REPLICATION PASSWORD 'password'; -- 配置pg_hba.conf,允许复制连接 host replication replication 0.0.0.0/0 md5
目标集群配置
配置兼容的GaussDB版本
- 目标集群版本应与源集群版本兼容
- 建议使用相同主版本,不同次版本
配置足够的资源
- 目标集群的硬件配置应不低于源集群
- 确保有足够的磁盘空间存储恢复的数据
配置网络连接
- 确保源集群和目标集群之间网络连通
- 开放必要的端口,如5432(数据库端口)
配置恢复参数
bash# 配置最大WAL接收器数量 max_wal_receivers = 10 # 配置恢复并行度 max_worker_processes = 16
使用gs_probackup进行跨集群物理恢复
准备工作
在源集群创建备份
bash# 在源集群执行全量备份 gs_probackup backup -B /backup/gaussdb/probackup -b full -p 5432将备份文件传输到目标集群
bash# 使用rsync传输备份文件 rsync -avz /backup/gaussdb/probackup/ user@target-cluster:/backup/gaussdb/probackup/在目标集群初始化备份目录
bashgs_probackup init -B /backup/gaussdb/probackup
执行跨集群恢复
添加实例配置
bashgs_probackup add-instance -B /backup/gaussdb/probackup -D /data/gaussdb/data -p 5432 -u omm执行恢复操作
bash# 查看可用备份 gs_probackup show -B /backup/gaussdb/probackup # 执行恢复 gs_probackup restore -B /backup/gaussdb/probackup -D /data/gaussdb/data --instance instance_name --backup backup_id启动目标集群
bashgs_ctl start -D /data/gaussdb/data验证恢复结果
bashgsql -h 127.0.0.1 -p 5432 -U postgres -c "SELECT count(*) FROM critical_table;"
使用逻辑备份进行跨集群恢复
使用pg_dump和pg_restore
在源集群创建逻辑备份
bash# 备份单个数据库 pg_dump -h source-cluster -p 5432 -U postgres -d mydb -F c -f /backup/mydb_dump.dump # 备份整个集群 pg_dumpall -h source-cluster -p 5432 -U postgres -f /backup/cluster_dump.sql将备份文件传输到目标集群
bashscp /backup/mydb_dump.dump user@target-cluster:/backup/在目标集群恢复备份
bash# 创建数据库 createdb -h 127.0.0.1 -p 5432 -U postgres mydb # 恢复自定义格式备份 pg_restore -h 127.0.0.1 -p 5432 -U postgres -d mydb /backup/mydb_dump.dump # 恢复SQL格式备份 psql -h 127.0.0.1 -p 5432 -U postgres -f /backup/cluster_dump.sql
使用逻辑复制
在源集群创建发布
sql-- 创建发布 CREATE PUBLICATION my_publication FOR ALL TABLES; -- 或创建针对特定表的发布 CREATE PUBLICATION my_publication FOR TABLE table1, table2;在目标集群创建订阅
sql-- 创建订阅 CREATE SUBSCRIPTION my_subscription CONNECTION 'host=source-cluster port=5432 dbname=mydb user=replication password=password' PUBLICATION my_publication;验证逻辑复制状态
sql-- 查看订阅状态 SELECT * FROM pg_subscription; -- 查看复制进度 SELECT * FROM pg_stat_subscription;
跨集群恢复最佳实践
备份策略
- 定期全量备份:每周执行一次全量备份,作为跨集群恢复的基础
- 实时归档WAL日志:确保WAL日志及时归档,避免日志丢失
- 备份验证:定期验证备份文件的完整性和可用性
- 多副本存储:将备份文件存储在多个位置,包括异地存储
网络传输
- 使用压缩传输:压缩备份文件后再传输,减少网络带宽消耗
- 使用增量传输:只传输变化的部分,提高传输效率
- 选择合适的传输工具:如rsync、scp或专业的备份传输工具
- 在业务低峰期传输:避免传输过程影响正常业务
恢复测试
- 定期恢复测试:每季度执行一次跨集群恢复测试,确保恢复流程正常
- 测试不同恢复场景:测试灾难恢复、集群迁移等不同场景
- 记录恢复时间:记录每次恢复的时间,以便优化恢复流程
- 验证数据一致性:恢复后验证源集群和目标集群的数据一致性
性能优化
- 使用并行恢复:启用并行恢复,提高恢复速度
- 优化恢复配置:调整恢复参数,如增加
max_worker_processes - 使用高速存储:将目标集群的数据目录存储在高速存储设备上
- 预分配存储空间:在恢复前预分配足够的存储空间,避免恢复过程中扩展文件系统
恢复后验证
数据一致性验证
行数验证:比较源集群和目标集群关键表的行数
bash# 在源集群执行 gsql -h source-cluster -p 5432 -U postgres -d mydb -c "SELECT table_name, count(*) FROM information_schema.tables WHERE table_schema = 'public' GROUP BY table_name;" > source_counts.txt # 在目标集群执行 gsql -h target-cluster -p 5432 -U postgres -d mydb -c "SELECT table_name, count(*) FROM information_schema.tables WHERE table_schema = 'public' GROUP BY table_name;" > target_counts.txt # 比较结果 diff source_counts.txt target_counts.txt数据抽样验证:随机抽样验证关键数据的准确性
sql-- 验证关键字段的统计信息 SELECT AVG(amount), SUM(amount), MIN(amount), MAX(amount) FROM orders;约束验证:检查主键、唯一约束等是否完整
sql-- 检查主键约束 SELECT conname, conrelid::regclass FROM pg_constraint WHERE contype = 'p';
功能验证
- 执行基本DML操作:验证插入、更新、删除操作是否正常
- 执行复杂查询:验证JOIN、子查询等复杂查询是否正常
- 验证存储过程和函数:确保业务逻辑正常运行
- 验证触发器:确保数据完整性约束正常
性能验证
- 执行性能基准测试:比较恢复前后的性能差异
- 检查查询计划:确保优化器生成合理的查询计划
- 监控系统资源:检查CPU、内存、磁盘IO等资源使用情况
常见问题(FAQ)
Q1: 跨集群恢复需要多长时间?
A1: 跨集群恢复时间取决于以下因素:
- 备份文件的大小
- 网络传输速度
- 目标集群的硬件配置
- 恢复配置参数
一般来说,跨集群恢复时间比本地恢复时间长,主要受限于网络传输速度和目标集群的IO性能。
Q2: 如何确保跨集群恢复的数据一致性?
A2: 确保跨集群恢复数据一致性的方法包括:
- 使用事务一致性备份,确保备份文件的一致性
- 确保所有必要的WAL日志都已归档和传输
- 恢复后验证数据一致性,如行数、关键数据等
- 使用逻辑复制时,确保复制延迟在可接受范围内
Q3: 可以跨版本进行跨集群恢复吗?
A3: 跨版本跨集群恢复需要谨慎处理:
- 物理恢复通常不支持跨主版本恢复
- 逻辑恢复支持跨主版本恢复,但可能需要注意兼容性问题
- 建议在恢复前查阅GaussDB版本兼容性文档
- 可以先恢复到相同版本,然后升级到目标版本
Q4: 如何减少跨集群恢复的网络传输时间?
A4: 减少跨集群恢复网络传输时间的方法包括:
- 使用压缩传输,如rsync -z或gzip
- 使用增量备份,只传输变化的部分
- 使用高速网络连接,如专线或高速互联网
- 在源集群和目标集群之间建立缓存服务器
- 选择合适的传输时间,如业务低峰期
Q5: 跨集群恢复后需要做什么?
A5: 跨集群恢复后需要:
- 验证数据一致性和完整性
- 重建索引和统计信息,提高查询性能
- 执行数据库真空操作,清理无效数据
- 调整数据库参数,优化目标集群性能
- 备份恢复后的集群,确保数据安全
- 配置监控和告警机制
Q6: 如何处理跨集群恢复过程中的网络中断?
A6: 处理网络中断的方法包括:
- 使用支持断点续传的传输工具,如rsync
- 记录传输进度,以便从中断点继续
- 验证已传输文件的完整性,避免数据损坏
- 考虑使用分布式备份存储,如对象存储,减少对直接网络传输的依赖
Q7: 可以选择性恢复特定数据库或表吗?
A7: 是的,可以选择性恢复特定数据库或表:
- 使用逻辑备份工具,如pg_dump,可以选择性备份特定数据库或表
- 使用pg_restore,可以选择性恢复特定表或对象
- 使用逻辑复制,可以选择复制特定数据库、表或行
Q8: 如何监控跨集群恢复进度?
A8: 监控跨集群恢复进度的方法包括:
- 监控备份文件传输进度
- 查看目标集群的恢复日志bash
tail -f /data/gaussdb/data/pg_log/gaussdb-$(date +%Y-%m-%d).log - 监控系统资源使用情况,如CPU、内存、磁盘IO
- 使用gs_probackup的恢复进度显示功能
Q9: 跨集群恢复和跨集群复制的区别是什么?
A9: 跨集群恢复和跨集群复制的主要区别包括:
- 目的:跨集群恢复用于灾难恢复或集群迁移,跨集群复制用于数据同步或高可用
- 触发方式:跨集群恢复是手动触发的,跨集群复制是自动的
- 数据流向:跨集群恢复是单向的,从备份到目标集群;跨集群复制可以是单向或双向的
- 恢复点:跨集群恢复可以恢复到特定时间点,跨集群复制保持实时同步
Q10: 如何选择合适的跨集群恢复方式?
A10: 选择跨集群恢复方式时应考虑以下因素:
- 恢复时间要求:要求快速恢复,选择物理恢复;允许较长时间,选择逻辑恢复
- 数据选择性:需要选择性恢复,选择逻辑恢复;需要完整恢复,选择物理恢复
- 跨版本需求:需要跨版本恢复,选择逻辑恢复;同版本恢复,选择物理恢复
- 网络条件:网络带宽有限,选择物理备份恢复;网络带宽充足,选择流复制或逻辑复制
- 业务需求:需要实时同步,选择流复制或逻辑复制;需要一次性恢复,选择基于备份的恢复
