达梦DSC集群+数据守护搭建及故障切换

本篇主要介绍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 
内部 络: 172.16.1.81

DSC0

CentOS7

5236

8330

db2

外部 络: 192.168.93.102 
内部 络: 172.16.1.82

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
 
内部 络: 172.16.1.81

DSC0

CentOS7

5236

8330

db2

外部 络: 192.168.93.102
 
内部 络: 172.16.1.82

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数据库服务,重启恢复后,集群会自动同步故障期间在存活的控制节点上更新的数据。

 


请使用浏览器的分享功能分享到微信等