Skip to content

高可用架构:达梦的全方位容灾方案

你有没有想过:

数据库的高可用,到底在解决什么问题?

很多人会说:「就是让数据库不宕机呗。」

这话只说对了一半。高可用真正要解决的是:在可控时间内恢复服务,同时最小化数据丢失。

今天,我们来全面了解达梦数据库的高可用架构体系。

高可用的两个核心指标

RTO(Recovery Time Objective):恢复时间目标

从故障发生到服务恢复的最大允许时间。

故障发生 → 检测故障 → 切换/恢复 → 服务上线
    │          │           │          │
    └──────────┴───────────┴──────────┘

              这个时间就是 RTO

RPO(Recovery Point Objective):恢复点目标

允许丢失的最大数据量,以时间衡量。

RPO = 0  →  零数据丢失(同步复制)
RPO = 1h →  允许丢失最多 1 小时的数据(异步复制)
业务场景RTORPO
核心金融系统< 1 分钟0
交易系统< 5 分钟0 或秒级
运营系统< 30 分钟分钟级
报表系统< 1 小时小时级

达梦高可用架构全景图

┌─────────────────────────────────────────────────────────────┐
│                      应用层                                  │
│   ┌─────────────┐    ┌─────────────┐    ┌─────────────┐   │
│   │ 连接池(Druid)│    │ 连接池(Hikari)│   │   JDBC直连  │   │
│   └──────┬──────┘    └──────┬──────┘    └──────┬──────┘   │
│          │                   │                   │          │
│          └───────────────────┼───────────────────┘          │
│                              │                              │
│              ┌───────────────▼───────────────┐             │
│              │        服务名路由(dm_svc)       │             │
│              └───────────────┬───────────────┘             │
└──────────────────────────────┼──────────────────────────────┘

┌──────────────────────────────▼──────────────────────────────┐
│                      高可用集群                                │
│                                                              │
│   ┌──────────────────┐    ┌──────────────────┐               │
│   │   数据守护集群    │    │   读写分离集群    │               │
│   │  (Data Guard)   │    │ (RW Cluster)    │               │
│   │                  │    │                  │               │
│   │  ┌─────────┐    │    │  ┌─────────┐    │               │
│   │  │  主库   │    │    │  │  主库   │    │               │
│   │  └───┬────┘    │    │  └───┬────┘    │               │
│   │      │实时同步 │    │      │          │               │
│   │  ┌───▼────┐    │    │  ┌──▼────┐    │               │
│   │  │ 备库1  │    │    │  │ 备库1  │    │               │
│   │  └───┬────┘    │    │  ├───┬───┤    │               │
│   │      │         │    │  │ 备库2 │    │               │
│   │  ┌───▼────┐    │    │  └───┬───┘    │               │
│   │  │ 备库2  │    │    │      │         │               │
│   │  └────────┘    │    │      ▼         │               │
│   └──────────────────┘    │ 备库N        │               │
│                           └──────────────┘               │
│                                                              │
│   ┌──────────────────┐    ┌──────────────────┐               │
│   │  MPP 大数据集群 │    │  实时应用集群    │               │
│   │                  │    │  (ScaleDB)      │               │
│   │  ┌────┐┌────┐┌────┐│    │                  │               │
│   │  │ EP ││ EP ││ EP ││    │  多主多备集群    │               │
│   │  └──┬─┘└──┬─┘└──┬─┘│    │                  │               │
│   │     │     │     │  │    │                  │               │
│   │  ┌──▼┐┌──▼┐┌───▼─┐│    │                  │               │
│   │  │ DN ││ DN ││ DN  ││    │                  │               │
│   │  └────┘└────┘└─────┘│    └──────────────────┘               │
│   └──────────────────────┘                                     │
└──────────────────────────────────────────────────────────────┘

不同场景的高可用方案

场景一:小型系统(单实例 + 本地备份)

适用:开发测试环境、小型生产系统

成本:低
复杂度:低
RTO:小时级
RPO:天级

