YMatrix 6.8 灾难恢复使用指南

本文档介绍 YMatrix 6.8 灾难恢复功能的部署、检查、监控、切换和恢复方法。

注意!

YMatrix 6.8 灾难恢复部署方式与旧版本相比发生变化,且不向前兼容。部署和运维操作请以本文档为准,不要沿用旧版本中“主集群侧仅部署 Subscriber、备份集群侧仅部署 Publisher”的部署方式。

1 功能介绍

1.1 灾难恢复功能说明

灾难恢复(Disaster Recovery,DR,又称灾备或容灾)指在灾难事件发生后恢复 IT 基础设施访问和功能的能力。

YMatrix 灾难恢复指 YMatrix 数据库集群(主集群)发生灾难时,由备份的 YMatrix 数据库集群承接主集群对应用的数据服务功能,保证数据库内数据和数据库服务持续可用。

YMatrix 6.8 灾难恢复是数据库集群级别的灾难恢复方案,具备以下特征:

  • 数据实时复制
  • 数据热备份
  • 可跨数据中心部署
  • 以 YMatrix 数据库集群为灾备对象

1.2 核心概念

YMatrix 数据库集群

具备完整数据库功能的集群,包括高可用组件、数据库组件等。

主集群

存储 DR 要保护的数据,并在正常情况下提供数据服务的 YMatrix 数据库集群。

备份集群

从主集群备份数据,并在灾难发生时恢复并提供数据服务的 YMatrix 数据库集群。

备份集群是具备完整功能的 YMatrix 数据库集群。作为备份角色运行时,备份集群从主集群备份全部数据,并可以执行部分只读操作。发生灾难恢复切换后,备份集群会变为正常服务角色的 YMatrix 数据库集群。

注意!

备份集群的数据一致性只在全局一致性点处有效。备份过程中虽然支持只读查询,但各分片日志播放同步粒度只控制在全局一致性点,不保证任意时刻查询结果正确。

灾难恢复功能组件

实现主集群数据备份和灾难恢复数据服务切换的组件,主要包括 Subscriber 和 Publisher。

Subscriber

用于连接主集群的灾难恢复功能组件。负责从备份集群侧的 Publisher 接收备份请求并发送到主集群,同时接收主集群的备份数据,并将数据从主集群侧发送到备份集群侧的 Publisher。

Publisher

用于连接备份集群的灾难恢复功能组件。负责从备份集群侧接收备份请求并发送到主集群侧 Subscriber,同时接收主集群侧 Subscriber 发送的备份数据,并发送给备份集群。

YMatrix 6.8 中,为让主集群和备份集群能够双向传输,主集群侧和备份集群侧均需部署 Subscriber 和 Publisher。同一集群侧的 Subscriber 和 Publisher 可以部署在同一台 pubsub 主机上。一般情况下,同一时刻同一集群侧的 Subscriber 和 Publisher 只有一个在工作。

2 部署前准备

2.1 版本、架构和资源要求

部署前,请确认满足以下要求:

  • 部署 DR 功能使用的 YMatrix 数据库软件版本必须与主集群的 YMatrix 数据库软件版本完全一致。
  • 部署 DR 功能的机器集群必须与主集群机器集群的 CPU 架构一致。
  • Subscriber 所在机器需要具备足够内存。Subscriber 中单个 shard 数据流使用的内存约为 100 MiB。
  • Publisher 所在机器需要具备足够内存。Publisher 中单个 shard 数据流使用的内存约为 200 MiB。
  • 备份集群以备份角色运行时占用的 CPU 和内存资源较少,但灾难恢复切换成正常服务角色后与主集群资源使用类似。因此,备份集群资源应按切换后承载主集群服务的要求准备。

注意!

Subscriber 和 Publisher 的单 shard 内存估算值来自发布版本测试,后续版本可能变化。请结合实际 shard 数和业务负载预留资源。

2.2 调整主集群参数

部署 DR 时,主集群 GUC synchronous_commit 仅支持以下取值:

  • off
  • local
  • remote_write
  • on,推荐

不可设置为 remote_apply

在主集群 master 机器,以 mxadmin 用户身份执行:

gpconfig -c synchronous_commit -v <可取值之一>

重新加载配置:

mxstop -u

2.3 检查 matrixmgr

部署前,请在主集群侧确认 matrixmgr 数据库已存在,且已加载 matrixmgr 扩展。

