注册
DMDPC 集群部署实录:从零跑通 1 MP + 1 SP + 2 BP
专栏/技术分享/ 文章详情 /

DMDPC 集群部署实录:从零跑通 1 MP + 1 SP + 2 BP

济楚 2026/07/17 229 0 0
摘要

第一次部署 DMDPC,最容易犯的错误是直接上多副本、跨机房拓扑。节点一多,问题会同时出现在端口、注册顺序、归档和数据初始化上,很难知道究竟是哪一步出了问题。本文意在用单副本命令行路径跑通一个可运行的 DMDPC 集群。拓扑是 1 MP + 1 SP + 2 BP:它已经能展示分区落在不同 BP、SQL 由 SP 调度的基本形态;但不具备 MP 或 BP 的高可用能力,不能直接作为生产方案

官方把最小集群定义为 1 MP、1 SP、1 BP;同时也指出,至少两个 BP 才方便观察子任务的计划和调度。因此本文选择两个 BP。

1. 认识实例

flowchart LR
  APP["客户端"] --> SP["SP1\nSQL 接入与调度"]
  SP --- MP["MP\n元数据服务"]
  SP --> BP1["BP1 / RAFT_1\n数据分片 1"]
  SP --> BP2["BP2 / RAFT_2\n数据分片 2"]
  • SP:对外接收 SQL、生成和调度执行计划。业务连接应始终指向 SP。
  • BP:保存业务数据并执行 SP 下发的子任务。这里的 BP1、BP2 分属两个单副本 RAFT 组,保存不同数据分片。
  • MP:保存集群元数据,负责让 SP、BP 找到彼此。它必须先启动并在集群运行期间保持可用。

不要把 RAFT_1RAFT_2 理解为“两个备库”。它们在本例中是两份不同数据的存储位置,每个组只有一个 BP;因此任一 BP 故障都会使对应数据分片不可用。

2. 方案与端口规划

下面是一份单机演示规划。多机时,只需将各实例放到对应主机,并替换内、外网 IP;实例名、实例端口和 AP 端口仍必须全局唯一。

RAFT 组 角色 实例名 PORT_NUM AP_PORT_NUM 数据目录
RAFT_SP1 SP SP1 5236 6000 <DATA_ROOT>/sp1
RAFT_1 BP BP1 5237 6001 <DATA_ROOT>/bp1
RAFT_2 BP BP2 5238 6002 <DATA_ROOT>/bp2
MP_RAFT MP MP 5239 6003 <DATA_ROOT>/mp

部署前确认:

  1. DM8 软件已安装,dminitdmserverdisql 可执行;
  2. 四个数据目录均为空且属于运行数据库的用户;
  3. 四个 PORT_NUM 与四个 AP_PORT_NUM 不冲突,防火墙已放通多机间所需端口;
  4. MP.INI 另选一个不与任何 AP_PORT_NUM 冲突的 MP 通信端口。本文用 <MP_PORT> 表示它。

3. 第一步:初始化四个角色实例

在目标主机分别执行初始化。口令仅作占位,必须替换为符合本单位安全规范的值,且不要把真实口令写进脚本仓库或命令历史。

dminit path=<DATA_ROOT>/sp1 instance_name=SP1 \ port_num=5236 ap_port_num=6000 dpc_mode=SP \ SYSDBA_PWD=<SYSDBA_PASSWORD> SYSAUDITOR_PWD=<SYSAUDITOR_PASSWORD> dminit path=<DATA_ROOT>/bp1 instance_name=BP1 \ port_num=5237 ap_port_num=6001 dpc_mode=BP \ SYSDBA_PWD=<SYSDBA_PASSWORD> SYSAUDITOR_PWD=<SYSAUDITOR_PASSWORD> dminit path=<DATA_ROOT>/bp2 instance_name=BP2 \ port_num=5238 ap_port_num=6002 dpc_mode=BP \ SYSDBA_PWD=<SYSDBA_PASSWORD> SYSAUDITOR_PWD=<SYSAUDITOR_PASSWORD> dminit path=<DATA_ROOT>/mp instance_name=MP \ port_num=5239 ap_port_num=6003 dpc_mode=MP \ SYSDBA_PWD=<SYSDBA_PASSWORD> SYSAUDITOR_PWD=<SYSAUDITOR_PASSWORD>

DPC_MODE 在初始化时确定角色。BP 不能事后靠修改配置文件变为 MP 或 SP;角色或端口规划错了,通常应重新初始化该实例,而不是带病继续。

4. 第二步:让所有节点认识 MP