方案:
- 单机部署
- 每日全量备份
- 定期异地备份

场景二:中小企业(主备集群 + 本地备份)

适用:一般生产系统

成本:中
复杂度:中
RTO:分钟级
RPO:秒级(同步模式)或分钟级(异步模式)

方案:
- 一主一备或一主两备
- 实时日志同步
- 自动故障切换
- dm_svc.conf 配置服务名

场景三:中大型企业(数据守护 + 读写分离)

适用:有一定并发压力的系统

成本:中高
复杂度:高
RTO:秒级
RPO:秒级

方案:
- 数据守护保证高可用
- 读写分离分担查询压力
- 多个备库提供只读服务
- 应用层连接池 + 服务名自动切换

场景四:大型企业(MPP + 多集群)

适用:大数据量、高并发分析系统

成本:高
复杂度:高
RTO:分钟级
RPO:取决于架构设计

方案:
- MPP 集群处理分析查询
- 主备集群处理 OLTP 业务
- 数据同步中间件打通两个集群
- 多地容灾

高可用架构设计原则

1. 消除单点故障

java
// 应用层:连接池 + 服务名路由
public class HaConnectionDemo {

    public DataSource createHaDataSource() {
        // dm_svc.conf 配置多个节点
        // 连接池自动处理故障切换
        DruidDataSource ds = new DruidDataSource();
        ds.setJdbcUrl("jdbc:dm://DAMENG_SERVICE");  // 使用服务名
        ds.setUsername("SYSDBA");
        ds.setPassword("******");
        ds.setPoolPreparedStatements(true);
        return ds;
    }
}
ini
# dm_svc.conf
DAMENG=(
    192.168.1.10:5236,    # 主库
    192.168.1.11:5236,    # 备库1
    192.168.1.12:5236     # 备库2
)
SWITCH_TIME=3
SWITCH_INTERVAL=10

2. 多层冗余

应用层:多实例部署

网关层:负载均衡

数据库层:主备集群

网络层:双网卡bonding

存储层:RAID / 双活存储

3. 定期演练

sql
-- 高可用演练检查清单
-- 1. 验证备份是否可用
RESTORE DATABASE ... FROM ARCHIVELOG ...;

-- 2. 验证故障切换是否正常
-- 执行主备切换
$ dmasmsvr tool racswitch ...

-- 3. 验证数据一致性
-- 对比主备库数据
SELECT COUNT(*) FROM critical_table;  -- 两边应该一致

-- 4. 验证应用重连
-- 检查应用日志,确认自动重连成功

监控与告警

sql
-- 高可用状态监控
SELECT
    INSTANCE_NAME,
    INSTANCE_ROLE,
    INSTANCE_STATUS,
    UP_TIME
FROM V$INSTANCE;

-- 守护进程状态
SELECT
    GROUP_NAME,
    DW_TYPE,
    DW_MODE,
    DW_STATUS
FROM V$DMRW_CLUSTER;
java
// 高可用监控告警
public class HaMonitor {

    public void monitor() {
        // 检查主库是否可用
        boolean primaryAlive = checkPrimaryAlive();

        // 检查备库同步延迟
        long lag = getReplicationLag();

        // 检查守护进程状态
        boolean guardianAlive = checkGuardianAlive();

        // 综合判断高可用状态
        if (!primaryAlive && !guardianAlive) {
            sendAlert("高可用集群全部故障!");
        } else if (lag > 10000) {
            sendAlert("同步延迟过大: " + lag);
        }
    }
}

面试追问方向

  • 达梦的 RPO 和 RTO 能做到多少?
  • 主备集群和读写分离集群有什么区别?
  • 如何设计一个 RPO=0、RTO<60秒 的高可用方案?

一句话总结

高可用不是一道选择题,而是必答题。RTO 和 RPO 是设计的标尺,架构选型是手段,监控演练是保障。没有银弹,只有适合场景的方案。

基于 VitePress 构建