Skip to content

GaussDB 跨集群恢复

跨集群恢复场景

灾难恢复

  • 主集群发生灾难性故障,需要从备份恢复到备用集群
  • 数据中心级故障,需要从异地备份恢复到新的数据中心
  • 集群不可恢复,需要在新环境中重建集群

集群迁移

  • 从旧集群迁移到新集群,保持数据一致性
  • 从测试环境迁移到生产环境
  • 从私有云迁移到公有云,或反之

数据共享

  • 在多个集群间共享特定数据集
  • 跨集群复制特定数据库或表
  • 构建数据仓库或数据湖,整合多个集群的数据

跨集群恢复架构

基于备份文件的恢复架构

  1. 源集群:生成备份文件和WAL日志
  2. 备份存储:存储源集群的备份文件和WAL日志
  3. 网络传输:将备份文件从源集群传输到目标集群
  4. 目标集群:从备份文件恢复数据

基于流复制的恢复架构

  1. 源集群:作为主集群,生成WAL日志
  2. 流复制通道:建立源集群到目标集群的流复制连接
  3. 目标集群:作为备集群,接收并应用WAL日志
  4. 切换机制:在需要时将备集群切换为主集群

基于逻辑复制的恢复架构

  1. 源集群:配置逻辑复制发布
  2. 逻辑复制通道:建立源集群到目标集群的逻辑复制连接
  3. 目标集群:配置逻辑复制订阅,接收并应用逻辑变更
  4. 选择性复制:可以选择复制特定数据库、表或行

跨集群恢复配置要求

源集群配置

  1. 启用归档模式

    bash
    archive_mode = on
    archive_command = 'cp %p /archive/wal/%f'
  2. 配置WAL级别

    bash
    # 对于物理复制,设置为replica;对于逻辑复制,设置为logical
    wal_level = logical
  3. 配置最大WAL发送器数量

    bash
    max_wal_senders = 10
  4. 配置复制用户

    sql
    -- 创建复制用户
    CREATE USER replication WITH REPLICATION PASSWORD 'password';
    
    -- 配置pg_hba.conf,允许复制连接
    host replication replication 0.0.0.0/0 md5

目标集群配置

  1. 配置兼容的GaussDB版本

    • 目标集群版本应与源集群版本兼容
    • 建议使用相同主版本,不同次版本
  2. 配置足够的资源

    • 目标集群的硬件配置应不低于源集群
    • 确保有足够的磁盘空间存储恢复的数据
  3. 配置网络连接

    • 确保源集群和目标集群之间网络连通
    • 开放必要的端口,如5432(数据库端口)
  4. 配置恢复参数

    bash
    # 配置最大WAL接收器数量
    max_wal_receivers = 10
    
    # 配置恢复并行度
    max_worker_processes = 16

使用gs_probackup进行跨集群物理恢复

准备工作

  1. 在源集群创建备份

    bash
    # 在源集群执行全量备份
    gs_probackup backup -B /backup/gaussdb/probackup -b full -p 5432
  2. 将备份文件传输到目标集群

    bash
    # 使用rsync传输备份文件
    rsync -avz /backup/gaussdb/probackup/ user@target-cluster:/backup/gaussdb/probackup/
  3. 在目标集群初始化备份目录

    bash
    gs_probackup init -B /backup/gaussdb/probackup

执行跨集群恢复

  1. 添加实例配置

    bash
    gs_probackup add-instance -B /backup/gaussdb/probackup -D /data/gaussdb/data -p 5432 -u omm
  2. 执行恢复操作

    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
  3. 启动目标集群

    bash
    gs_ctl start -D /data/gaussdb/data
  4. 验证恢复结果

    bash
    gsql -h 127.0.0.1 -p 5432 -U postgres -c "SELECT count(*) FROM critical_table;"

使用逻辑备份进行跨集群恢复

使用pg_dump和pg_restore

  1. 在源集群创建逻辑备份

    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
  2. 将备份文件传输到目标集群

    bash
    scp /backup/mydb_dump.dump user@target-cluster:/backup/
  3. 在目标集群恢复备份

    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

使用逻辑复制

  1. 在源集群创建发布

    sql
    -- 创建发布
    CREATE PUBLICATION my_publication FOR ALL TABLES;
    
    -- 或创建针对特定表的发布
    CREATE PUBLICATION my_publication FOR TABLE table1, table2;
  2. 在目标集群创建订阅

    sql
    -- 创建订阅
    CREATE SUBSCRIPTION my_subscription
      CONNECTION 'host=source-cluster port=5432 dbname=mydb user=replication password=password'
      PUBLICATION my_publication;
  3. 验证逻辑复制状态

    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: 选择跨集群恢复方式时应考虑以下因素:

  • 恢复时间要求:要求快速恢复,选择物理恢复;允许较长时间,选择逻辑恢复
  • 数据选择性:需要选择性恢复,选择逻辑恢复;需要完整恢复,选择物理恢复
  • 跨版本需求:需要跨版本恢复,选择逻辑恢复;同版本恢复,选择物理恢复
  • 网络条件:网络带宽有限,选择物理备份恢复;网络带宽充足,选择流复制或逻辑复制
  • 业务需求:需要实时同步,选择流复制或逻辑复制;需要一次性恢复,选择基于备份的恢复