如果交付环境中已经提供 matrixmgr 检查脚本或标准检查 SQL,请按现场交付规范执行检查;未确认该数据库和扩展状态前,不应继续部署。

2.4 准备网络环境

以下说明主要适用于将备份集群部署到与主集群不同数据中心的场景。其他场景请按实际网络规划调整。

主集群侧需要准备:

  1. 准备用于部署 Subscriber 和 Publisher 的 pubsub 主机,并将其配置进主集群所在子网。
  2. 确认该 pubsub 主机在主集群子网内与主集群所有机器互通。
  3. 记录该 pubsub 主机在主集群子网内的 IP,作为“主集群 pubsub 对内 IP 地址”。
  4. 配置该 pubsub 主机进入与备份集群侧连通的子网。
  5. 确认该 pubsub 主机在跨数据中心通信子网内与备份集群侧 pubsub 主机互通。
  6. 记录该 pubsub 主机在跨数据中心通信子网内的 IP,作为“主集群 pubsub 对外 IP 地址”。

备份集群侧需要准备:

  1. 准备用于部署 Subscriber 和 Publisher 的 pubsub 主机,并将其配置进备份集群所在子网。
  2. 确认该 pubsub 主机在备份集群子网内与要部署备份集群的所有机器互通。
  3. 记录该 pubsub 主机在备份集群子网内的 IP,作为“备份集群 pubsub 对内 IP 地址”。
  4. 配置该 pubsub 主机进入与主集群侧连通的子网。
  5. 确认该 pubsub 主机在跨数据中心通信子网内与主集群侧 pubsub 主机互通。
  6. 记录该 pubsub 主机在跨数据中心通信子网内的 IP,作为“备份集群 pubsub 对外 IP 地址”。

两侧互连需要确认:

  • 主集群 pubsub 对外 IP 地址与备份集群 pubsub 对外 IP 地址互通。
  • 各侧 pubsub 对内 IP 地址与本侧所有数据库节点互通。
  • 传输带宽和传输延迟满足数据量和数据备份需求。

3 在主集群侧部署 Subscriber 和 Publisher

本文命令中的 <db_cluster_id><COUNT><shard_id>{{...}} 均为占位符,请按现场集群实际值替换后执行。

3.1 向主集群新增 pubsub 主机

  1. 在主集群侧 pubsub 主机上安装与主集群相同的 YMatrix 软件。

  2. 在主集群所有节点上,以 root 用户配置 /etc/hosts,添加新增的 pubsub 主机名,使用主集群侧 IP 地址。

  3. 在主集群 master 机器,以 root 用户身份创建配置文件目录:

    mkdir ~/pubsub
  4. 在主集群 master 机器,以 root 用户身份执行下列命令,将 pubsub 主机加入主集群物理集群:

    # 初始化 expand
    /opt/ymatrix/matrixdb6/bin/mxctl expand init \
    > ~/pubsub/expand.init
    
    # 添加 pubsub 所在机器
    cat ~/pubsub/expand.init | \
    /opt/ymatrix/matrixdb6/bin/mxctl expand add --host {{pubsub 主机名或主集群侧 IP 地址}} \
    > ~/pubsub/expand.add
    
    # 进行网络互通性检查
    cat ~/pubsub/expand.add | \
    /opt/ymatrix/matrixdb6/bin/mxctl expand netcheck \
    > ~/pubsub/expand.nc
    
    # 生成 plan
    cat ~/pubsub/expand.nc | \
    /opt/ymatrix/matrixdb6/bin/mxbox deployer expand --physical-cluster-only \
    > ~/pubsub/expand.plan
    
    # 执行 plan
    cat ~/pubsub/expand.plan | \
    /opt/ymatrix/matrixdb6/bin/mxbox deployer exec
  5. 编辑主集群所有数据库节点(master、standby、primary、mirror)的 pg_hba.conf,在 #user access rules 之前,建议在第一个非 trust 规则之前,新增以下规则:

    host        all,replication        mxadmin        {{pubsub 主集群侧 IP 地址}}/32        trust
  6. 在主集群 master 机器,以 mxadmin 用户身份重新加载配置:

    /opt/ymatrix/matrixdb6/bin/mxstop -u

