一.在两个节点上安装好DM软件、配置好用户、环境变量、资源限制等
二.初始化实例
1.在节点1上初始化出来两个库
./dminit path=/home/dmdba/ db_name=grp1_ep01 instance_name=GRP1_MPP_EP01
./dminit path=/home/dmdba/ db_name=grp2_ep02 instance_name=GRP2_MPP_EP02
2.在节点2上初始化出来两个库
./dminit path=/home/dmdba/ db_name=grp2_ep01 instance_name=GRP2_MPP_EP01
./dminit path=/home/dmdba/ db_name=grp1_ep02 instance_name=GRP1_MPP_EP02
说明:
grp1是一组,grp2是另外一组
ep01主为,ep02为备
则在组grp1中,grp1_ep01和grp1_ep02为主备
在组grp2中,grp2_ep01的grp2_ep02为主备
三.分别在两个节点4个实例自身的目录下创建本地归档目录/dmarch
/home/dmdba/grp2_ep02/dmarch
/home/dmdba/grp1_ep01/dmarch
/home/dmdba/grp2_ep01/dmarch
/home/dmdba/grp1_ep02/dmarch
四.备份还原
1.脱机备份还原前,刚刚初始化的库需要启动一下
1.1在节点1上,启动库后再退出
./dmserver /home/dmdba/grp1_ep01/dm.ini
./dmserver /home/dmdba/grp2_ep02/dm.ini
1.2在节点2上,启动库后再退出
./dmserver /home/dmdba/grp1_ep02/dm.ini
./dmserver /home/dmdba/grp2_ep01/dm.ini
2.备份还原
2.1把节点1的grp1_ep01的数据备份
backup database '/home/dmdba/grp1_ep01/dm.ini' full to backup_file1 backupset '/home/dmdba/backup_file_grp1'
2.2把备份文件传输到节点2上
scp -r backup_file_grp1/ 192.168.161.212:/home/dmdba/
2.3在节点2上进行备份还原
restore database '/home/dmdba/grp1_ep02/dm.ini' from backupset '/home/dmdba/backup_file_grp1'
recover database '/home/dmdba/grp1_ep02/dm.ini' from backupset '/home/dmdba/backup_file_grp1'
recover database '/home/dmdba/grp1_ep02/dm.ini' update db_magic
2.4把节点2的grp2_ep01的数据备份
backup database '/home/dmdba/grp2_ep01/dm.ini' full to backup_file1 backupset '/home/dmdba/backup_file_grp2'
2.5把备份文件传输到节点1上
scp -r backup_file_grp2 192.168.161.211:/home/dmdba/
2.6在节点1上进行备份还原
restore database '/home/dmdba/grp2_ep02/dm.ini' from backupset '/home/dmdba/backup_file_grp2'
recover database '/home/dmdba/grp2_ep02/dm.ini' from backupset '/home/dmdba/backup_file_grp2'
recover database '/home/dmdba/grp2_ep02/dm.ini' update db_magic
五.配置组grp1的主库ep01(路径:/home/dmdba/grp1_ep01)
1配置dm.ini
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 次的日志发送信息
2.配置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 = 10.0.0.211 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5337 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.161.211 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 5253 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5243 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP2_MPP_EP02
MAL_HOST = 10.0.0.211
MAL_PORT = 5337
MAL_INST_HOST = 192.168.161.211
MAL_INST_PORT = 5236
MAL_DW_PORT = 5253
MAL_INST_DW_PORT = 5243
[MAL_INST3]
MAL_INST_NAME = GRP1_MPP_EP02
MAL_HOST = 10.0.0.212
MAL_PORT = 5338
MAL_INST_HOST = 192.168.161.212
MAL_INST_PORT = 5237
MAL_DW_PORT = 5254
MAL_INST_DW_PORT = 5244
[MAL_INST4]
MAL_INST_NAME = GRP2_MPP_EP01
MAL_HOST = 10.0.0.212
MAL_PORT = 5338
MAL_INST_HOST = 192.168.161.212
MAL_INST_PORT = 5237
MAL_DW_PORT = 5254
MAL_INST_DW_PORT = 5244
3.配置dmarch.ini
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_MPP_EP02 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /home/dmdba/grp1_ep01/dmarch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
4.配置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_EP01
使用dmctlcvt进行转换,DM软件安装的bin目录下执行以下命令
./dmctlcvt type=2 src=/home/dmdba/grp1_ep01/dmmpp.ini dest=/home/dmdba/grp1_ep01/dmmpp.ctl
5.启动并连接库,配置主库OGUID,设置为primary
./dmserver /home/dmdba/grp1_ep01/dm.ini mount
./disql /nolog
Sp_set_oguid(45330);
Alter database primary;
六.配置组grp2的主库ep01(路径:/home/dmdba/grp2_ep01)
1.配置dm.ini
INSTANCE_NAME = GRP2_MPP_EP01
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 次的日志发送信息
2.配置dmmal.ini
同grp1_ep01
3.配置dmarch.ini
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP2_MPP_EP02
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/dmdba/grp2_ep01/dmarch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
4.配置dmmpp.ctl
同grp1_ep01,把dmmpp.ctl文件拷贝过来就行了
5.启动并连接库,配置主库OGUID,设置为primary
./dmserver /home/dmdba/grp2_ep01/dm.ini mount
./disql /nolog
Sp_set_oguid(45331);
Alter database primary;
七.配置组grp1的备库ep02(路径:/home/dmdba/grp1_ep02)
1.配置dm.ini
INSTANCE_NAME = GRP1_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 次的日志发送信息
2.配置dmmal.ini
同grp1_ep01
3.配置dmarch.ini
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_MPP_EP01
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/dmdba/grp1_ep02/dmarch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
4.配置dmmpp.ctl
同grp1_ep01,把dmmpp.ctl文件拷贝过来就行了
5.启动并连接库,配置主库OGUID,设置为primary
./dmserver /home/dmdba/grp1_ep02/dm.ini mount
./disql /nolog
Sp_set_oguid(45330);
Alter database standby;
八.配置组grp2的备库ep02(路径:/home/dmdba/grp2_ep02)
1.配置dm.ini
INSTANCE_NAME = GRP2_MPP_EP02
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 次的日志发送信息
2.配置dmmal.ini
同grp1_ep01
3.配置dmarch.ini
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP2_MPP_EP01
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/dmdba/grp2_ep02/dmarch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
4.配置dmmpp.ctl
同grp1_ep01,把dmmpp.ctl文件拷贝过来就行了
5.启动并连接库,配置主库OGUID,设置为primary
./dmserver /home/dmdba/grp1_ep02/dm.ini mount
./disql /nolog
Sp_set_oguid(45331);
Alter database standby;
九.配置守护进程dmwatcher.ini
一般来说每个独立的实例都有单独的守护进程,由于同一台机器上有不同组的实例,可以只配置一组守护进程
1.节点1上创建config目录用来存放dmwatcher.ini文件
2.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 = /home/dmdba/grp1_ep01/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/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 = /home/dmdba/grp2_ep02/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
3.节点2上创建config目录用来存放dmwatcher.ini文件,参考步骤1
4.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 = /home/dmdba/grp1_ep02/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/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 = /home/dmdba/grp2_ep01/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
5.启动守护进程
在两个节点上分别启动
./dmwatcher /home/dmdba/config/dmwatcher.ini
./dmwatcher /home/dmdba/config/dmwatcher.ini
守护进程会自动启动已配置过的所有库,所以只需要在两个节点上分别启动守护进程就行了,不需要再单独去启动两组的四个库了
十.配置监视器dmmonitor.ini
守护进程配置的自动切换,所以要在两个节点之外的第三个节点上配置确认监视器
1.在第三台安装好DM软件的机器上,创建配置文件dmmonitor.ini,添加如下内容
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /home/dmdba/dmdbms/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 = 10.0.0.211:5253
MON_DW_IP = 10.0.0.212:5253
[GRP2]
MON_INST_OGUID = 45331 #组 GRP2 的唯一 OGUID 值 #以下配置为监视器到组 GRP2 的守护进程的连接信息,以―IP:PORT‖的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 10.0.0.211:5254
MON_DW_IP = 10.0.0.212:5254
2.启动监视器
./dmmonitor /home/dmdba/config/dmmonitor.ini
3.确认集群状态
可以看到两组(GRP1、GRP2)里的WSTATUS为OPEN、INST_OK为OK、ISTATUS为OPEN,集群状态正常,这个是前台测试集群是否正常,实际使用过程中一般都会注册服务,然后让服务在后台运行
十一.注册服务
1.注册守护进程,两个节点上都执行
./dm_service_installer.sh -t dmwatcher -p DMMPP -watcher_ini /home/dmdba/config/dmwatcher.ini
注册守护进程后直接启动,守护进程会自动启动已配置过的实例,两个节点上都需要启动
systemctl start DmWatcherServiceDMMPP
2.注册数据库实例服务,两个节点上都执行,每个节点上都有两个实例,为了便于区分,grp1的服务后缀统一为DMMPP1,grp2的服务后缀统一为DMMPP2
节点1上
./dm_service_installer.sh -t dmserver -p DMMPP1 -dm_ini /home/dmdba/grp1_ep01/dm.ini
./dm_service_installer.sh -t dmserver -p DMMPP2 -dm_ini /home/dmdba/grp2_ep02/dm.ini
节点2上
./dm_service_installer.sh -t dmserver -p DMMPP1 -dm_ini /home/dmdba/grp1_ep02/dm.ini
./dm_service_installer.sh -t dmserver -p DMMPP2 -dm_ini /home/dmdba/grp2_ep01/dm.ini
3.注册监视器服务,只在监视器节点上配置。若需要配置多监视器,则在需要的节点上配置普通监视器即可
./dm_service_installer.sh -t dmmonitor -p DMMPP -monitor_ini /home/dmdba/config/dmmonitor.ini
十二.配置集群访问
修改客户端的dm_svc.conf文件
LANGUAGE=(cn)
# 全局配置区
DMMPP=(192.168.161.211:5236,192.168.161.212:5236,192.168.161.211:5237,192.168.161.212:5237)
TIME_ZONE=(+480) #表示+8:00 时区
LOGIN_ENCRYPT=(0)
DIRECT=(Y)
# 服务配置区
[DMMPP]
TIME_ZONE=(+480) #表示+8:00 时区
LOGIN_MODE=(1)设置只登录主库
SWITCH_TIME=(3) #在服务器之间切换的次数
SWITCH_INTERVAL=(10) #在服务器之间切换的时间间隔,单位为毫秒
十三.测试
1.多次连接集群,查看连接的节点是否会有变化
确认以集群的方式连接会自动负载到不同的节点
2.连接MPP集群
./disql SYSDBA/SYSDBA@DMMPP
3.建立分布列表
CREATE TABLE T_LIST(C1 INT, C2 CHAR(10)) DISTRIBUTED BY LIST (C1) (VALUES(1,2,3,4,5) ON GRP1_MPP_EP01,VALUES(6,7,8,9,10) ON GRP2_MPP_EP01);
说明: 建立表T_LIST根据C1字段进行分布。值为1-5的数据行分部到A机器实例名为GRP1_MPP_EP01的库内。值为6-10的分部到B机器实例名为GRP2_MPP_EP01的库内。
4.插入数据
insert into T_LIST values(1,'aa');
insert into T_LIST values(2,'bb');
insert into T_LIST values(8,'cc');
insert into T_LIST values(10,'dd');
Commit
5.以local的方式分别登录组grp1和grp2的主节点查看数据分布情况
确认数据是按照建表的规则分布的
6.登录组grp1的备库ep02查看
确认备库中也有数据
7.确认以集群的方式连接后,现在的节点信息
现在连接的是节点2,即组grp1的主库ep01
8.打开确认监视器,只有确认监视器打开的情况下库才会自动切换
./dmmonitor /home/dmdba/config/dmmonitor.ini
9.在节点1上找到ep01的进程,直接kill -9
10.在之前登录的界面再次查看表信息和节点信息
11.查看期间确认监视器打印出来的信息
在打印出来的信息中可以看到,在组grp1的主库ep01出现故障(使用kill进程的方式进行模拟)的时候,确认监视器会自动对组grp1进行接管,之后组grp1的备库ep02接管成功
注意:
现在网上很多文档里写的MPP集群用本地或者全局模式登录的时候,是./disql SYSDBA/SYSDBA*LOCAL@DMMPP这种模式,现在DM8已经更换了方式,之前的连接方式已经不能使用了,现在连接模式是./disql SYSDBA/SYDBA@DMMPP#”{MPP_TPYE=LOCAL}”,如下
更多资讯请上达梦技术社区了解:https://eco.dameng.com