目录
2.2 在 EP01 和 EP02 上分别安装软件并创建数据库... 5
2.3 在 EP01 和 EP02 上分别准备备库数据... 6
7.1 在dm21机器上配置 dmwatcher.ini 15
7.2 在dm22机器上配置 dmwatcher.ini 16
7.3 分别启动 dm21、dm22 机器上的守护进程... 17
12.3 场景三:将GRP1_MPP_EP01切回到dm21上... 37
DM MPP集群(带交叉守护进程)--安装配置
注:本文旨在说明DM MPP集群基础的安装配置原理实现,理论上的实现。没有数据守护,不可靠,不能用于生产(用于生产应做成交叉守护的方式)
DM MPP系统基本的架构图:
DM MPP 采用完全对等无共享架构,对整个系统来说,每个 EP 作用都是一样的,用户可以连接到其中的任何一个进行操作。而对每个用户会话来说,EP 具有主从之分。用户会话实际连接的那个 EP 对该用户会话来说称为主 EP,其余的 EP 都称为从 EP。
若在 DM MPP 系统的运行过程中,某一 EP 发生故障停机,则整个 MPP 系统将处于不能正常服务的状态。当前所有的用户会话会被系统断开,不能进行全局登录,只能进行本地登录。当前所有的用户会话会被系统断开,不能进行全局登录,只能进行本地登录。因此,为了保证 MPP 系统的高可用性,我们强烈建议采用 DM MPP 与数据守护相结合的部署方案。如下图可靠性方案:
为了提高系统可靠性并节约硬件资源,DM MPP 主备系统可采用交叉守护的方式,即每个 EP 和其对应的备库实例不在同一台主机上,将 EP 与别的 EP 的备库放在一台主机上。
机器配置情况
主机名 | 内网 | 公网 | 角色 |
dm21 | 192.168.0.21 | 192.168.1.21 | 主库 GRP1_MPP_EP01 备库 GRP2_MPP_EP22 |
dm22 | 192.168.0.22 | 192.168.1.22 | 主库 GRP2_MPP_EP02 备库 GRP1_MPP_EP11 |
dm23 | 192.168.0.23 | 无 | 监视器 |
主库信息(因为是不同的主机,所以可以用相同的端口):
PORT_NUM | MAL_INST_DW_PORT | MAL_HOST(内网) | MAL_PORT | MAL_DW_PORT | MPP_SEQNO(MPP 实例序号) | |
GRP1_MPP_EP01 | 5236 | 5243 | 192.168.0.21 | 5337 | 5253 | 0 |
GRP2_MPP_EP02 | 5236 | 5243 | 192.168.0.22 | 5337 | 5253 | 1 |
备库信息(因为是不同的主机,所以可以用相同的端口):
备库实例名 | PORT_NUM | MAL_INST_DW_PORT | MAL_HOST(内网) | MAL_PORT | MAL_DW_PORT | 对应主库实例名 | ||
GRP1_MPP_EP11 | 5237 | 5244 | 192.168.0.22 | 5338 | 5254 | GRP1_MPP_EP01 | ||
GRP2_MPP_EP22 | 5237 | 5244 | 192.168.0.21 | 5338 | 5254 | GRP1_MPP_EP02 | ||
守护进程组信息(一般来说,每个单独的实例都是使用一个单独的守护进程守护。本文档中,由于同一台机器上有不同组的两个实例,我们可以只配置一个守护进程,同时守护两个实例):
组名 | 实例名 | OGUID | 所在机器 |
GRP1 | GRP1_MPP_EP01(主库) | 45330 | |
GRP1_MPP_EP11(备库) | 192.168.0.22 | ||
GRP2 | GRP2_MPP_EP02 (主库) | 45331 | 192.168.0.22 |
GRP2_MPP_EP22 (备库) | 192.168.0.21 |
说明:一个守护进程组对应一套主备库!我这里只配置一个守护进程,两个组!
数据存放规划(采取机器交叉的方式配置两个备数据库,为了区分用了/dm/data/EP01BAK)
主库实例名 | 主库存放的数据位置 | 对应的备库实例名 | 备库存放主库数据的位置 |
GRP1_MPP_EP01 | 位于主机dm21的:/dm/data/EP01目录中 | GRP2_MPP_EP11 | 位于主机dm22的:/dm/data/EP01BAK目录中 |
GRP1_MPP_EP02 | 位于主机dm22的:/dm/data/EP02目录中 | GRP2_MPP_EP12 | 位于主机dm21的:/dm/data/EP02BAK目录中 |
注意:DM MPP 各 EP 使用的 DM 服务器版本应一致,同时还应注意各 EP 所在主机的操作系统位数、大小端模式、时区及时间设置都应一致,否则可能造成意想不到的错误。
建库要求:在各 EP 上创建数据库时,要求有些初始化参数必须所有 EP 都相同,见《DM8大规模并行处理MPP.pdf》3.3.1 节表 3.3。我们建议各 EP 的数据库初始化参数都保持一致,以免产生错误。
DM软件安装步骤略,机器事先都安装了 DM,安装路径为’/dm/dmdbms/’,执行程序保存在’ /dm/dmdbms/bin’目录中,数据存放路径为’/dm/data/EP01’, ’/dm/data/EP02’。
这里只初始化实例和库。
在两个节点上分做如下一样的操作(初始化参数必须相同BLANK_PAD_MODE=0 LENGTH_IN_CHAR=0 USE_NEW_HASH=1):
节点1上(主库):
/dm/dmdbms/bin/dminit path=/dm/data/EP01 BLANK_PAD_MODE=0 LENGTH_IN_CHAR=0 USE_NEW_HASH=1 DB_NAME=mppdb INSTANCE_NAME=GRP1_MPP_EP01
节点2上(主库):
/dm/dmdbms/bin/dminit path=/dm/data/EP02 BLANK_PAD_MODE=0 LENGTH_IN_CHAR=0 USE_NEW_HASH=1 DB_NAME=mppdb INSTANCE_NAME=GRP2_MPP_EP02
注意:DB_NAME是一样的(因为是同一个库嘛),但是INSTANCE_NAME是不一样的(当然也可以一样,因为是不同的主机嘛),为了区分。
我这里用如下方法来分别准备两个备库数据:
1)、主库脱机备份
[dmdba@dm21 ~]$ mkdir -p /dm/bakup
[dmdba@dm21 ~]$ dmserver /dm/data/EP01/mppdb/dm.ini
输入exit正常退出。
注:dmrman备份,必须要启动过一次的数据库才能备份,否则报错!此时将上边初始化的库启一次再备即可。此处还没有做成服务,故做一次前台启动,然后关之,再备。
[dmdba@dm21 ~]$ dmrman CTLSTMT="BACKUP DATABASE '/dm/data/EP01/mppdb/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm/bakup/bakup_full01'"
[dmdba@dm21 ~]$ ls -l /dm/bakup/*
total 5952
-rw-r--r-- 1 dmdba dinstall 6010368 Apr 18 09:58 bakup_full01.bak
-rw-r--r-- 1 dmdba dinstall 78336 Apr 18 09:58 bakup_full01.meta
[dmdba@dm22 ~]$ mkdir -p /dm/bakup/
[dmdba@dm22 ~]$ scp -r dmdba@192.168.0.21:/dm/bakup/* /dm/bakup/
2)备库执行脱机数据库还原与恢复
[dmdba@dm22 ~]$ dmrman CTLSTMT="RESTORE DATABASE to '/dm/data/EP01BAK/mppdb' FROM BACKUPSET '/dm/bakup/bakup_full01'"
[dmdba@dm22 ~]$ grep -i EP01BAK /dm/data/EP01BAK/mppdb/dm.ini
CTL_PATH = /dm/data/EP01BAK/mppdb/dm.ctl #ctl file path
CTL_BAK_PATH = /dm/data/EP01BAK/mppdb/ctl_bak #dm.ctl backup path
SYSTEM_PATH = /dm/data/EP01BAK/mppdb #system path
CONFIG_PATH = /dm/data/EP01BAK/mppdb #config path
TEMP_PATH = /dm/data/EP01BAK/mppdb #temporary file path
BAK_PATH = /dm/data/EP01BAK/mppdb/bak #backup file path
[dmdba@dm22 ~]$
可以看到restore后dm.ini中改了相关目录。
因为脱机备份没有产生任何 REDO 日志,所以此处省略恢复数据库的操作步骤。
[dmdba@dm22 ~]$ mkdir -p /dm/data/EP01BAK/mppdb/bak && mkdir -p /dm/data/EP01BAK/mppdb/ctl_bak
[dmdba@dm22 ~]$ dmrman CTLSTMT="RECOVER DATABASE '/dm/data/EP01BAK/mppdb/dm.ini' UPDATE DB_MAGIC"
注意: 主库传送日志时会判断永久魔数(permanent_magic这个值是否一样,确保是来自同一个数据守护环境中的库,否则传送不了日志。
SELECT PERMANENT_MAGIC;--数据库永久魔数
SELECT DB_MAGIC FROM V$RLOG;--数据库魔数
修改EP01的dm.ini配置
[dmdba@dm21 ~]$ vi /dm/data/EP01/mppdb/dm.ini
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME = GRP1_MPP_EP01
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
MPP_INI = 1 #启用 MPP 配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致。
[dmdba@dm21 ~]$ vi /dm/data/EP01/mppdb/dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_MPP_EP01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.0.21 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5337 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.1.21 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 5253 #实例对应的守护进程监听 TCP 连接的端口,其他守护进程或监视器使用 MAL_HOST + MAL_DW_PORT 创建与该实例守护进程的 TCP 连接
MAL_INST_DW_PORT = 5243 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP2_MPP_EP02
MAL_HOST = 192.168.0.22
MAL_PORT = 5337
MAL_INST_HOST = 192.168.1.22
MAL_INST_PORT = 5236
MAL_DW_PORT = 5253
MAL_INST_DW_PORT = 5243
[MAL_INST3]
MAL_INST_NAME = GRP1_MPP_EP11
MAL_HOST = 192.168.0.22
MAL_PORT = 5338
MAL_INST_HOST = 192.168.1.22
MAL_INST_PORT = 5237
MAL_DW_PORT = 5254
MAL_INST_DW_PORT = 5244
[MAL_INST4]
MAL_INST_NAME = GRP2_MPP_EP22
MAL_HOST = 192.168.0.21
MAL_PORT = 5338
MAL_INST_HOST = 192.168.1.21
MAL_INST_PORT = 5237
MAL_DW_PORT = 5254
MAL_INST_DW_PORT = 5244
当前实例 GRP1_MPP_EP01 是主库,需要向 MPP 备库 GRP1_MPP_EP11(192.168.0.22) 同步数据,因此实时归档的 ARCH_DEST 配置为 GRP1_MPP_EP11。
[dmdba@dm21 ~]$ mkdir /dm/arch/{EP01,EP02BAK}
[dmdba@dm21 ~]$ vi /dm/data/EP01/mppdb/dmarch.ini
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_MPP_EP11 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm/arch/EP01 #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
dmmpp.ctl 是二进制文件,由 dmmpp.ini 文本通过 dmctlcvt 工具转换而来。MPP 系统中所有 EP 的 dmmpp.ctl 完全相同。
[dmdba@dm21 ~]$ vi /dm/data/EP01/mppdb/dmmpp.ini
[service_name1]
mpp_seq_no = 0
mpp_inst_name = GRP1_MPP_EP01
[service_name2]
mpp_seq_no = 1
mpp_inst_name = GRP2_MPP_EP02
然后再用dmctlcvt工具转换成dmmpp.ctl文件。
dmctlcvt TYPE=2 SRC=/dm/data/EP01/mppdb/dmmpp.ini DEST=/dm/data/EP01/mppdb/dmmpp.ctl
[dmdba@dm21 ~]$ /dm/dmdbms/bin/dmserver /dm/data/EP01/mppdb/dm.ini mount
注意:一定要以 Mount 方式启动数据库实例,否则系统启动时会重构回滚表空间,生成 Redo 日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主备库的数据一致性。数据守护配置结束后,守护进程会自动 Open 数据库。
启动命令行工具 DIsql,使用 MPP 类型为 LOCAL 方式,登录主库设置 OGUID 值。
[dmdba@dm21 ~]$ disql sysdba/SYSDBA:5236#"{MPP_TYPE=LOCAL}"
Server[LOCALHOST:5236]:mode is normal, state is mount
login used time : 2.105(ms)
disql V8
SQL>
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(45330);
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
注意:系统通过 OGUID 值确定一个守护进程组,由用户保证 OGUID 值的唯一性,并
确保数据守护系统中,数据库、守护进程和监视器配置相同的 OGUID 值。
SQL>alter database primary;
[dmdba@dm22 ~]$ vi /dm/data/EP02/mppdb/dm.ini
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME = GRP2_MPP_EP02
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
MPP_INI = 1 #启用 MPP 配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
将实 例 GRP1_MPP_EP01 配置的 dmmal.ini 拷 贝 到/dm/data/EP02/mppdb/ 目录中。
[dmdba@dm22 ~]$ scp dmdba@192.168.0.21:/dm/data/EP01/mppdb/dmmal.ini /dm/data/EP02/mppdb/
当前实例 GRP2_MPP_EP02 是主库,需要向 MPP 备库 GRP2_MPP_EP22 (192.168.0.21)同步数据,因此实时归档的 ARCH_DEST 配置为 GRP2_MPP_EP22。
[dmdba@dm22 ~]$ mkdir /dm/arch/{EP02,EP01BAK}
[dmdba@dm22 ~]$ vi /dm/data/EP02/mppdb/dmarch.ini
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP2_MPP_EP22 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm/arch/EP02 #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
[dmdba@dm22 ~]$ scp dmdba@192.168.0.21:/dm/data/EP01/mppdb/dmmpp.ctl /dm/data/EP02/mppdb/
[dmdba@dm22 ~]$ /dm/dmdbms/bin/dmserver /dm/data/EP02/mppdb/dm.ini mount
启动命令行工具 DIsql,使用 MPP 类型为 LOCAL 方式,登录主库设置 OGUID 值。
[dmdba@dm22 ~]$ disql sysdba/SYSDBA:5236#"{MPP_TYPE=LOCAL}"
Server[LOCALHOST:5236]:mode is normal, state is mount
login used time : 2.105(ms)
disql V8
SQL>
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(45331);
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
SQL>alter database primary;
是GRP1_MPP_EP01主库对应的备库,是在192.168.0.22主机上进行配置,目录位置是:/dm/data/EP01BAK
[dmdba@dm22 ~]$ vi /dm/data/EP01BAK/mppdb/dm.ini
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME = GRP1_MPP_EP11
PORT_NUM = 5237 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
MPP_INI = 1 #打开 MPP 配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志重演信息
[dmdba@dm22 ~]$ scp dmdba@192.168.0.21:/dm/data/EP01/mppdb/dmmal.ini /dm/data/EP01BAK/mppdb/
[dmdba@dm22 ~]$ vi /dm/data/EP01BAK/mppdb/dmarch.ini
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_MPP_EP01 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm/arch/EP01BAK/ #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
[dmdba@dm22 ~]$ scp dmdba@192.168.0.21:/dm/data/EP01/mppdb/dmmpp.ctl /dm/data/EP01BAK/mppdb/
[dmdba@dm22 ~]$ /dm/dmdbms/bin/dmserver /dm/data/EP01BAK/mppdb/dm.ini mount
启动命令行工具 DIsql,登录备库设置 OGUID 值。
[dmdba@dm22 ~]$ disql sysdba/SYSDBA:5237
Server[LOCALHOST:5237]:mode is normal, state is mount
login used time : 1.677(ms)
disql V8
SQL>
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(45330);
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
[dmdba@dm22 ~]$ disql sysdba/SYSDBA:5237
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
ALTER DATABASE STANDBY;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
是GRP2_MPP_EP02主库对应的备库,是在192.168.0.21主机上进行配置,目录位置是:/dm/data/EP02BAK
[dmdba@dm21 ~]$ vi /dm/data/EP02BAK/mppdb/dm.ini
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME = GRP2_MPP_EP22
PORT_NUM = 5237 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
MPP_INI = 1 #打开 MPP 配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志重演信息
- 配置 dmmal.ini
[dmdba@dm21 ~]$ cp /dm/data/EP01/mppdb/dmmal.ini /dm/data/EP02BAK/mppdb/
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP2_MPP_EP02 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm/arch/EP02BAK #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
[dmdba@dm21 ~]$ cp /dm/data/EP01/mppdb/dmmpp.ctl /dm/data/EP02BAK/mppdb/
[dmdba@dm21 ~]$ /dm/dmdbms/bin/dmserver /dm/data/EP02BAK/mppdb/dm.ini mount
[dmdba@dm21 ~]$ disql sysdba/SYSDBA:5237
Server[LOCALHOST:5237]:mode is normal, state is mount
login used time : 2.013(ms)
disql V8
SQL>
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(45331);
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
[dmdba@dm21 ~]$ disql sysdba/SYSDBA:5237
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
ALTER DATABASE STANDBY;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
一般来说,每个单独的实例都是使用一个单独的守护进程守护。本文档中,由于同一台机器上有不同组的两个实例,我们可以只配置一个守护进程,同时守护两个实例。
如下配置:
组名 | 实例名 | OGUID | 所在机器 |
GRP1 | GRP1_MPP_EP01(主库) | 45330 | 192.168.0.21 |
GRP1_MPP_EP11(备库) | 192.168.0.22 | ||
GRP2 | GRP2_MPP_EP02 (主库) | 45331 | 192.168.0.22 |
GRP2_MPP_EP22 (备库) | 192.168.0.21 |
说明:一个守护进程组对应一套主备库!我这里只配置一个守护进程,两个组!启动守护进程的配置文件dmwatcher.ini都放在主库上的/dm/data/EP01/mppdb/和/dm/data/EP02/mppdb/目录下。
配置为全局守护类型,使用自动切换模式。
[dmdba@dm21 ~]$ vi /dm/data/EP01/mppdb/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 45330 #守护系统唯一 OGUID 值
INST_INI = /dm/data/EP01/mppdb/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
[GRP2]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 45331 #守护系统唯一 OGUID 值
INST_INI = /dm/data/EP02BAK/mppdb/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
配置为全局守护类型,使用自动切换模式。
[dmdba@dm22 ~]$ vi /dm/data/EP02/mppdb/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 45330 #守护系统唯一 OGUID 值
INST_INI = /dm/data/EP01BAK/mppdb/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
[GRP2]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 45331 #守护系统唯一 OGUID 值
INST_INI = /dm/data/EP02/mppdb/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
[dmdba@dm21 ~]$ /dm/dmdbms/bin/dmwatcher /dm/data/EP01/mppdb/dmwatcher.ini
[dmdba@dm22 ~]$ /dm/dmdbms/bin/dmwatcher /dm/data/EP02/mppdb/dmwatcher.ini
守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。守护进程开始
广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将
本地实例 Open,并切换为 Open 状态。
实验表明: 我们可以看到,当启一边的watcher时,库是不会到open的,只有两边都完成watcher启动,库才会一起到open!
故障自动切换模式下,必须配置确认监视器,且确认监视器最多只能配置一个。
[dmdba@dm23 ~]$ vi /dm/data/dmmonitor.ini
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /dm/data/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 45330 #组 GRP1 的唯一 OGUID 值
#以下配置为监视器到组 GRP1 的守护进程的连接信息,以―IP:PORT‖的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.0.21:5253
MON_DW_IP = 192.168.0.22:5254
[GRP2]
MON_INST_OGUID = 45331 #组 GRP2 的唯一 OGUID 值
#以下配置为监视器到组 GRP2 的守护进程的连接信息,以―IP:PORT‖的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.0.22:5253
MON_DW_IP = 192.168.0.21:5254
启动监视器
[dmdba@dm23 ~]$ /dm/dmdbms/bin/dmmonitor /dm/data/dmmonitor.ini
需要停止 DM MPP 系统的运行时,只需要停止每个 EP 的 DM 实例即可,没有特别的顺序要求。
另外说明:若在 DM MPP 系统的运行过程中,某一 EP 发生故障停机,则整个 MPP 系统将处于不能正常服务的状态。当前所有的用户会话会被系统断开,不能进行全局登录,只能进行本地登录。当前所有的用户会话会被系统断开,不能进行全局登录,只能进行本地登录。因此,为了保证 MPP 系统的高可用性,我们强烈建议采用 DM MPP 与数据守护相结合的部署方案。
- 理解全局连接与本地连接的区别
理解手册“3.1.5 全局连接与本地连接”
本地连接:disql sysdba/SYSDBA:5236#"{MPP_TYPE=LOCAL}"
[dmdba@dm22 ~]$ disql sysdba/SYSDBA:5236#"{MPP_TYPE=LOCAL}"
Server[LOCALHOST:5236]:mode is primary, state is open
login used time : 3.683(ms)
disql V8
SQL>
SQL> quit
[dmdba@dm22 ~]$ disql sysdba/SYSDBA:5237#"{MPP_TYPE=LOCAL}"
Server[LOCALHOST:5237]:mode is standby, state is open
login used time : 3.975(ms)
disql V8
SQL> quit
[dmdba@dm22 ~]$
全局连接:默认为全局连接,当然也可以:
disql sysdba/SYSDBA:5236#"{MPP_TYPE=GLOBAL}"
[dmdba@dm22 ~]$ disql sysdba/SYSDBA:5237
Server[LOCALHOST:5237]:mode is standby, state is open
login used time : 1.572(ms)
disql V8
SQL> quit
[dmdba@dm22 ~]$ disql sysdba/SYSDBA:5236
Server[LOCALHOST:5236]:mode is primary, state is open
login used time : 3.132(ms)
disql V8
SQL> quit
[dmdba@dm22 ~]$
- 配置通过服务名来连MPP库(全局连接)
我这里通过WINDONS测试:
编辑:Windows 平台下位于%SystemRoot%\system32 目录下的: dm_svc.conf
# dm_svc.conf 文件
# 以#开头的行表示是注释
# 全局配置区
DMMPPDB=(192.168.0.21:5236,192.168.0.22:5236,192.168.0.21:5237,192.168.0.22:5237)
TIME_ZONE=(+480) #表示+8:00 时区
LANGUAGE=(cn)
#DMMPPDB 服务配置区
[DMMPPDB]
SWITCH_TIMES=(60)
SWITCH_INTERVAL=(1000)
EP_SELECTOR=(1)
AUTO_RECONNECT=(1)
#LOGIN_DSC_CTRL=1 #只连集群的主控节点
可以看到我从节点1通过服务名DMMPPDB连到了节点2上边。此时节点2相当于主服务,节点1相当于从了(参手册中的概念:3.1.2 主、从 EP)。另外注意这里是全局连接,用户建立的实际上是与整个 MPP 系统的全局连接。
- MPP使用及基本的功能测试
记住一点:主库5236端口、备库5237端口
show
2022-04-18 17:34:19
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 45330 TRUE AUTO TRUE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.168.0.21 5253 2022-04-18 17:33:29 GLOBAL VALID OPEN GRP1_MPP_EP01 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.1.21 5236 OK GRP1_MPP_EP01 OPEN PRIMARY 0 0 REALTIME VALID 4356 29169 4356 29169 NONE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.168.0.22 5254 2022-04-18 17:33:30 GLOBAL VALID OPEN GRP1_MPP_EP11 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.1.22 5237 OK GRP1_MPP_EP11 OPEN STANDBY 0 0 REALTIME VALID 4144 29169 4144 29169 NONE
DATABASE(GRP1_MPP_EP11) APPLY INFO FROM (GRP1_MPP_EP01), REDOS_PARALLEL_NUM (1):
DSC_SEQNO[0], (RSEQ, SSEQ, KSEQ)[4356, 4356, 4356], (RLSN, SLSN, KLSN)[29169, 29169, 29169], N_TSK[0], TSK_MEM_USE[0]
REDO_LSN_ARR: (29169)
#--------------------------------------------------------------------------------#
2022-04-18 17:34:19
#--------------------------------------------------------------------------------#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP2 45331 TRUE AUTO TRUE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.168.0.22 5253 2022-04-18 17:33:29 GLOBAL VALID OPEN GRP2_MPP_EP02 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.1.22 5236 OK GRP2_MPP_EP02 OPEN PRIMARY 0 0 REALTIME VALID 4352 26190 4352 26190 NONE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.168.0.21 5254 2022-04-18 17:33:30 GLOBAL VALID OPEN GRP2_MPP_EP22 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.1.21 5237 OK GRP2_MPP_EP22 OPEN STANDBY 0 0 REALTIME VALID 4137 26190 4137 26190 NONE
DATABASE(GRP2_MPP_EP22) APPLY INFO FROM (GRP2_MPP_EP02), REDOS_PARALLEL_NUM (1):
DSC_SEQNO[0], (RSEQ, SSEQ, KSEQ)[4352, 4352, 4352], (RLSN, SLSN, KLSN)[26190, 26190, 26190], N_TSK[0], TSK_MEM_USE[0]
REDO_LSN_ARR: (26190)
#================================================================================#
tip
[monitor] 2022-04-18 18:20:53: Instance GRP1_MPP_EP01[PRIMARY, OPEN, ISTAT_SAME:TRUE] cannot join other instances, dmwatcher status is OPEN, SYSOPENHISTORY status is VALID
[monitor] 2022-04-18 18:20:53: Instance GRP1_MPP_EP01[PRIMARY, OPEN, ISTAT_SAME:TRUE] has no command to execute currently
[monitor] 2022-04-18 18:20:53: Instance GRP1_MPP_EP01[PRIMARY, OPEN, ISTAT_SAME:TRUE] is OK, dmwatcher status is OPEN, dw_type is GLOBAL
[monitor] 2022-04-18 18:20:53: Instance GRP1_MPP_EP11[STANDBY, OPEN, ISTAT_SAME:TRUE] can join instance GRP1_MPP_EP01[PRIMARY, OPEN, ISTAT_SAME:TRUE]
[monitor] 2022-04-18 18:20:53: Instance GRP1_MPP_EP11[STANDBY, OPEN, ISTAT_SAME:TRUE] has no command to execute currently
[monitor] 2022-04-18 18:20:53: Instance GRP1_MPP_EP11[STANDBY, OPEN, ISTAT_SAME:TRUE] is OK, dmwatcher status is OPEN, dw_type is GLOBAL
[monitor] 2022-04-18 18:20:53: Group(GRP1) current active instances are OK
[monitor] 2022-04-18 18:20:53: Instance GRP2_MPP_EP02[PRIMARY, OPEN, ISTAT_SAME:TRUE] cannot join other instances, dmwatcher status is OPEN, SYSOPENHISTORY status is VALID
[monitor] 2022-04-18 18:20:53: Instance GRP2_MPP_EP02[PRIMARY, OPEN, ISTAT_SAME:TRUE] has no command to execute currently
[monitor] 2022-04-18 18:20:53: Instance GRP2_MPP_EP02[PRIMARY, OPEN, ISTAT_SAME:TRUE] is OK, dmwatcher status is OPEN, dw_type is GLOBAL
[monitor] 2022-04-18 18:20:53: Instance GRP2_MPP_EP22[STANDBY, OPEN, ISTAT_SAME:TRUE] can join instance GRP2_MPP_EP02[PRIMARY, OPEN, ISTAT_SAME:TRUE]
[monitor] 2022-04-18 18:20:53: Instance GRP2_MPP_EP22[STANDBY, OPEN, ISTAT_SAME:TRUE] has no command to execute currently
[monitor] 2022-04-18 18:20:53: Instance GRP2_MPP_EP22[STANDBY, OPEN, ISTAT_SAME:TRUE] is OK, dmwatcher status is OPEN, dw_type is GLOBAL
[monitor] 2022-04-18 18:20:53: Group(GRP2) current active instances are OK
[monitor] 2022-04-18 18:20:53: Current active group(has active primary instance) mpp ctl files are same
[monitor] 2022-04-18 18:20:53: All groups' current active instances are OK!
参手册中的《4.7 MPP 下系统过程与系统视图常见用法》
获取 EP 节点配置信息:
SELECT * FROM V$MPP_CFG_ITEM WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
获取当前会话连接的实例名
SELECT NAME FROM V$INSTANCE WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
获取表 T_RANGE 在每个实例上的数据行数
CALL SP_GET_EP_COUNT('SYSDBA','T_RANGE');
MPP 的数据分布类型和具体设置在建表时指定。在 MPP 模式下创建分布表,如果未指定列则默认为 RANDOMLY(随机)分布表;
测试如下:
- 创建哈希分布表测试
记住一点:主库5236端口、备库5237端口
创建哈希分布表 T_HASH,分布列为 C1,然后插入数据看是否会根据分布列进行自动分发。
[dmdba@dm21 ~]$ disql sysdba/SYSDBA:5236
Server[LOCALHOST:5236]:mode is primary, state is open
login used time : 2.696(ms)
disql V8
SQL> CREATE TABLE T_HASH(C1 INT, C2 CHAR(10)) DISTRIBUTED BY HASH (C1);
executed successfully
used time: 37.393(ms). Execute id is 500.
SQL>
分别在两个节点登后,主5236端口、备5237端口,都可以查到此表
插入数据分列测试一:
[dmdba@dm21 ~]$ disql sysdba/SYSDBA@DMMPPDB
insert into t_hash(c1,c2) values(11111,'x');
insert into t_hash(c1,c2) values(22222,'x');
insert into t_hash(c1,c2) values(33333,'x');
insert into t_hash(c1,c2) values(44,'44');
insert into t_hash(c1,c2) values(00,'00');
分别在所有节点的主备环境查询如下:
观察hash表主备数据分布情况:
我们这里可以得出一个实验结论:
- 当登陆dm21或dm22上以主库身份的端口5236查询数据,都可以看到一样的结果!!!
- 当登陆dm21或dm22上以备库身份的端口5237查询数据,看到的结果是不一样的!!!它只能看到本节点存放的数据!!!但是两个节点的所有备库都数据总和是一样的。
下边的截图更能说说这两点结论。
主库1(5236端口):GRP1_MPP_EP01与它对应的备库
节点一(dm21)存放三条数据。节点二(dm22)存放2条数据。我们在备库上可以看到相应的数据存放情况!
主库2(5236端口):GRP1_MPP_EP01和它对应的备库
节点二(dm22)存放两条数据。节点一(dm21)存放3条数据。我们在备库上可以看到相应的数据存放情况!
另外最简单的可以用本地登陆与全局登陆,也可以一目了然地看出数据分布情况:
- 创建范围分布表测试
创建范围分布表 T_RANGE,分布列为 C1。
[dmdba@dm21 ~]$ disql sysdba/SYSDBA:5236
SQL> CREATE TABLE T_RANGE (C1 INT, C2 CHAR(10)) DISTRIBUTED BY RANGE (C1) (VALUES LESS THAN(100) on GRP1_MPP_EP01, VALUES EQU OR LESS THAN (101) ON GRP2_MPP_EP02);
insert into T_RANGE (c1,c2) values(99,'less 100');
insert into T_RANGE (c1,c2) values(101,'equl 101');
insert into T_RANGE (c1,c2) values(200,'than 100'); --会报错,因为超过我的最大值!
insert into T_RANGE (c1,c2) values(9,'less 100');
insert into T_RANGE (c1,c2) values(0,'less 100');
commit;
分别在两个节点本地登后,都可以此数据。
节点1:
节点2:
结论:符合范围分布。
目的:现在关掉一台主机,看是否能正常服务(正常高可用),比如创建表,查询等。
比如关dm21
[root@dm21 ~]# poweroff
在监示器上显示:
因为我poweroff,故监示器不能及时更新在节点1(dm21)上的库信息,只能更新其节点1的 watcher信息!
仍可以查询全部信息:
做事务:
再做一条数据:
SQL> insert into t_hash(c1,c2) values('55555','ccccccc');
affect rows 1
used time: 1.609(ms). Execute id is 692670.
SQL> commit;
executed successfully
used time: 2.287(ms). Execute id is 692671.
SQL>
目的:看是否能在dm21上查到刚才的数据。
启动watcher就行,库不用启,因为配置了watcher可以自动启动库的!
[dmdba@dm21 ~]$ /dm/dmdbms/bin/dmwatcher /dm/data/EP01/mppdb/dmwatcher.ini
观察监示器:
可以看到,dm21都变成了备库并且是open的!现在在dm21上来查询数据。
数据OK!因为节点1现在都是备库,它们的数据和加起来是一样的!
前提条件:要在监器show看一下所有状态是否OK?例如:规档是不是VALID的、watcher是不是OPEN的等等,否则在监示器上发出的命令有可能不成功,从而导致切换失败!
为了这一点最好登陆到各端口对应的库上去看。
切换如下:
switchover GRP1.GRP1_MPP_EP01
查询如下:
查询:
更多学习内容参考:达梦数据库 - 新一代大型通用关系型数据库 | 达梦云适配中心 https://eco.dameng.com