3.2 配置并启动主集群侧 Subscriber

  1. 在主集群侧 pubsub 主机,以 root 用户身份创建配置目录:

    mkdir -p /etc/matrixdb6/pubsub
  2. 在主集群侧 pubsub 主机,以 root 用户身份创建 Subscriber 配置文件 /etc/matrixdb6/pubsub/subscriber.conf

    # /etc/matrixdb6/pubsub/subscriber.conf
    module      = 'subscriber'
    perf_port   = 5587 # 性能诊断 HTTP 端口,pprof 默认关闭,使用说明见“运维补充说明”
    verbose     = true # 日志级别根据实际需要
    debug       = false # 日志级别根据实际需要
    
    [[receiver]]
    type                                    = 'db'
    cluster_id                              = ''              # 主集群 cluster_id
    host                                    = ''              # 主集群 master 的主机名或 IP
    port                                    = 4617            # 主集群 master supervisor 监听端口号
    
    # 可选参数:省略时使用系统默认值
    # dbname    = 'template1'
    # username  = 'mxadmin'
    # restore_point_creation_interval = '60s' # 数据一致性通过 restore point 保障,该项控制创建 restore point 的时间间隔,默认 60s
    
    [[sender]]
    type        = 'socket'
    port        = 9320    # Subscriber 的监听端口
  3. 在主集群侧 pubsub 主机,以 root 用户身份在 /etc/matrixdb6/service 下创建 supervisor 配置文件 subscriber_<db_cluster_id>.conf

    # /etc/matrixdb6/service/subscriber_<db_cluster_id>.conf
    [program:subscriber_<db_cluster_id>]
      process_name=subscriber_<db_cluster_id>
      command=%(ENV_MXHOME)s/bin/mxdr -s <COUNT> -c /etc/matrixdb6/pubsub/subscriber.conf
      directory=%(ENV_MXHOME)s/bin
      autostart=true
      autorestart=true
      stopsignal=TERM
      stdout_logfile=%(ENV_MXLOGDIR)s/subscriber_<db_cluster_id>.log
      stdout_logfile_maxbytes=50MB
      stdout_logfile_backups=10
      redirect_stderr=true
      user=mxadmin

其中,<COUNT> 为主集群 shard 数量。可在主集群 master 上执行以下 SQL 获取:

SELECT count(1) FROM gp_segment_configuration WHERE role='p';
  1. 在主集群侧 pubsub 主机,以 root 用户身份执行:

    /opt/ymatrix/matrixdb6/bin/supervisorctl update
    /opt/ymatrix/matrixdb6/bin/supervisorctl start subscriber_<db_cluster_id>
  2. 检查 Subscriber 状态:

    /opt/ymatrix/matrixdb6/bin/supervisorctl status

检查点:

  • 存在名为 subscriber_<db_cluster_id> 的进程。
  • Subscriber 进程处于 Running 状态。
  • 根据 supervisor 日志文件路径检查日志文件,确认无异常日志。

3.3 配置并启动主集群侧 Publisher

  1. 在主集群侧 pubsub 主机,以 root 用户身份创建 Publisher 配置文件 /etc/matrixdb6/pubsub/publisher.conf

    # /etc/matrixdb6/pubsub/publisher.conf
    module      = 'publisher'
    perf_port   = 6698 # 性能诊断 HTTP 端口,pprof 默认关闭,使用说明见“运维补充说明”
    verbose     = true # 日志级别根据实际需要
    debug       = false # 日志级别根据实际需要
    
    [[receiver]]
    type        = 'socket'
    host        = '<需填入>' # 对应的 Subscriber IP 地址,即“备份集群 pubsub 对外 IP 地址”
    port        = 9320      # 对应的 Subscriber 的监听端口
    
    [[sender]]
    type        = 'db'
    host        = '<需填入>'    # Publisher 监听的主机,即“主集群 pubsub 对内 IP 地址”
    listen      = 6432         # Publisher 监听基础端口,范围随 shard 数量变化
    
    # 可选参数:省略时使用系统默认值
    # username  = 'mxadmin'
    # dbname    = 'template1'
  2. 在主集群侧 pubsub 主机,以 root 用户身份在 /etc/matrixdb6/service 下创建 supervisor 配置文件 publisher_<db_cluster_id>.conf

    # /etc/matrixdb6/service/publisher_<db_cluster_id>.conf
    [program:publisher_<db_cluster_id>]
      process_name=publisher_<db_cluster_id>
      command=%(ENV_MXHOME)s/bin/mxdr -s <COUNT> -c /etc/matrixdb6/pubsub/publisher.conf
      directory=%(ENV_MXHOME)s/bin
      autostart=true
      autorestart=true
      stopsignal=TERM
      stdout_logfile=%(ENV_MXLOGDIR)s/publisher_<db_cluster_id>.log
      stdout_logfile_maxbytes=50MB
      stdout_logfile_backups=10
      redirect_stderr=true
      user=mxadmin
  3. 在主集群侧 pubsub 主机,以 root 用户身份执行:

    /opt/ymatrix/matrixdb6/bin/supervisorctl update
    /opt/ymatrix/matrixdb6/bin/supervisorctl start publisher_<db_cluster_id>
  4. 检查 Publisher 状态:

    /opt/ymatrix/matrixdb6/bin/supervisorctl status

