第一次部署 DMDPC,最容易犯的错误是直接上多副本、跨机房拓扑。节点一多,问题会同时出现在端口、注册顺序、归档和数据初始化上,很难知道究竟是哪一步出了问题。本文意在用单副本命令行路径跑通一个可运行的 DMDPC 集群。拓扑是 1 MP + 1 SP + 2 BP:它已经能展示分区落在不同 BP、SQL 由 SP 调度的基本形态;但不具备 MP 或 BP 的高可用能力,不能直接作为生产方案。
官方把最小集群定义为 1 MP、1 SP、1 BP;同时也指出,至少两个 BP 才方便观察子任务的计划和调度。因此本文选择两个 BP。
flowchart LR
APP["客户端"] --> SP["SP1\nSQL 接入与调度"]
SP --- MP["MP\n元数据服务"]
SP --> BP1["BP1 / RAFT_1\n数据分片 1"]
SP --> BP2["BP2 / RAFT_2\n数据分片 2"]
不要把 RAFT_1、RAFT_2 理解为“两个备库”。它们在本例中是两份不同数据的存储位置,每个组只有一个 BP;因此任一 BP 故障都会使对应数据分片不可用。
下面是一份单机演示规划。多机时,只需将各实例放到对应主机,并替换内、外网 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 |
部署前确认:
dminit、dmserver、disql 可执行;PORT_NUM 与四个 AP_PORT_NUM 不冲突,防火墙已放通多机间所需端口;MP.INI 另选一个不与任何 AP_PORT_NUM 冲突的 MP 通信端口。本文用 <MP_PORT> 表示它。在目标主机分别执行初始化。口令仅作占位,必须替换为符合本单位安全规范的值,且不要把真实口令写进脚本仓库或命令历史。
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;角色或端口规划错了,通常应重新初始化该实例,而不是带病继续。
在 MP、SP1、BP1、BP2 的 DAMENG 目录中各放一份内容一致的 MP.INI:
mp_host = <MP_HOST>
mp_port = <MP_PORT>
MP.INI 不是应用连接串,而是 DPC 节点定位元数据服务的内部配置。单 MP 环境中,四个实例的内容应完全一致;mp_port 不能与任一实例的 AP_PORT_NUM 冲突。
先启动 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;
完成注册后,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 集群应同时满足:
OPEN;DPC_INSTANCE 中能看到已注册的四个实例;V$INSTANCE,能看到各 RAFT 组中的实例;OPEN,系统都会缺少可用数据节点。此后,应用只连接 SP:
<SP1_HOST>:5236
MP 和 BP 仅用于监控或维护。官方特别提示,不要在 MP 或 BP 上执行大量业务 SQL;部署完成后,正常业务应由 SP 对外提供。
正常关闭顺序是:
SP → BP → MP
先停止接入与计算,再停止数据节点,最后停止元数据服务。官方提示,乱序退出可能引发其他节点异常退出;下次启动时需要更多 Redo 处理,恢复时间会更长。
文章
阅读量
获赞