在 MP、SP1、BP1、BP2 的 DAMENG 目录中各放一份内容一致的 MP.INI

mp_host = <MP_HOST> mp_port = <MP_PORT>

MP.INI 不是应用连接串,而是 DPC 节点定位元数据服务的内部配置。单 MP 环境中,四个实例的内容应完全一致;mp_port 不能与任一实例的 AP_PORT_NUM 冲突。

5. 第三步:只启动 MP,并在 MP 上注册整个拓扑

先启动 MP:

dmserver <DATA_ROOT>/mp/DAMENG/dm.ini dpc_mode=MP

然后连接 MP。注意:此刻 SP 和 BP 还不能启动。注册操作必须在已登录的 MP 上进行,且必须先注册当前 MP 自身,再注册其他实例。

-- 连接 MP 后执行。IP、端口必须与初始化和网络规划一致。 -- 1. 注册当前 MP;RAFT 名可写 NULL 或 MP_RAFT SP_CREATE_DPC_INSTANCE(NULL, 'MP', 'MP', 6003, 5239, '<MP_INTERNAL_IP>', '<MP_EXTERNAL_IP>', 'NORMAL', 1, 'MP instance'); -- 2. 注册两个 BP RAFT 组及其唯一成员 SP_CREATE_DPC_RAFT('BP', 'RAFT_1'); SP_CREATE_DPC_INSTANCE('RAFT_1', 'BP1', 'BP', 6001, 5237, '<BP1_INTERNAL_IP>', '<BP1_EXTERNAL_IP>', 'NORMAL', 1, 'BP instance'); SP_CREATE_DPC_RAFT('BP', 'RAFT_2'); SP_CREATE_DPC_INSTANCE('RAFT_2', 'BP2', 'BP', 6002, 5238, '<BP2_INTERNAL_IP>', '<BP2_EXTERNAL_IP>', 'NORMAL', 1, 'BP instance'); -- 3. 用 BP 组收纳两个可用的数据 RAFT 组 SP_CREATE_DPC_BP_GROUP('BG_1', 'bp group 1'); SP_BP_GROUP_ADD_RAFT('BG_1', 'RAFT_1'); SP_BP_GROUP_ADD_RAFT('BG_1', 'RAFT_2'); -- 4. SP 也需要注册到一个 SP 类型 RAFT 组 SP_CREATE_DPC_RAFT('SP', 'RAFT_SP1'); SP_CREATE_DPC_INSTANCE('RAFT_SP1', 'SP1', 'SP', 6000, 5236, '<SP1_INTERNAL_IP>', '<SP1_EXTERNAL_IP>', 'NORMAL', 2, 'SP instance');

这一步的顺序:先由 MP 记录集群拓扑,SP、BP 才能以已登记成员的身份第一次加入。 官方明确要求 SP、BP 加入集群的步骤必须发生在它们首次启动之前。注册后立即检查,确认两个 BP RAFT 组、一个 SP RAFT 组、BP 组和四个实例都已写入元数据:

SELECT * FROM DPC_BP_GROUP; SELECT * FROM DPC_BP_RAFT; SELECT * FROM DPC_INSTANCE;

6. 第四步:启动 SP 与 BP,最后从 SP 验收

完成注册后,SP 与两个 BP 的启动没有先后顺序:

dmserver <DATA_ROOT>/sp1/DAMENG/dm.ini dpc_mode=SP dmserver <DATA_ROOT>/bp1/DAMENG/dm.ini dpc_mode=BP dmserver <DATA_ROOT>/bp2/DAMENG/dm.ini dpc_mode=BP

一个正常的单副本 DPC 集群应同时满足:

  • MP、SP、BP 均已启动且处于 OPEN
  • DPC_INSTANCE 中能看到已注册的四个实例;
  • 在 SP 上查询 V$INSTANCE,能看到各 RAFT 组中的实例;
  • BP1 和 BP2 都是可用 BP。任一 BP 未启动、宕机或非 OPEN,系统都会缺少可用数据节点。

此后,应用只连接 SP:

<SP1_HOST>:5236

MP 和 BP 仅用于监控或维护。官方特别提示,不要在 MP 或 BP 上执行大量业务 SQL;部署完成后,正常业务应由 SP 对外提供。

7. 正常停止顺序

正常关闭顺序是:

SP → BP → MP

先停止接入与计算,再停止数据节点,最后停止元数据服务。官方提示,乱序退出可能引发其他节点异常退出;下次启动时需要更多 Redo 处理,恢复时间会更长。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服