配置完成后检查:

  • 存在名为 publisher_<db_cluster_id> 的进程。
  • Publisher 进程处于 Running 状态。
  • 根据 supervisor 日志文件路径检查日志文件,确认无异常日志。

4 在备份集群侧部署 Subscriber、Publisher 和备份集群

4.1 准备备份集群机器和 pubsub 配置目录

  1. 在备份集群侧 pubsub 主机和备份集群机器上安装与主集群相同的 YMatrix 软件,并安装依赖。准备工作与部署主集群相同。

  2. 在备份集群侧 pubsub 主机,以 root 用户身份创建 pubsub 配置目录:

    mkdir -p /etc/matrixdb6/pubsub
  3. 在备份集群侧 pubsub 主机,以 root 用户身份创建工作目录:

    mkdir ~/pubsub

4.2 生成并修改 mapping 配置

mapping 配置用于建立主集群 shard 到备份集群 primary 的映射关系。

  1. 在主集群 master 机器,以 mxadmin 用户身份执行 SQL,为备份集群 shard 映射配置文件生成模板 /tmp/mapping.tmp

    COPY (
    SELECT content, hostname, port, datadir
    FROM gp_segment_configuration
    WHERE role='p'
    ORDER BY content
    ) TO '/tmp/mapping.tmp' DELIMITER '|';
  2. 修改生成的文件:

  • 第一列为主集群 content id,无需修改。
  • 后三列为备份集群信息,需要按实际情况修改。
  • 后三列分别表示备份集群 primary 的主机名、primary 端口号、数据目录。
  1. 可执行以下命令查看配置说明:

    mxbox deployer dr pub config
  2. 修改完成后,将文件移动到备份集群侧 Publisher 机器 root 用户的 ~/pubsub 目录下,并作为 mapping.conf 使用。

4.3 创建备份集群侧 Publisher 配置

在备份集群侧 pubsub 主机,以 root 用户身份创建 /etc/matrixdb6/pubsub/publisher.conf

# /etc/matrixdb6/pubsub/publisher.conf
module      = 'publisher'
perf_port   = 6698 # 性能诊断 HTTP 端口,pprof 默认关闭,使用说明见“运维补充说明”
verbose     = true # 日志级别根据实际需要
debug       = false # 日志级别根据实际需要

[[receiver]]
type        = 'socket'
host        = '<需填入>' # 对应的 Subscriber IP 地址,即“主集群 pubsub 对外 IP 地址”
port        = 9320      # 对应的 Subscriber 的监听端口

[[sender]]
type        = 'db'
host        = '<需填入>'    # Publisher 监听的主机,即“备份集群 pubsub 对内 IP 地址”
listen      = 6432         # Publisher 监听基础端口,范围随 shard 数量变化

# 可选参数:省略时使用系统默认值
# username  = 'mxadmin'
# dbname    = 'template1'

4.4 创建备份集群侧 Subscriber 配置

在备份集群侧 pubsub 主机,以 root 用户身份创建 /etc/matrixdb6/pubsub/subscriber.conf

# /etc/matrixdb6/pubsub/subscriber.conf
module      = 'subscriber'
perf_port   = 5587 # 性能诊断 HTTP 端口,pprof 默认关闭,使用说明见“运维补充说明”
verbose     = true # 日志级别根据实际需要
debug       = false # 日志级别根据实际需要

