本篇主要介绍DMDSC的共享磁盘创建、集群搭建,以及添加备库做故障切换的测试;
首先总结一下DSC的实现原理以及搭建过程中需要注意的地方,然后列出主备切换相关的结论。
一、DSC 集群实现原理
DMDSC 是一个共享存储的数据库集群系统。多个数据库实例同时访问、修改同一个数据库,因此必然带来了全局并发问题。DMDSC 集群基于单节点数据库管理系统之上,改造了 Buffer 缓冲区、事务系统、封锁系统和日志系统等,来适应共享存储集群节点间的全局并发访问控制要求。同时,引入缓存交换技术,提升数据在节点间的传递效率。
DMDSC 集群是一个多实例、单数据库的系统。多个数据库实例可以同时访问、修改同一个数据库的数据。用户可以登录集群中的任意一个数据库实例,获得完整的数据库服务。数据文件、控制文件在集群系统中只有一份,不论有几个节点,这些节点都平等地使用这些文件。各个节点有自己独立的联机日志和归档日志。这些文件就保存在共享存储上。
DMDSC 集群得以实现的重要基础就是共享存储。DM 支持的共享存储有两种:裸设备和DMASM。这两种存储的区别在于后者在前者的基础上,部署并使用了 DMASM 文件系统。为了方便对裸设备上的磁盘或文件进行管理,推荐用户使用后者。DMDSC 集群主要由数据库和数据库实例、共享存储、本地存储、通信网络、以及集群控制软件 DMCSS 组成。
部署注意事项:
1.DMASM 的两个节点分别配置 dmdcr.ini,dmdcr_path 相同,dmasvrmal.ini 文件内容也相同,
dmdcr_seqo 分别为 0 和 1。
2.注册,初始化实例,绑定磁盘等都在一台机器上完成,配置文件也在一个节点写好发送过去进行修改。
3.绑定磁盘的所属用户是dmdba,尽量不要使用root用户绑定。
二、主备切换总结
1、 在dsc+dw整个集群正常状态下,可以通过switchover来进行主备切换,但切换的前提是dsc集群的控制节点必须是0号节点。
2、 dsc+dw集群中,dsc任何一个节点或多个节点故障(包括控制节点故障,dw备库和dsc某几个节点同时故障),只要dsc集群内还有至少一个正常节点,dsc集群都可以正常使用。故障节点恢复后会自动加入集群,提供服务,dw节点恢复后会自动同步故障期间主库上的数据。
3、当dsc集群所有节点故障时,如果要将备库切换为主库,需使用takeover进行切换。如果归档不是强一致性模式,切换后dsc恢复会引发组分裂。因此建议要使用<实时归档+强一致性>的主备模式。切换时已提交的事务不会丢失(前提是强一致性模式),切换后dw变为主库,可以正常提供服务。当dsc集群数据库服务恢复正常后,dm系统会自动将dsc集群作为备库加入到整个dsc+dw集群中,并从主库上同步故障期间的数据,数据同步完成后,可以执行switchover将dsc集群切换为主库。
接下来是详细的集群部署过程,以及主备切换的不同场景测试
1. DSC集群搭建
这里准备两台机器做DSC集群,首先将两台机器都关机,准备创建共享盘。
主机 |
IP 地址 |
实例名 |
操作系统 |
实例端口 |
MAL_PORT |
db1 |
外部
⽹
络:
192.168.93.101
|
DSC0 |
CentOS7 |
5236 |
8330 |
db2 |
外部
⽹
络:
192.168.93.102
|
DSC1 |
CentOS7 |
5236 |
8330 |
1.1
创建一块虚拟磁盘
点击添加,选择SCSI磁盘类型
新建虚拟磁盘
至此,磁盘准备完成。
1.2 将虚拟磁盘改为共享盘
在虚拟机关闭的情况下,修改配置文件( 位于虚拟机目录下的一个 .vmx文件),
在最后一行添加如下两行:
disk.locking="FALSE"
scsi0:1.SharedBus="Virtual"
解释:
disk.locking="FALSE" 取消这块硬盘被当前虚拟机的锁定,使其他虚拟机也可以同时加载这块盘;
scsi0:1.SharedBus="Virtual" 这里的 0:1 要和上面新增的一块盘对应的序号一致。
两台机器的配置文件都要这么改,改完以后,将上面创建的盘加到主机2上面来:
添加后,开启两台机器,输入 lsblk 都可以看到新增盘sdb
1.3 共享盘做分区
在服务器1上操作:
对共享磁盘划分
1) 输入 fdisk /dev/sdb
2) 依次输入 n → p → 1 →回车 → +100M →回车,完成第一块磁盘划分
3) 依次输入 n → p → 2 →回车 → +100M →回车,完成第二块磁盘划分
4) 依次输入 n → p → 3 → 回车→ +2048M→回车,完成第三块磁盘划分
5) 依次输入 n → p → 4 → 回车→回车→回车,完成第四块磁盘划分
接着查看分区、并保存
识别分区
[root@db1 ~]# partprobe /dev/sdb
6) 编辑/etc/udev/rules.d/60-raw.rules 文件,增加以下语句:
vi /etc/udev/rules.d/60-raw.rules
ACTION=="add", KERNEL=="sdb1", RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add", KERNEL=="sdb2", RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add", KERNEL=="sdb3", RUN+="/bin/raw /dev/raw/raw3 %N"
ACTION=="add", KERNEL=="sdb4", RUN+="/bin/raw /dev/raw/raw4 %N"
ACTION=="add", KERNEL=="raw[1-4]", OWNER=" dmdba", GROUP=" dinstall", MODE="660"
保存,退出
7)裸设备绑定
[root@db1 ~]# /sbin/udevadm trigger --type=devices --action=change
或者
[root@db1 ~]# /sbin/udevadm control --reload
查看绑定信息
[root@db1 ~]# partprobe /dev/sdb
[root@db1 ~]# raw -qa
查看裸设备大小
[root@db1 ~]# blockdev --getsize64 /dev/raw/raw1
服务器2上操作:
#识别分区
[root@db1 ~]# partprobe /dev/sdb
#增加配置文件
[root@db1 ~]# vi /etc/udev/rules.d/60-raw.rules
ACTION=="add", KERNEL=="sdb1", RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add", KERNEL=="sdb2", RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add", KERNEL=="sdb3", RUN+="/bin/raw /dev/raw/raw3 %N"
ACTION=="add", KERNEL=="sdb4", RUN+="/bin/raw /dev/raw/raw4 %N"
ACTION=="add", KERNEL=="raw[1-4]", OWNER=" dmdba", GROUP=" dinstall", MODE="660"
保存,退出
查看绑定信息
[root@db1 ~]# raw -qa
查看裸设备大小
[root@db1 ~]# blockdev --getsize64 /dev/raw/raw1
2.DSC集群配置
主机 |
IP 地址 |
实例名 |
操作系统 |
实例端口 |
MAL_PORT |
db1 |
外部
⽹
络:
192.168.93.101
|
DSC0 |
CentOS7 |
5236 |
8330 |
db2 |
外部
⽹
络:
192.168.93.102
|
DSC1 |
CentOS7 |
5236 |
8330 |
2.1准备 dmdcr_cfg.ini 配置文件
前提准备:两个节点都安装了DM8软件,但不用初始化实例。
DM8安装目录: /home/dmdba/dmdbms
实例数据目录: /home/data/
[root@db1 home]# mkdir -p /home/data/
[root@db1 home]# chown -R dmdba:dinstall /home/data
[root@db1 home]# su – dmdba
[dmdba@db1 ~]$ cd /home/data
创建配置文件:使用 dmdba用户在 /home/data/ 下创建文件dmdcr_cfg.ini,
只需要在dsc1主节点上配置。
后续DMASMCMD工具执行 init 语句会使用到。
需要根据实际环境修改IP配置为rac节点的IP,其他内容可以保持不变。
注:不同节点服务器间对应的DCR_EP_PORT端口可以相同,但是两个服务器配的ASM的DCR_EP_SHM_KEY不能相同。
配置文件内容如下
[dmdba@db1 data]$ vi dmdcr_cfg.ini
DCR_N_GRP = 3
DCR_VTD_PATH = /dev/raw/raw2
DCR_OGUID = 63635
[GRP]
DCR_GRP_TYPE = CSS
DCR_GRP_NAME = GRP_CSS
DCR_GRP_N_EP = 2
DCR_GRP_DSKCHK_CNT = 60
[GRP_CSS]
DCR_EP_NAME = CSS0
DCR_EP_HOST = 172.16.1.81
DCR_EP_PORT = 9340
[GRP_CSS]
DCR_EP_NAME = CSS1
DCR_EP_HOST = 172.16.1.82
DCR_EP_PORT = 9341
[GRP]
DCR_GRP_TYPE = ASM
DCR_GRP_NAME = GRP_ASM
DCR_GRP_N_EP = 2
DCR_GRP_DSKCHK_CNT = 60
[GRP_ASM]
DCR_EP_NAME = ASM0
DCR_EP_SHM_KEY = 93360
DCR_EP_SHM_SIZE = 20
DCR_EP_HOST = 192.168.93.101
DCR_EP_PORT = 9350
DCR_EP_ASM_LOAD_PATH = /dev/raw
[GRP_ASM]
DCR_EP_NAME = ASM1
DCR_EP_SHM_KEY = 93361
DCR_EP_SHM_SIZE = 20
DCR_EP_HOST = 192.168.93.102
DCR_EP_PORT = 9351
DCR_EP_ASM_LOAD_PATH = /dev/raw
[GRP]
DCR_GRP_TYPE = DB
DCR_GRP_NAME = GRP_DSC
DCR_GRP_N_EP = 2
DCR_GRP_DSKCHK_CNT = 60
[GRP_DSC]
DCR_EP_NAME = DSC0
DCR_EP_SEQNO = 0
DCR_EP_PORT = 5236
DCR_CHECK_PORT = 9740
[GRP_DSC]
DCR_EP_NAME = DSC1
DCR_EP_SEQNO = 1
DCR_EP_PORT = 5236
DCR_CHECK_PORT = 9741
2.2使用DMASMCMD工具初始化
注:只在一台机器上执行即可,此处 dmdcr_cfg.ini 配置文件在主节点上,所以就在主节点完成以下操作:
进入安装目录 /bin
[dmdba@db1 data]$ cd /home/dmdba/dmdbms/bin
[dmdba@db1 bin]$ ./dmasmcmd
依次执行下面几句:
create dcrdisk '/dev/raw/raw1' 'dcr'
create votedisk '/dev/raw/raw2' 'vote'
create asmdisk '/dev/raw/raw3' 'LOG0'
create asmdisk '/dev/raw/raw4' 'DATA0'
init dcrdisk '/dev/raw/raw1' from '/home/data/dmdcr_cfg.ini' identified by 'abcd'
init votedisk '/dev/raw/raw2' from '/home/data/dmdcr_cfg.ini'
2.3配置 dmasvrmal.ini文件
同样是dmdba用户,目录 /home/data/
先在主节点新增 dmasvrmal.ini,然后scp传到节点2上:
[dmdba@db1 bin]$ cd /home/data/
[dmdba@db1 data]$ vi dmasvrmal.ini
[MAL_INST1]
MAL_INST_NAME = ASM0
MAL_HOST = 172.16.1.81
MAL_PORT = 7230
[MAL_INST2]
MAL_INST_NAME = ASM1
MAL_HOST = 172.16.1.82
MAL_PORT = 7231
#传输文件:
[dmdba@db1 data]$ scp dmasvrmal.ini dmdba@192.168.93.102:/home/data
2.4 配置dmdcr.ini文件
两个节点都要配置,dmdcr_seqo 分别为 0 和 1,保存到/home/data 目录下面。
此处配置为不会自动拉起,需要手动执行启动 asm 与 server 操作,方便在控制台查看节点信息,部署成功后可配置为自动拉起,注册服务。
节点1 192.168.93.101
[dmdba@db1 bin]$ cd /home/data/
[dmdba@db1 data]$ vi dmdcr.ini
DMDCR_PATH=/dev/raw/raw1
#dmasmsvr使用的 MAL 配置文件路径
DMDCR_MAL_PATH=/home/data/dmasvrmal.ini
DMDCR_SEQNO = 0
#ASM 重启参数,命令行方式启动
DMDCR_ASM_RESTART_INTERVAL = 0
DMDCR_ASM_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmasmsvr dcr_ini=/home/data/dmdcr.ini
#DB 重启参数,命令行方式启动
DMDCR_DB_RESTART_INTERVAL = 0
DMDCR_DB_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver path=/home/data/dsc0_config/dm.ini dcr_ini=/home/data/dmdcr.ini
节点2 192.168.93.102
[dmdba@db1 bin]$ cd /home/data/
[dmdba@db1 data]$ vi dmdcr.ini
DMDCR_PATH=/dev/raw/raw1
#dmasmsvr使用的 MAL 配置文件路径
DMDCR_MAL_PATH=/home/data/dmasvrmal.ini
DMDCR_SEQNO = 1
#ASM 重启参数,命令行方式启动
DMDCR_ASM_RESTART_INTERVAL = 0
DMDCR_ASM_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmasmsvr dcr_ini=/home/data/dmdcr.ini
#DB 重启参数,命令行方式启动
DMDCR_DB_RESTART_INTERVAL = 0
DMDCR_DB_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver path=/home/data/dsc1_config/dm.ini dcr_ini=/home/data/dmdcr.ini
注意:需要改两个地方: DMDCR_SEQNO = 1 和 path=/home/data/dsc1_config
2.5启动DMCSS和DMASM服务
在 192.168.93.101、192.168.93.102 节点先后分别启动 dmcss、dmasmsvr 程序。
用dmdba用户,进入安装目录/bin路径:
[dmdba@db1 data]$ cd /home/dmdba/dmdbms/bin
手动启动 dmcss 命令:
[dmdba@db1 bin]$ ./dmcss DCR_INI=/home/data/dmdcr.ini
( 正常情况下 两台服务器都识别CSS0为控制节点)
手动启动 dmasmsvr 命令:
[dmdba@db1 bin]$ ./dmasmsvr DCR_INI=/home/data/dmdcr.ini
注意:节点2也同样开启两个窗口,一共四个窗口,不要关闭!!!
都启动后如下所示
2.6使用dmasmtool工具创建DMASM磁盘组
选择一个节点,启动 dmasmtool 工具:
这里用主节点操作:
su – dmdba
cd /home/dmdba/dmdbms/bin
./dmasmtool DCR_INI=/home/data/dmdcr.ini
登录后,执行以下两段:
#创建日志磁盘组
create diskgroup 'DMLOG' asmdisk '/dev/raw/raw3'
#创建数据磁盘组
create diskgroup 'DMDATA' asmdisk '/dev/raw/raw4'
注:创建成功后可以在之前的两台主机 ASM 服务窗口中查看到信息:
2.7 配置dminit.ini文件
使用 dmdba 用户,只需要在一个节点上创建,此处选择在 dsc1 主节点中创建
[dmdba@db1 bin]$ cd /home/data/
[dmdba@db1 data]$ vi dminit.ini
db_name = dsc
system_path = +DMDATA/data
system = +DMDATA/data/dsc/system.dbf
system_size = 128
roll = +DMDATA/data/dsc/roll.dbf
roll_size = 128
main = +DMDATA/data/dsc/main.dbf
main_size = 128
ctl_path = +DMDATA/data/dsc/dm.ctl
ctl_size = 8
log_size = 256
dcr_path = /dev/raw/raw1 #dcr 磁盘路径,目前不支持 asm ,只能是裸设备
dcr_seqno = 0
auto_overwrite = 1
page_size = 16
BLANK_PAD_MODE=1
[DSC0] #inst_name, 跟 dmdcr_cfg.ini 中 DB 类型 group 中 DCR_EP_NAME 对应
config_path = /home/data/dsc0_config
port_num = 5236
mal_host = 172.16.1.81
mal_port = 8330 # 注意:这里的 MAL_PORT 不同于 dmasvrmal.ini 的 MAL_PORT
log_path = +DMLOG/dsc0_log01.log
log_path = +DMLOG/dsc0_log02.log
[DSC1] #inst_name 跟 dmdcr_cfg.ini 中 DB 类型 group 中 DCR_EP_NAME 对应
config_path = /home/data/dsc1_config
port_num = 5236
mal_host = 172.16.1.82
mal_port = 8330 # 注意:这里的 MAL_PORT 不同于 dmasvrmal.ini 的 MAL_PORT
log_path = +DMLOG/dsc1_log01.log
log_path = +DMLOG/dsc1_log02.log
2.8 使用dminit初始化DB环境
注:需使用 dmdba 用户,在一个节点上初始化数据库就可以,因为 dminit.ini 配置文件在 dsc1 主节点上,所以初始化数据库操作在此节点执行即可。
[dmdba@db1 data]$ cd /home/dmdba/dmdbms/bin
[dmdba@db1 bin]$ ./dminit control=/home/data/dminit.ini
可以看到创建数据库成功,
进入 /home/data/ 目录后可以看到生成两个文件夹:
因为一直在主节点上进行初始化操作, dsc1_config 文件夹应该是节点 2 需要使用的配置文件,
所以需要将 dsc1_config 文件夹传输至节点 2 的 /home/data/ 目录下:
[dmdba@db1 data]$ scp -r dsc1_config/ dmdba@192.168.93.102:/home/data/
节点 1 上可以仅保留 dsc0_config , 删除该文件夹 rm -rf dsc1_config
2.9启动实例
节点1 192.168.93.101:
[dmdba@db1 data]$ cd /home/dmdba/dmdbms/bin
[dmdba@db1 data]$ ./dmserver /home/data/ dsc0_config/dm.ini dcr_ini=/home/data/dmdcr.ini
节点2 192.168.93.102:
[dmdba@db1 data]$ cd /home/dmdba/dmdbms/bin
[dmdba@db1 data]$ ./dmserver /home/data/ dsc1_config/dm.ini dcr_ini=/home/data/dmdcr.ini
至此,集群部署完毕。
可用disql登录,查看集群状态:
select * from v$dsc_ep_info;
3.后台服务注册
3.1 注册CSS和ASM服务
上述2.5【启动DMCSS和DMASM服务】中,四个窗口服务可以注册为后台运行:
节点1、2相同操作:
su – root
cd /home/dmdba/dmdbms/script/root
#注册CSS服务,名为DmCSSServiceDSC
./dm_service_installer.sh -t dmcss -p DSC -dcr_ini /home/data/dmdcr.ini
#启动CSS服务( 启动前需要先关掉之前的窗口CSS服务,否则这里起不来)
service DmCSSServiceDSC start
#注册ASM服务,名为DmASMSvrServiceDSC,且必须-y指定依赖的CSS服务:
./dm_service_installer.sh -t dmasmsvr -p DSC -dcr_ini /home/data/dmdcr.ini -y DmCSSServiceDSC
#启动ASM服务 ( 同样需要先停掉窗口ASM服务,且ASM关闭以后,实例也会自动关闭)
service DmASMSvrServiceDSC start
#查看后台进程运行情况
ps -ef |grep dmdcr.ini
3.2 注册实例服务
su – root
cd /home/dmdba/dmdbms/script/root
#注册一个名为DmServiceDSC的服务, 需要-y指定ASM服务:
如果是节点1:
./dm_service_installer.sh -t dmserver -p DSC -dm_ini /home/data/dsc0_config/dm.ini -dcr_ini /home/data/dmdcr.ini -y DmASMSvrServiceDSC
如果是节点2:
./dm_service_installer.sh -t dmserver -p DSC -dm_ini /home/data/ dsc1_config/dm.ini -dcr_ini /home/data/dmdcr.ini -y DmASMSvrServiceDSC
#启动服务,(由于上面ASM窗口服务关闭过,因此实例已经关了。这里可以直接启动)
service DmService DSC start
4.添加DSC主备
先关闭实例
4.1 配置归档文件
分别编辑两个 DMDSC 节点的 dmarch.ini 文件,增加本地归档和远程归档, dmarch.ini 文件放在各自 dm.ini 中指定的 CONFIG_PATH 目录下:
cat dm.ini | grep CONFIG_PATH
节点0操作:
cd /home/data/dsc0_config
vi dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/data/dsc0_config/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
[ARCHIVE_REMOTE]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC1 # 这里填对方的实例名
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
ARCH_INCOMING_PATH = /home/data/dsc0_config/arch_remote # 本地接收远程归档的路径
节点1操作:
cd /home/data/dsc1_config
vi dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/data/dsc1_config/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
[ARCHIVE_REMOTE]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC0 # 这里填对方的实例名
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
ARCH_INCOMING_PATH = /home/data/dsc1_config/arch_remote # 本地接收远程归档的路径
配置 dm.ini,开启归档模式
分别编辑两个 DMDSC 节点的 dm.ini 文件,打开归档参数:
ARCH_INI = 1
4.2备份DSC库
重启 DMDSC 集群的两个 dmserver 实例,然后再正常退出。在 DMDSC 集群生成有归档日志的情况下进行脱机备份,以便后续校验日志连续性时使用。
cd /home/dmdba/dmdbms/bin
#节点0开启实例
./dmserver /home/data/dsc0_config/dm.ini dcr_ini=/home/data/dmdcr.ini
#节点1开启实例
./dmserver /home/data/dsc1_config/dm.ini dcr_ini=/home/data/dmdcr.ini
确认归档路径是否生产归档日志,退出实例
cd /home/data/dsc0_config
mkdir bak
cd /home/dmdba/dmdbms/bin
--启动 dmrman
./dmrman use_ap=2 dcr_ini=/home/data/dmdcr.ini
--脱机备份 DMDSC 集群
RMAN>BACKUP DATABASE '/home/data/dsc0_config/dm.ini' FULL BACKUPSET '/home/data/bak/db_full_bak_for_DSC';
--将备份集传输到备库
scp -r /home/data/bak/db_full_bak_for_DSC 192.168.93.103:/dbdata/DAMENG/bak/
4.3 准备单节点备库
初始化 ./dminit path=/dbdata/ page_size=16 BLANK_PAD_MODE=1
--启动 dmrman
./dmrman use_ap=2
--使用 DMDSC 库的备份集还原恢复到单节点备库
RMAN>RESTORE DATABASE '/dbdata/DAMENG/dm.ini' FROM BACKUPSET '/dbdata/DAMENG/bak/db_full_bak_for_DSC';
RMAN>RECOVER DATABASE '/dbdata/DAMENG/dm.ini' FROM BACKUPSET '/dbdata/DAMENG/bak/db_full_bak_for_DSC';
RMAN>RECOVER DATABASE '/dbdata/DAMENG/dm.ini' UPDATE DB_MAGIC;
4.4 配置dm.ini
依次修改 DMDSC所有节点和单节点备库的 dm.ini 文件,修改数据守护相关的参数配置。
(1)DSC0节点配置:
[dmdba@db1 dsc0_config]$ vi /home/data/dsc0_config/dm.ini
INSTANCE_NAME = DSC0
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
(2)DSC1节点配置:
[dmdba@db2 dsc1_config]$ vi /home/data/dsc1_config/dm.ini
INSTANCE_NAME = DSC1
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
(3)备库配置:
[dmdba@db3 DAMENG]$ vi /dbdata/DAMENG/dm.ini
INSTANCE_NAME = 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 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
4.5配置 dmmal.ini
由于所有节点实例的 dmmal.ini 文件内容是一致的,配置完成后,拷贝到每个节点实例 dm.ini 中指定的 CONFIG_PATH 目录下。
MAL_CHECK_INTERVAL = 30 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间
[MAL_INST0]
MAL_INST_NAME = DSC0 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.93.101 #MAL系统监听 TCP 连接的 IP 地址
MAL_PORT = 8330 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.93.101 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini 中的PORT_NUM一致
MAL_DW_PORT = 3567 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 4568 #实例监听守护进程 TCP 连接的端口
[MAL_INST1]
MAL_INST_NAME = DSC1
MAL_HOST = 192.168.93.102
MAL_PORT = 8330
MAL_INST_HOST = 192.168.93.102
MAL_INST_PORT = 5236
MAL_DW_PORT = 3567
MAL_INST_DW_PORT = 4568
[MAL_INST2]
MAL_INST_NAME = EP01
MAL_HOST = 192.168.93.103
MAL_PORT = 8330
MAL_INST_HOST = 192.168.93.103
MAL_INST_PORT = 5236
MAL_DW_PORT = 3567
MAL_INST_DW_PORT = 4568
向集群节点2传输:scp dmmal.ini 192.168.93.102:/home/data/dsc1_config/
向备库传输: scp dmmal.ini 192.168.93.103:/dbdata/DAMENG/
4.6 配置 dmarch.ini
再次编辑各个节点的 dmarch.ini 文件,增加实时归档配置
(1)DSC节点0上新增:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = EP01
(2)DSC节点1上新增
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = EP01
(3)备库节点上创建归档
cd /dbdata/DAMENG
vi dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dbdata/DAMENG/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = DSC0/DSC1
4.7配置 dmwatcher.ini
(1)配置 DSC0 的 dmwatcher.ini 文件
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = MANUAL #手动切换模式
DW_ERROR_TIME = 60 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 35 #本地实例故障认定时间
INST_INI = /home/data/ dsc0_config/dm.ini #dm.ini 配置文件路径
DCR_INI = /home/data/dmdcr.ini #dmdcr.ini 配置文件路径
INST_OGUID = 1000 #守护系统唯一 OGUID 值
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
INST_AUTO_RESTART = 0 #关闭实例的自动启动功能
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
(2)配置 DSC1 的 dmwatcher.ini 文件
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = MANUAL #手动切换模式
DW_ERROR_TIME = 60 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 35 #本地实例故障认定时间
INST_INI = /home/data/ dsc1_config/dm.ini #dm.ini 配置文件路径
DCR_INI = /home/data/dmdcr.ini #dmdcr.ini 配置文件路径
INST_OGUID = 1000 #守护系统唯一 OGUID 值
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
INST_AUTO_RESTART = 0 #关闭实例的自动启动功能
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
(3)配置EP01的 dmwatcher.ini 文件
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = MANUAL
DW_ERROR_TIME = 60
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 35
INST_INI = /dbdata/DAMENG/dm.ini
INST_OGUID = 1000
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver
INST_AUTO_RESTART = 0 #对单节点,如果需要打开自动拉起功能 将此配置修改为1即可
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
4.8配置 dmmonitor.ini
任意选择一台机器作为监视器机器(通常装在备库),也可以另找一台新机器装监视器。
vi /dbdata/DAMENG/dmmonitor.ini
MON_LOG_PATH = /dbdata/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 64
MON_LOG_SPACE_LIMIT = 0
MON_DW_CONFIRM = 0
[GRP1]
MON_INST_OGUID = 1000
#IP 对应 dmmal.ini 中的 MAL_HOST , PORT 对应 MAL_DW_PORT
MON_DW_IP = 192.168.93.101:3567/192.168.93.102: 3567
MON_DW_IP = 192.168.93.103:3567
4.9启动实例
注意实例都要使用 Mount 方式启动。
1.启动 DMDSC 集群的两个 dmserver 实例
cd /home/dmdba/dmdbms/bin
./dmserver /home/data/ dsc0_config/dm.ini dcr_ini=/home/data/dmdcr.ini mount
./dmserver /home/data/ dsc1_config/dm.ini dcr_ini=/home/data/dmdcr.ini mount
2.启动单节点的备库
./dmserver /dbdata/DAMENG/dm.ini mount
注意:这里如果只启动一个集群节点可能卡着起不来,然后将另一节点也开启,第一个节点就会启动成功了。
4.10 设置 OGUID,数据库模式
登录集群中任一节点disql执行:
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> ALTER DATABASE PRIMARY;
SQL>SP_SET_OGUID(1000);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
连接单节点备库执行:
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> ALTER DATABASE STANDBY;
SQL>SP_SET_OGUID(1000);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
4.11启动守护进程和监视器
启动集群的守护进程:
./dmwatcher /home/data/dsc0_config/dmwatcher.ini
./dmwatcher /home/data/dsc1_config/dmwatcher.ini
启动备库的守护进程:
./dmwatcher /dbdata/DAMENG/dmwatcher.ini
启动备库监视器:
./dmmonitor path=/dbdata/DAMENG/dmmonitor.ini
show global info 显示所有组的全局信息
choose switchover 查看可切换为Primary库的备库列表;
至此 DMDSC 集群的实时数据守护系统搭建完毕,在搭建步骤和各项配置都正确的情况 下,在监视器上执行 show 命令,可以监控到所有实例都处于 Open 状态,所有守护进程也 都处于 Open 状态,即为正常运行状态。
5.故障切换测试
测试环境信息:
IP 地址 |
节点 |
角色 |
守护进程切换模式 |
监视器 |
192.168.111.161 |
DSC0 |
PRIMARY |
手动 |
非确认监视器 |
192.168.111.162 |
DSC1 | |||
192.168.111.163 |
DSC2 | |||
192.168.111.164 |
DW |
STANDBY |
DM8安装包:
主备模式: realtime 实时归档 + 强一致性模式;
具体测试点如下:
节点DSC0-DSC1-DSC2 —> DW01
序号 |
测试指标 |
具体要求 和 目标 |
验证结果 |
结果概述 |
1 |
DSC单节点故障 |
单个DSC节点故障不影响系统整体可用性,如DSC单节点进程被杀。单个DSC故障应是DSC集群内部故障处理; |
通过 |
单节点故障后,dsc集群恢复正常使用约需要1分钟左右,如果节点上有大量事务,时间将延长 |
2 |
DSC多节点故障 |
DSC节点(不包括DW节点)全部被kill掉,验证是否可以手动切换到DW节点(强制还是非强制切换),并验证切换到DW节点后能否继续提供服务; |
通过 |
dsc所有节点断心跳网,可以通过takeover将备库切换为主库继续提供服务。但在dsc集群心跳网恢复后,整个dsc+dw集群进入了组分裂状态(高性能模式) |
3 |
DW节点故障 |
DW节点故障不影响DSC节点提供服务; |
通过 |
不影响dsc集群正常使用 |
5.1正常切换主备库
注意:
正常switchover时,dsc集群的控制节点必须是0号节点,否则主备切换时会报错!
具体如下:
1、 查看当前集群状态均正常,但控制节点是DSC1,而不是DSC0
select * from v$dsc_ep_info;
2、执行切换
切换失败,打印信息如下:
下面是切换失败时的报错信息:
[monitor] 2021-05-17 14:50:35: Instance DSC1[PRIMARY & MOUNT, ISTAT_SAME:TRUE,
dmwatcher status:SWITCHOVER, inst_stat:OK] exec error, code = -2056
3、将dsc控制节点切换到0号节点
4、再执行切换
打印信息部分如下:
5、查看集群信息,dsc集群已经变为备库模式
5.2单节点故障
结果: 只要dsc集群内还有至少一个正常节点,都可以正常使用( 剩余节点响应时间大约需1分钟恢复),
故障节点恢复后会自动加入集群提供服务。
如下测试为kill单个节点,然后迅速在其他节点上执行事务,记录事务执行所需要的时间
情况一:被kill的节点上无事务
其他节点执行事务大约50秒后执行成功:
情况二:被kill的节点上有事务
(事务为插入1000行数据)
其他节点执行事务大约60秒后执行成功,被kill节点的上的事务被回滚。
单节点故障信息:DSC0处于ERROR状态:
此时两节点的DSC运行正常,主备同步也正常。 但是由于DSC0不是控制节点,因此无法切换。
5.3集群故障,强制切换
在dsc三个节点都故障时,需要将集群的三个节点全部恢复正常。
注意: 如果仅恢复一个节点,集群仍然无法使用
1、 尝试switchover切换到dw备库上失败,提示没有可以切换的实例。
2、 使用takeover可以切换成功(使用的归档类型为realtime实时归档 + 强一致性模式),
但是两边都显示为主库:
由于这里的dsc已经挂掉了 无法写入数据,只有强制切换为主节点的备库( 164 主机)可以写入数据。
在备库上执行insert,结果正常:
3、手动将dsc的各个节点开启,集群恢复后自动变为STANDBY模式:
4、在STANDBY模式的集群中,可以查到之前插入的数据:
5.4 关于takeover说明
1、如果集群是正常shutdown immediate,则无法使用takeover,提示如下:
2、 归档一定要开启【强一致性模式】,开启方法:dmarch.ini中添加 ARCH_WAIT_APPLY=1
由于在takeover过程中可能存在丢失数据的风险,需尽量避免。
如果使用 takeover force 强制接管,虽然可以切换成功,但是在 dsc 集群从故障中恢复后,整个 dsc+dw 集群会变为组分裂状态(使用的归档类型为 realtime 实时归档 + 高性能模式),因此要使用强一致性模式,避免组分裂;
3、在高性能模式下(实时归档时默认为该模式),dsc集群所有节点心跳网络故障时,主库和备库的通信失败,但是在故障的短期几秒内,主库服务并未故障,这期间可以执行事务,但是该事务已经无法同步到备库,在takeover切换后,新的主库无法看到网络故障时执行成功的事务。
如下为切换步骤:
1、在dsc集群故障后尝试执行正常切换,失败:
2、执行故障切换:
执行故障切换成功
3、切换后原备库变为主库,且状态正常:
DSC集群仍为故障状态:
4、在新的主库上插入数据正常:
5、在dsc集群恢复后,整个dsc+dw集群系统进入了组分裂状态
组分裂解决方法:
1、在asm的数据磁盘组上找到dmwatcher.ctl文件,将该文件删除;
2、关闭主库,完整备份主库的数据,还原到dsc集群中,然后重搭主备;
5.5.切换总结
1、 在dsc+dw整个集群正常状态下,可以通过switchover来进行主备切换,但切换的前提是dsc集群的控制节点必须是0号节点。
2、 dsc+dw集群中,dsc任何一个节点或多个节点故障(包括控制节点故障,dw备库和dsc某几个节点同时故障),只要dsc集群内还有至少一个正常节点,dsc集群都可以正常使用。故障节点恢复后会自动加入集群,提供服务,dw节点恢复后会自动同步故障期间主库上的数据。
3、 dsc集群所有节点故障,这时如果要将备库切换为主库,需使用takeover进行切换(不需要force选项),切换时已提交的事务不会丢失(前提是强一致性模式),切换后dw变为主库,可以正常提供服务。当dsc集群数据库服务恢复正常后,dm系统会自动将dsc集群作为备库加入到整个dsc+dw集群中,并从主库上同步故障期间的数据,数据同步完成后,可以执行switchover将dsc集群切换为主库。如果使用的是高性能模式,在dsc集群恢复后可能会出现组分裂情况。
4、 与普通dw集群不同,dsc+dw集群默认情况下是高性能模式,该模式在takeover切换后可能会出现组分裂的情况。
5、 建议使用事务一致性模式,事务一致性模式在takeover后,dsc恢复后系统会自动将dsc转换为备库状态,避免组分裂,并从主库同步数据。
开启事务一致性模式:在dmarch.ini文件中加入:ARCH_WAIT_APPLY = 1
6、 当dsc集群心跳网络故障时,控制节点会保持数据库服务正常可用状态,其他节点的dmserver和asm会故障,这时需注意不要takeover将dw切换为主库,因为这时可用的控制节点可以执行事务,如果此时执行了事务,再将dw切换为主库,在dsc集群恢复后,会进入组分裂状态。这种情况下可先恢复网络,然后在重启dsc数据库服务,重启恢复后,集群会自动同步故障期间在存活的控制节点上更新的数据。