[[receiver]]
type                                    = 'db'
cluster_id                              = ''              # 备份集群 cluster_id,此处可以留空
host                                    = '<需填入>'       # 备份集群 master 的主机名或 IP
port                                    = 4617            # 备份集群 master supervisor 监听端口号

# 可选参数:省略时使用系统默认值
# dbname    = 'template1'
# username  = 'mxadmin'
# restore_point_creation_interval = '60s' # 数据一致性通过 restore point 保障,该项控制创建 restore point 的时间间隔,默认 60s

[[sender]]
type        = 'socket'
port        = 9320    # Subscriber 的监听端口

4.5 部署备份集群并启动备份

以下命令在备份集群侧 pubsub 主机以 root 用户身份执行。

  1. 收集 pubsub、master 和 segment 机器信息:

    # 收集 pubsub 机器的信息
    /opt/ymatrix/matrixdb6/bin/mxctl setup collect --host localhost > ~/pubsub/collect.0
    
    # 收集 master 机器信息
    cat ~/pubsub/collect.0 | \
    /opt/ymatrix/matrixdb6/bin/mxctl setup collect --host {{备份集群 master 所在机器 IP}} \
    > ~/pubsub/collect.1
    
    # 收集其他要部署 segment 机器信息
    cat ~/pubsub/collect.1 | \
    /opt/ymatrix/matrixdb6/bin/mxctl setup collect --host {{备份集群其他机器 IP}} \
    > ~/pubsub/collect.2
    
    ...
    
    # 收集其他要部署 segment 机器信息
    cat ~/pubsub/collect.n-1 | \
    /opt/ymatrix/matrixdb6/bin/mxctl setup collect --host {{备份集群其他机器 IP}} \
    > ~/pubsub/collect.n
  2. 进行网络连通性检查:

    cat ~/pubsub/collect.n | \
    /opt/ymatrix/matrixdb6/bin/mxctl setup netcheck \
    > ~/pubsub/plan.nc
  3. 生成部署计划:

    /opt/ymatrix/matrixdb6/bin/mxbox deployer dr pub plan \
    --wait \
    --collect-file ~/pubsub/plan.nc \
    --mapping-file ~/pubsub/mapping.conf \
    --publisher-file /etc/matrixdb6/pubsub/publisher.conf \
    --subscriber-file /etc/matrixdb6/pubsub/subscriber.conf \
    > ~/pubsub/plan

如果需要在备份集群侧部署额外的 mirror 备份,可在 plan 命令中增加 --with-mirror。使用该选项后,部署的备份集群将附带 standby 和 mirror。

  1. 执行部署计划:

    /opt/ymatrix/matrixdb6/bin/mxbox deployer dr pub setup \
    --plan-file ~/pubsub/plan

该步骤会部署 Subscriber、Publisher 和备份集群,并连接 Publisher,开始备份。

5 检查部署结果

5.1 检查关键进程

5.1.1 检查主集群 walsender

在主集群各个 primary 所在机器,以 root 用户身份执行:

ps aux | grep postgres | grep walsender

应存在与 Subscriber 连接的进程,且进程处于 streaming 状态。

5.1.2 检查主集群侧 Subscriber 和 Publisher

在主集群侧 pubsub 主机,以 mxadmin 用户身份执行:

/opt/ymatrix/matrixdb6/bin/supervisorctl status

应存在名为 subscriber_<db_cluster_id>publisher_<db_cluster_id> 的进程,且处于 Running 状态。可以检查日志文件,确认没有异常日志。

5.1.3 检查备份集群侧 Subscriber 和 Publisher

在备份集群侧 pubsub 主机,以 mxadmin 用户身份执行:

/opt/ymatrix/matrixdb6/bin/supervisorctl status

应存在名为 subscriber_<db_cluster_id>publisher_<db_cluster_id> 的进程,且处于 Running 状态。可以检查日志文件,确认没有异常日志。

5.1.4 检查备份集群 walreceiver

在备份集群各个机器,以 root 用户身份执行:

ps aux | grep postgres | grep walreceiver

应存在与 Subscriber 连接的进程,且进程处于 streaming 状态。备份集群中,与 Publisher 连接的 walreceiver 进程数量总和应与原集群 shard 数量相同。

5.1.5 (可选)检查备份集群内部复制进程

如果备份集群部署了 standby 和 mirror,备份集群内的 master 到 standby、primary 到 mirror 同样使用 walsender 和 walreceiver 进行备份。

在备份集群各个机器,以 root 用户身份执行:

ps aux | grep postgres | grep walsender
ps aux | grep postgres | grep walreceiver

确认备份集群内部存在对应的 walsender 和 walreceiver 进程,并按部署规划核对 master 到 standby、primary 到 mirror 的复制关系。

5.2 验证数据同步

  1. 分别连接主集群和备份集群的 master,以具备查询权限的用户执行:

    SELECT * FROM gp_segment_configuration ORDER BY content, dbid;

检查两者结果是否一致。

  1. 连接主集群 master,创建测试库:

    CREATE DATABASE test_dr;
  2. 连接主集群的 test_dr 库,创建测试表:

    CREATE TABLE test_1(c int) DISTRIBUTED BY (c);
  3. 向测试表插入数据:

    INSERT INTO test_1 SELECT * FROM generate_series(0,999);
  4. 分别连接主集群和备份集群的 test_dr 库,执行:

    SELECT gp_segment_id, count(1) FROM test_1 GROUP BY gp_segment_id;

检查两者结果是否一致。

5.3 观察 restore point 应用情况

restore_point_creation_interval 控制创建 restore point 的时间间隔,默认值为 60s。观察日志时,应按显式配置值或默认值判断 restore point 生成间隔是否符合预期。观察期间可以向数据库持续插入数据。

  1. 在 Subscriber 日志中检查全局 restore point 创建记录。

日志路径以 /etc/matrixdb6/service/subscriber_<db_cluster_id>.conf 中的 stdout_logfile 配置为准。按该路径执行:

grep "Created global restore point" <subscriber_log_file>

应有输出,日志时间间隔应与配置的 restore point 间隔相同。

  1. 在主集群各 primary 数据目录的 log 目录中检查 restore point 创建记录:

    grep "restore point" *.csv | grep "created at"

应有输出,表明主集群在 Subscriber 控制下定期创建 restore point。

  1. 在备份集群 master 数据目录的 log 目录中检查 WAL 回放到 restore point 的记录:

    grep "cluster wide WAL replayed to global restore point" *.csv

应有输出,显示备份集群已经将 WAL 播放到某个 restore point。

  1. 检查备份集群 WAL 播放进度。分别连接到备份集群 master 和各个 primary,使用 utility 模式 PGOPTIONS='-c gp_role=utility',在每个对应实例上执行:

    SHOW mx_redo_stop_pit;
    SELECT pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn();

预期结果:

  • pg_last_wal_replay_lsn 始终小于等于 mx_redo_stop_pit
  • pg_last_wal_receive_lsn 大于等于 mx_redo_stop_pit

上述结果表明备份集群通过 Subscriber 和 Publisher 读取到主集群生成的 restore point,并已生效。

6 运维监控

6.1通过 SQL 查看状态

主集群相关 system catalog 包括:

  • pg_catalog.gp_replication_slots
  • pg_catalog.gp_stat_replication

DR 使用的 replication slot 名称为:

internal_disaster_recovery_rep_slot

在主集群上,使用具备对应权限的用户(如 mxadmin)查询 replication slot:

SELECT *
FROM pg_catalog.gp_replication_slots
WHERE slot_name = 'internal_disaster_recovery_rep_slot'
ORDER BY gp_segment_id;

查询 replication 状态:

SELECT *
FROM
    pg_catalog.gp_replication_slots s
LEFT JOIN
    pg_catalog.gp_stat_replication r
ON
    s.gp_segment_id = r.gp_segment_id AND s.active_pid = r.pid
WHERE s.slot_name = 'internal_disaster_recovery_rep_slot'
ORDER BY s.gp_segment_id;

备份集群相关 system catalog 为:

  • pg_catalog.gp_stat_wal_receiver

在备份集群上,使用具备对应权限的用户(如 mxadmin)查询 walreceiver 状态:

SELECT *
FROM pg_catalog.gp_stat_wal_receiver
WHERE slot_name = 'internal_disaster_recovery_rep_slot'
ORDER BY gp_segment_id;

7 运维补充说明

7.1 动态开启和关闭 pprof

Subscriber 和 Publisher 的性能诊断接口通过配置项 perf_port 提供监听端口,但 pprof 路径默认关闭。

在 Subscriber 或 Publisher 所在机器上,向目标进程发送 SIGUSR2 可以开关 /debug/pprof

kill -USR2 <pid>

开关规则如下:

  • 第一次发送 SIGUSR2:开启 /debug/pprof
  • 第二次发送 SIGUSR2:关闭 /debug/pprof

访问示例:

  • Subscriber:http://<host>:5587/debug/pprof/
  • Publisher:http://<host>:6698/debug/pprof/

注意!

建议仅在排查问题时临时开启 pprof,避免长期暴露诊断接口。

7.2 处理备份集群内部副本故障

本节说明备份集群内部副本故障时的处理方式。这里的操作发生在备份集群仍作为 DR 集群运行时,目标是维持从主集群持续接收和回放 WAL 的能力。

本节示例命令在备份集群 master 机器上以 mxadmin 用户身份执行;如果现场交付规范另有要求,请按现场规范执行。

相关命令用途如下:

命令 用途
mxdr failover 当前 DR master 或 DR primary 的数据目录不可恢复,短时间内无法继续承担备份任务时,将同 shard 内的 standby 或 mirror 提升为新的 DR master 或 DR primary。
mxdr rebuild 某个 standby 或 mirror 数据目录损坏,或 failover 后旧 master 或 primary 修复完成后,用当前健康副本重新构建目标副本。
mxdr rebalance failover 和 rebuild 完成后,当前运行角色与部署规划中的 preferred role 不一致,集群状态为OK_UNBALANCED 时,将角色分布恢复到部署规划。

7.2.1 进程异常但数据目录可用

DR primary 或 DR master 异常会影响对应 shard 的 WAL 接收和回放,还会导致主集群侧 WAL 堆积,应优先恢复。DR mirror 或 DR standby 异常通常不影响当前同步,但会降低备份集群内部高可用能力。

如果只是 DR primary、DR mirror、DR master 或 DR standby 进程异常退出,且数据目录仍然可用,优先使用 mxstopmxstart 重新拉起:

# 停止集群
mxstop -a -f

# 启动集群
mxstart -a

7.2.2 DR mirror 或 DR standby 数据不可恢复

如果 DR mirror 或 DR standby 的磁盘文件损坏,无法通过重启恢复,但当前 DR primary 或 DR master 健康,应执行 mxdr rebuild,从对应健康 primary 或 master 重新构建副本:

# 执行 mxdr rebuild,修复损坏的 mirror 或 standby
mxdr rebuild -s <shard_id>

7.2.3 DR primary 数据不可恢复

如果 DR primary 数据目录损坏,无法继续接收和回放 WAL,需要先停止备份集群,执行 mxdr failover,让同 shard 的 mirror 接管数据同步;故障 primary 修复后执行 mxdr rebuild;如果集群进入 OK_UNBALANCED,再执行 mxdr rebalance 恢复 preferred role。如果 DR master 数据目录不可恢复,也属于 mxdr failover 的适用范围。

# 停止集群
mxstop -a

# 执行 mxdr failover,让备机暂时接管
mxdr failover -s <shard_id>

# 启动集群
mxstart -a

# 执行 mxdr rebuild,修复故障的备机
mxdr rebuild -s <shard_id>

# 执行 mxdr rebalance,恢复集群角色
mxdr rebalance

7.3 灾难发生时进行主备切换

7.3.1 切换前提和操作位置

本节适用于主集群侧所有机器物理不可用的灾难场景。此时只能在备份集群侧进行操作。

主备切换会将备份集群提升为正常服务集群。切换前,请确认需要由备份集群承接数据库服务。

7.3.2 执行 mxdr switch

在备份集群 master 机器,以 mxadmin 用户身份执行:

mxdr switch

命令运行过程中,会出现二次确认:

Continue promoting cluster for disaster recovery to normal cluster? Yy|Nn (default=N):

可以添加 -a 选项跳过确认:

mxdr switch -a

7.3.3 可选:停止 Publisher 和停止 Subscriber

切换完成后,在 Publisher 机器,以 mxadmin 用户身份先执行:

/opt/ymatrix/matrixdb6/bin/supervisorctl status

获取 supervisor 管理的 Publisher 名称,例如 publisher_<db_cluster_id>

停止 Publisher:

/opt/ymatrix/matrixdb6/bin/supervisorctl stop publisher_<db_cluster_id>

再次检查状态:

/opt/ymatrix/matrixdb6/bin/supervisorctl status

确认 Publisher 状态变为 exited。

Subscriber 也可选停止,操作方式与 Publisher 相同。

7.4 切换后的原主集群恢复

7.4.1 mxdr recover 使用场景

备份集群已经通过 mxdr switch 提升为正常服务集群后,如果原主集群所在环境恢复,且希望让原主集群重新加入灾备关系,作为同步到新主的集群继续运行,可以使用 mxdr recover

使用 mxdr recover 时,原主集群的数据仍应可用,集群状态仍能恢复为完全正常状态。

在原主集群降级为从其他集群同步的集群时,各个数据库节点的 pg_hba.conf 规则会重置为集群初始化时的状态。如果用户手动配置过 master 的 pg_hba.conf 规则,需要在降级完成后重新配置。

7.4.2 前置条件和执行步骤

mxdr recover 命令格式如下:

mxdr recover [-a]

参数说明:

  • -a, --no-prompt:跳过确认提示。未指定时会提示是否将普通集群转换为同步到其 DR 集群。

执行前请确认以下条件:

  1. 当前集群不能是 DR 集群。命令在原主集群侧执行;如果当前集群仍是 DR 角色,命令会拒绝执行。
  2. 当前集群状态必须为 Dead。如果状态不是 Dead,命令错误提示会要求先执行 mxstop -a -f
  3. 当前集群必须是 balanced 状态。如果当前集群 unbalanced,需要先处理角色分布问题。

操作步骤:

  1. 修复原主集群环境,使原主集群状态满足 mxdr recover 要求。
  2. 在原主集群上执行 mxdr recover 命令。

如需跳过确认提示,执行:

mxdr recover -a

7.5 切换后的数据库集群使用

灾难恢复切换后,备份集群的 YMatrix 数据库集群切换为正常服务角色。此时其使用方式与正常 YMatrix 数据库集群没有区别。使用数据库服务的应用可以切换连接至此集群以继续服务。

8 命令参考

8.1 mxdr

mxdr 用于运行 Subscriber 和 Publisher,以及控制备份数据库集群切换。

Tools for MatrixDB stream replication.

Usage:
  mxdr [flags]
  mxdr [command]

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  failover    Fail over within disaster recovery cluster
  help        Help about any command
  rebalance   Rebalance disaster recovery cluster
  rebuild     Rebuild old primary or master after disaster recovery failover
  recover     Convert a normal cluster to synchronize with its DR cluster
  switch      Promote disaster recovery cluster

Flags:
  -c, --config-file string   path of the configuration file to start up
  -h, --help                 help for mxdr
  -s, --shard-cnt int        number of shards of the source database cluster
  -v, --version              version for mxdr

Use "mxdr [command] --help" for more information about a command.

可使用以下命令查看子命令完整参数:

mxdr <command> --help

8.2 mxbox deployer dr

mxbox deployer dr 用于部署灾难恢复组件和备份集群。

Disaster recovery deployer

Usage:
  mxbox deployer dr [command]

Available Commands:
  pub         Publisher deployer for dr

Flags:
  -h, --help   help for dr

Use "mxbox deployer dr [command] --help" for more information about a command.

mxbox deployer dr pub 用于部署 Publisher、Subscriber 和备份集群。

Publisher deployer for dr

Usage:
  mxbox deployer dr pub [command]

Available Commands:
  config      Generate a config template file
  plan        Generate plan for migrating host.
  setup       Execute steps to deploy physical publisher.

Flags:
  -h, --help   help for pub

Use "mxbox deployer dr pub [command] --help" for more information about a command.

可使用以下命令查看完整帮助:

mxbox deployer dr --help
mxbox deployer dr pub --help
mxbox deployer dr pub <command> --help

9 已知问题

9.1 不支持增加分片的集群扩容

目前 DR 尚未支持数据库集群拓扑发生变化的情况,因此不支持增加分片的集群扩容。

9.2 不支持 tablespace

需要开启 DR 的集群不要使用 tablespace 功能。

9.3 备份集群只读查询结果不保证任意时刻一致

备份集群的数据一致性只在全局一致性点处有效。

备份集群在灾难发生后进行主备切换时,会切换至一个全局一致性点,以保证备份数据的最终一致性。

在数据备份过程中,备份集群虽然支持只读查询,但由于各个数据分片的日志播放同步粒度只控制在全局一致性点的位置,并不能保证任意时刻查询结果正确。