DM数据库学习之路(六)DM8RWC读写分离集群部署及切换测试

1.引言

读写分离集群由一个主库以及一个或者多个配置了即时(Timely)归档或实时(Realtime)归档的备库组成,其主要目标是在保障数据库可用性基础上,实现读、写操作的自动分离,进一步提升数据库的业务支撑能力。读写分离集群通过配置事务一致模式保证主、备库数据一致性,并配合达梦数据库管理系统的各种接口(JDBC、DPI等),将只读操作自动分流到备库,有效降低主库的负载,提升系统吞吐量。

2.概述

DM读写分离集群的实现原理非常简单:将主库(生产库)产生的 Redo 日志传输到备库,备库接收并重新应用 Redo 日志,从而实现备库与主库的数据同步。DM数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 Redo 日志传输与重演过程中出现的各种异常情况提供一系列的解决方案。

DM 数据守护系统主要由主库、备库、Redo 日志、Redo 日志传输、Redo 日志重演、守护进程(dmwatcher)、监视器(dmmonitor)组成。架构如下:

  • 数据库

数据库(Database)是一个文件集合(包括数据文件、临时文件、重做日志文件和控制文件),保存在物理磁盘或文件系统中。

  • 数据库实例

数据库实例(Instance)就是一组操作系统进程(或者是一个多线程的进程)以及一些内存。通过数据库实例,可以操作数据库,一般情况下,我们访问、修改数据库都是通过数据库实例来完成的。

  • 主库

Primary 模式,提供完整数据库服务的实例,一般来说主库是用来直接支撑应用系统的生产库。

  • 备库

Standby 模式,提供只读数据库服务的实例。备库除了用于容灾,还可以提供备份、查询等只读功能,并且备库还支持临时表的 Insert/Delete/Update 操作。

备库支持临时表修改主要基于两个因素:1.临时表数据的修改不会产生 Redo 日志,主库对临时表的修改无法同步到备库;2.可以提供更大灵活性,适应更多应用场景。

根据数据同步情况,备库又可以分为可切换备库和不可切换备库。可切换备库是指,主备库之间数据完全同步,主库发生故障、备库切换为主库后,不会造成任何数据丢失的备库。

  • Redo 日志

Redo 日志记录物理数据页内容变动情况,是数据库十分重要的一个功能,在数据库系统故障(比如服务器掉电)重启时,利用 Redo 日志可以把数据恢复到故障前的状态。

Redo 日志也是数据守护的实现基础,数据库中 Insert、Delete、Update 等 DML 操作以及 Create TABLE 等 DDL 操作最终都会体现为对某一个或者多个物理数据页的修改,因此备库通过重做 Redo 日志可以与主库数据保持一致。

  • Redo 日志传输

主备库之间的 Redo 日志传输,以日志包 RLOG_PKG 为单位,主库通过 MAL 系统发送 Redo 日志到备库。各种不同数据守护类型的区别,就在于主库日志包 RLOG_PKG 的发送时机,以及备库收到 Redo 日志后的处理策略。

  • Redo 日志重演

Redo 日志重演的过程,就是备库收到主库发送的 Redo 日志后,在物理数据页上,重新修改数据的过程。Redo 日志重演由专门的 Redo 日志重演服务完成,重演服务严格按照 Redo 日志产生的先后顺序,解析 Redo 日志、修改相应的物理数据页,并且重演过程中备库会生成自身的 Redo 日志写入联机日志文件。

  • MAL 系统

MAL 系统是基于 TCP 协议实现的一种内部通信机制,具有可靠、灵活、高效的特性。DM 通过 MAL 系统实现 Redo 日志传输,以及其他一些实例间的消息通讯。

  • 守护进程

守护进程(dmwatcher)是数据守护系统的核心工具。

  1. 监控数据库实例的运行状态和主备库数据同步情况,在出现故障时启动各种处理预案。
  2. 守护进程是各种消息的中转站,接收数据库实例、其他守护进程、以及监视器发送的各种消息;
  3. 同时,守护进程也会将收到的数据库实例消息转发给其他守护进程和监视器。
  4. 守护进程必须和被守护的数据库实例部署在同一台机器上。
  • 监视器

监视器(dmmonitor)用来监控守护系统内守护进程、数据库实例信息,执行用户输入命令、监控实例故障、实现自动切换等。监视器一般配置在数据库实例和守护进程以外的机器上。

  1. 归档模式
  2. 实时归档模式

实时归档(Realtime)将主库产生的Redo 日志通过 MAL 系统传递到备库,实时归档是实时主备和 MPP 主备的实现基础。实时归档只在主库生效,一个主库可以配置 1~8 个实时备库。

实时归档的执行流程是,主库在 Redo 日志(RLOG_PKG)写入联机日志文件前,将Redo 日志发送到备库,备库收到 Redo 日志(RLOG_PKG)后标记为 KEEP_RLOG_PKG,将原 KEEP_RLOG_PKG 加入日志重演任务系统,并马上响应主库,不需要等待 Redo 日志重演结束后再响应主库。主库收到备库的响应消息,确认备库已经收到 Redo 日志后,再将Redo 日志写入联机日志文件中。

实时归档分为两种模式:

  1. 事务一致模式

主库事务提交触发 Redo 日志刷盘和即时归档,备库收到主库发送的 Redo 日志,并重演完成后再响应主库。主库收到备库响应消息后,再响应用户的提交

请求。事务一致模式下,同一个事务的 SELECT 语句无论是在主库执行,还是在备库执行,查询结果都满足 READ COMMIT 隔离级要求。

可以通过 dmarch.ini 中的 ARCH_WAIT_APPLY 或 WAIT_APPLY 配置项来设置实时归档的模式。ARCH_WAIT_APPLY 配置项默认值为 1,即采用事务一致模式。

  1. 高性能模式

备库收到主库发送的 Redo 日志后,马上响应主库,再启动日志重演。高性能模式下,备库与主库的数据同步存在一定延时(一般情况下延迟时间非常短暂,用户几乎感觉不到),不能严格保证事务一致性。

事务一致模式下,主备库之间严格维护事务一致性,但主库要等备库 Redo 日志重演完成后,再响应用户的提交请求,事务提交时间会变长,存在一定的性能损失。高性能模式则通过牺牲事务一致性获得更高的性能和提升系统的吞吐量。用户应该根据实际情况,选择合适的即时归档模式。

可以通过 dmarch.ini 中的 ARCH_WAIT_APPLY 或 WAIT_APPLY 配置项来设置实时归档的模式。ARCH_WAIT_APPLY 配置项默认值为 0,即采用高性能模式。

  1. 即时归档模式

即时归档(Timely)在主库将 Redo 日志写入联机日志文件后,通过 MAL 系统将 Redo日志发送到备库。即时归档与实时归档的主要区别是 Redo 日志的发送时机不同。一个主库可以配置 1~8 个即时备库。

根据备库重演 Redo 日志和响应主库时机的不同,即时归档分为两种模式:

  1. 事务一致模式

主库事务提交触发 Redo 日志刷盘和即时归档,备库收到主库发送的 Redo 日志,并重演完成后再响应主库。主库收到备库响应消息后,再响应用户的提交

请求。事务一致模式下,同一个事务的 SELECT 语句无论是在主库执行,还是在备库执行,查询结果都满足 READ COMMIT 隔离级要求。

可以通过 dmarch.ini 中的 ARCH_WAIT_APPLY 或 WAIT_APPLY 配置项来设置实时归档的模式。ARCH_WAIT_APPLY 配置项默认值为 1,即采用事务一致模式。

  1. 高性能模式

备库收到主库发送的 Redo 日志后,马上响应主库,再启动日志重演。高性能模式下,备库与主库的数据同步存在一定延时(一般情况下延迟时间非常短暂,用户几乎感觉不到),不能严格保证事务一致性。

事务一致模式下,主备库之间严格维护事务一致性,但主库要等备库 Redo 日志重演完成后,再响应用户的提交请求,事务提交时间会变长,存在一定的性能损失。高性能模式则通过牺牲事务一致性获得更高的性能和提升系统的吞吐量。用户应该根据实际情况,选择合适的即时归档模式。

可以通过 dmarch.ini 中的 ARCH_WAIT_APPLY 或 WAIT_APPLY 配置项来设置实时归档的模式。ARCH_WAIT_APPLY 配置项默认值为 0,即采用高性能模式。

  1. 异步归档模式

异步归档(Async)由主、备库上配置的定时器触发,根据异步备库的 KEEP LSN 信息,扫描本地归档目录获取 Redo 日志,并通过 MAL 系统将 Redo 日志发送到异步备库。异步备库的 Redo 日志重演过程与实时归档等其他类型的归档完全一致。

每个 Primary 或 Standby 模式的数据库最多可以配置 8 个异步备库,Normal 模式下配置的异步备库会自动失效。异步备库可以级联配置,异步备库本身也可以作为源库配置异步备库。

  1. 同步归档模式

同步归档(Sync)在主库归档日志刷盘后,通过 MAL 系统将 Redo 日志发送到备库。同步备库的 Redo 日志重演过程与实时归档等其他类型的归档完全一致。一个主库可以配置1~8 个同步备库。

同步归档的执行流程为:主库在归档日志刷盘后,将 Redo 日志发送到备库,备库收到Redo 日志(RLOG_PKG)后,将其加入日志重演任务系统,并马上响应主库,不需要等待Redo 日志重演结束后再响应主库。

  1. 归档状态

本地归档、实时归档和即时归档均包含两种状态:Valid 和 Invalid。

异步归档只有一种归档状态:Valid。

同步备库有三种归档状态:Valid,Invalid 和 Async_send。

  Valid  归档有效,正常执行各种数据库归档操作。

  Invalid 归档无效,主数据库不发送联机 Redo 日志到备数据库。

  Async_send 归档无效,但主库正在同步历史数据到同步备库。

在不同的归档类型中,归档状态转换时机不同。具体转换时机描述如下:

1.  主备库启动后,主库到所有备库的归档默认为 Valid 状态,守护进程 Open 主库前,根据主备库日志同步情况,将数据不一致备库的归档修改为 Invalid 状态。

2.  实时备库和即时备库故障恢复,从主库同步历史数据后,守护进程将主库修改为Suspend 状态,并将主库到备库的归档状态从 Invalid 修改为 Valid。当守护进程再次 Open主库后,主备库数据重新恢复为一致状态。

3.  同步备库故障恢复,主库开始同步历史数据时,将备库归档状态从 Invalid 修改为Async_send,中间会将日志刷盘线程挂起确保备库能够追到和主库数据完全一致,并将主库到备库的归档状态从 Async_send 修改为 Valid,然后唤醒日志刷盘线程,主备库数据重新恢复为一致状态。

4.  主库发送日志到实时备库失败挂起,守护进程处理 Failover 过程中,将主库到备库的归档状态修改为 Invalid。

5.  主库发送即时归档失败后,直接将主库到备库的归档改为 Invalid 状态。

6.  主库发送同步归档失败后,直接将主库到备库的归档改为 Invalid 状态,并且不会有主库切换到 Suspend 状态的过程。

7.  异步归档始终保持 Valid 状态,一旦归档失败马上返回,等待下一次触发再继续发送。

8.  主库发现同步备库归档状态为 Invalid,且满足同步备库故障恢复的条件时,将主库到备库的归档状态从 Invalid 改为 Async_send,并开始同步历史数据到备库,同步完成后会将备库归档状态从 Async_send 修改为 Valid 有效状态。

说明:实时归档、即时归档只对Primary模式的主库有效,备库上配置的实时归档、持 即时归档状态没有实际意义,始终保持Valid状态。

  1. 归档类型比较

类型/比较

本地归档

实时归档

即时归档

异步归档

同步归档

备库数量

0

1-8

1-8

1-8

1-8

通过 MAL 传递数据

归档时机

写入联机日志后,再

写入本地归档日志

文件

写入联机日志前,发

送到备库

写入联机日志后,发

送到备库

定时启动

写入归档日志后,

发送到备库

归档写入(发

送)

归档线程

日志刷盘线程

日志刷盘线程

异步归档线程 

归档线程

数据来源

RLOG_PKG

RLOG_PKG

RLOG_PKG

本地归档文件

RLOG_PKG

失败处理

磁盘空间不足时,系

统挂起等待用户释

放出足够的磁盘空

间。

磁盘损坏导致写入

失败时,系统会强制HALT

Suspend 数据库,保持归档状态不变,等待守护进程干预

Suspend数据库,并设置归档为无效状态,等待守护进程干预

不做处理,等待下次触发继续发送

直接设置归档状态为无效,不会Suspend 数据库

备库响应时机

事务一致模式:重演

完成后响应;

高性能模式:收到立

即响应

事务一致模式:重演

完成后响应;

高性能模式:收到立

即响应

收到立即响应

收到立即响应

源库模式

Primary

Standby

Normal

Primary

Primary

Primary

Standby

Primary

目标库模式

Standby

Standby

Standby

Standby

注意:任意一个备库的实时归档/即时归档失败(即使其他备库归档成功了),主库为都会切换为Suspend状态。

  1. 读写分离方案

配置读写分离集群,有以下几种配置方案,可以根据实际情况部署:

1.  1个主库和最多8个即时备库。

2.  1个主库和最多8个实时备库。

3.  1个主库和最多8个异步备库。

4.  配置主库、最多8个即时备库和最多 8 个异步备库。

5.  配置主库、最多8个实时备库和最多 8 个异步备库。

在实际应用中,如果数据库规模很大,并且对数据的实时性要求不是很严格,则可以配置多个异步备库用于分担统计报表等任务。

  1. DataWatch方案比较

读写分离集群与主备集群的主要区别:

  1. 适用场景不同

备份容灾/负载均衡

  1. 归档方式不同

realtime/timely

  1. 应用访问连接串不同

jdbc:dm//omstest?rwseparate=1&rwPercent=25

  1. 读写分离集群部署
    1. 集群部署规划
      1. 集群主机规划

类型

主机名

业务IP

数据库名

实例名

操作系统

主库

dm8dw01

84.0.191.21

10.10.10.21

CUGDB

CUGDB01

Kylin-Server-V10-SP3

备库

dm8dw02

84.0.191.22

10.10.10.22

CUGDB

CUGDB02

Kylin-Server-V10-SP3

备库

dm8dw03

84.0.191.23

10.10.10.23

CUGDB

CUGDB03

Kylin-Server-V10-SP3

监控

dm8monitor

10.10.10.8

Kylin-Server-V10-SP3

组名为GRP1,主库为:CUGDB01,备库1为:CUGDB02,备库2为:CUGDB03

      1. 集群端口规划

实例名

PORT_NUM

MAL_INST_DW_PORT

MAL_HOST

MAL_PORT

MAL_DW_PORT

CUGDB01

5236

5336

10.10.10.21

5436

5536

CUGDB02

5236

5336

10.10.10.22

5436

5536

CUGDB03

5236

5336

10.10.10.7

5436

5536

      1. 集群目录规划

类型

实例端口

实例

目录

归档

目录

日志

目录

备份

目录

主库

5236

/dm8/data/CUGDB

/dm8/data/arch

/dm8/data/log

/dm8/data/backup

备库

5236

/dm8/data/CUGDB

/dm8/data/arch

/dm8/data/log

/dm8/data/backup

备库

5236

/dm8/data/CUGDB

/dm8/data/arch

/dm8/data/log

/dm8/data/backup

    1. 集群部署准备
      1. hosts配置

#  cat /etc/hosts

84.0.191.21 dm8dw01

10.10.10.21 dm8dw01prv

84.0.191.22 dm8dw02

84.0.191.22 dm8dw02prv

84.0.191.23 dm8dw03

10.10.10.23 dm8dw03prv

10.10.10.8  dm8monitor

      1. 关闭防火墙

systemctl stop firewalld

systemctl disable firewalld

sed -i '/^SELINUX=.*/ s//SELINUX=disabled/' /etc/selinux/config

setenforce 0

      1. sysctl.conf参数配置

##添加配置:

cat >> /etc/systemd/system.conf << EOF

DefaultLimitNOFILE=65536

DefaultLimitNPROC=10240

EOF

      1. limits.conf 参数配置

cat >> /etc/security/limits.conf << EOF

dmdba soft nproc 10240

dmdba hard nproc 10240

dmdba soft nofile 65536

dmdba hard nofile 65536

dmdba  hard  stack  32768

dmdba  soft  stack  16384

dmdba hard data unlimited

dmdba soft data unlimited

dmdba hard fsize unlimited

dmdba soft fsize unlimited

dmdba soft core unlimited

dmdba hard core unlimited

EOF

参数说明:

core - 限制内核文件的大小(KB)

nproc 对每个用户创建的进程数的限制,默认的很小,泄露的时候多

nofile-一个进程能打开的文件数

stack堆大小,堆-存放变量的位置

重启后验证limit参数:

su - dmdba

ulimit -a  ## 确认是否生效

      1. nproc.conf参数配置

其中麒麟 10 中是 nproc.conf;

##添加配置:

cat >> /etc/security/limits.d/nproc.conf << EOF

dmdba soft nproc 65536

dmdba hard nproc 65536

EOF

参数说明:

soft 表示软限制,hard 表示硬限制,nproc 进程数,nofile 文件数

##确定是否生效:

$ ulimit -u

10240

      1. 建用户

groupadd dinstall

useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba

passwd dmdba

      1. 配置环境变量

su – dmdba

vi .bash_profile

export DM_HOME=/dm8/dmdbms

export PATH=$DM_HOME/bin:$PATH:$DM_HOME/tool:$PATH:HOME/bin:/usr/local/bin

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DM_HOME/bin

. .bash_profile 让其生效

      1. 建安装目录

##主备库

mkdir -p /dm8/dmdbms

mkdir -p /dm8/data/arch

mkdir -p /dm8/data/log

mkdir -p /dm8/data/backupon

chown -R dmdba:dinstall /dm8

chmod 755 -R /dm8

##monitor

mkdir -p /dm8/dmdbms

mkdir -p /dm8/data/monitor

mkdir -p /dm8/data/log

chown -R dmdba:dinstall /dm8

chmod 755 -R /dm8

    1. 安装DM SOFT软件
      1. 主服务器DM SOFT安装

注:安装dm soft并初始化实例

        1. 安装dm soft

[root@dm8dw01 ~]# mount -o loop /soft/dm8_20231109_x86_kylin10_64.iso /mnt

[dmdba@dm8dw01 mnt]$ ./DMInstall.bin -i

Installer Language:

[1]: 简体中文

[2]: English

Please select the installer's language [2]:1

解压安装程序..........

欢迎使用达梦数据库安装程序

是否输入Key文件路径? (Y/y:是 N/n:否) [Y/y]:n

是否设置时区? (Y/y:是 N/n:否) [Y/y]:y

设置时区:

[ 1]: (GTM-12:00) 日界线西

[ 2]: (GTM-11:00) 萨摩亚群岛

[ 3]: (GTM-10:00) 夏威夷

[ 4]: (GTM-09:00) 阿拉斯加

[ 5]: (GTM-08:00) 太平洋时间(美国和加拿大)

[ 6]: (GTM-07:00) 亚利桑那

[ 7]: (GTM-06:00) 中部时间(美国和加拿大)

[ 8]: (GTM-05:00) 东部部时间(美国和加拿大)

[ 9]: (GTM-04:00) 大西洋时间(美国和加拿大)

[10]: (GTM-03:00) 巴西利亚

[11]: (GTM-02:00) 中大西洋

[12]: (GTM-01:00) 亚速尔群岛

[13]: (GTM) 格林威治标准时间

[14]: (GTM+01:00) 萨拉热窝

[15]: (GTM+02:00) 开罗

[16]: (GTM+03:00) 莫斯科

[17]: (GTM+04:00) 阿布扎比

[18]: (GTM+05:00) 伊斯兰堡

[19]: (GTM+06:00) 达卡

[20]: (GTM+07:00) 曼谷,河内

[21]: (GTM+08:00) 中国标准时间

[22]: (GTM+09:00) 首尔

[23]: (GTM+10:00) 关岛

[24]: (GTM+11:00) 所罗门群岛

[25]: (GTM+12:00) 斐济

[26]: (GTM+13:00) 努库阿勒法

[27]: (GTM+14:00) 基里巴斯

请选择时区 [21]:21

安装类型:

1 典型安装

2 服务器

3 客户端

4 自定义

请选择安装类型的数字序号 [1 典型安装]:1

所需空间: 2037M

请选择安装目录 [/home/dmdba/dmdbms]:/dm8/dmdbms

可用空间: 46G

是否确认安装路径(/dm8/dmdbms)? (Y/y:是 N/n:否)  [Y/y]:y

安装前小结

安装位置: /dm8/dmdbms

所需空间: 2037M

可用空间: 46G

版本信息:

有效日期:

安装类型: 典型安装

是否确认安装? (Y/y:是 N/n:否):y

2024-01-10 11:33:03

[INFO] 安装达梦数据库...

2024-01-10 11:33:04

[INFO] 安装 基础 模块...

2024-01-10 11:33:10

[INFO] 安装 服务器 模块...

2024-01-10 11:33:11

[INFO] 安装 客户端 模块...

2024-01-10 11:33:13

[INFO] 安装 驱动 模块...

2024-01-10 11:33:16

[INFO] 安装 手册 模块...

2024-01-10 11:33:16

[INFO] 安装 服务 模块...

2024-01-10 11:33:17

[INFO] 移动日志文件。

2024-01-10 11:33:17

[INFO] 安装达梦数据库完成。

请以root系统用户执行命令:

/dm8/dmdbms/script/root/root_installer.sh

安装结束

[root@dm8dw01 ~]# /dm8/dmdbms/script/root/root_installer.sh

移动 /dm8/dmdbms/bin/dm_svc.conf 到/etc目录

创建DmAPService服务

Created symlink /etc/systemd/system/multi-user.target.wants/DmAPService.service → /usr/lib/systemd/system/DmAPService.service.

创建服务(DmAPService)完成

启动DmAPService服务

        1. 初始化数据库

##创建实例

[root@dm8dw01 ~]#  su - dmdba

[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/dminit path=/dm8/data EXTENT_SIZE=16 PAGE_SIZE=32 case_sensitive=1 charset=1 log_size=2048 db_name=CUGDB instance_name=CUGDB01 PORT_NUM=5236 LENGTH_IN_CHAR=1 BLANK_PAD_MODE=0 SYSDBA_PWD="SYSDBA2023" SYSAUDITOR_PWD="SYSDBA2023" ELOG_PATH=/dm8/data/log

##初始化

[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/dmserver /dm8/data/CUGDB/dm.ini

file dm.key not found, use default license!

version info: develop

Use normal os_malloc instead of HugeTLB

Use normal os_malloc instead of HugeTLB

DM Database Server x64 V8 1-1-72-20.04.03-119959-ENT  startup...

....

systables desc init success.

ndct_db_load_info success.

nsvr_process_before_open begin.

nsvr_process_before_open success.

total 0 active crash trx, pseg_crash_trx_rollback begin ...

pseg_crash_trx_rollback end

SYSTEM IS READY.  ##表示成功

对于新初始化的库需要先正常启动并正常退出,然后才允许mount方式启动。

使用dminit初始化的实例,需要先前台起一次数据库服务,出现system is ready后输入exit停止数据库。

        1. 注册服务并启动实例

[root@dm8dw01 ~]# /dm8/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /dm8/data/CUGDB/dm.ini -p CUGDB

[root@dm8dw01 ~]# systemctl start DmServiceCUGDB

        1. 开启主库归档

[dmdba@dm8dw01 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236

//切换数据库到配置状态

SQL> alter database mount;

//设置本地归档,归档路径,归档尺寸

SQL> alter database add ARCHIVELOG 'type=local,dest=/dm8/data/arch,file_size=1024,space_limit=0';

//开启归档

SQL> alter database ARCHIVELOG;

//打开数据库

SQL> alter database open;

SQL> select arch_mode from v$database;

LINEID     ARCH_MODE

---------- ---------

Y

说明:

space_limit参数对应dmarch.ini中ARCH_SPACE_LIMIT参数。

该参数表示归档文件的磁盘空间限制,如果归档文件总大小超过这个值,则在生成新归档文件前会删除最老的一个归档文件。

如果在设置时,该参数设置为0表示不受限制。

      1. 1服务器DM SOFT安装

安装dm soft并初始化实例

        1. 安装dm soft

同上

        1. 初始化数据库

##创建实例

[root@dm8dw02 ~]#  su - dmdba

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dminit path=/dm8/data EXTENT_SIZE=16 PAGE_SIZE=32 case_sensitive=1 charset=1 log_size=2048 db_name=CUGDB instance_name=CUGDB02 PORT_NUM=5236 LENGTH_IN_CHAR=1 BLANK_PAD_MODE=0 SYSDBA_PWD="SYSDBA2023" SYSAUDITOR_PWD="SYSDBA2023" ELOG_PATH=/dm8/data/log

##初始化

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmserver /dm8/data/CUGDB/dm.ini

        1. 注册服务并启动实例

[root@dm8dw02 ~]# /dm8/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /dm8/data/CUGDB/dm.ini -p CUGDB

[root@dm8dw01 ~]# systemctl start DmServiceCUGDB

        1. 开启主库归档

[dmdba@dm8dw01 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236

//切换数据库到配置状态

SQL> alter database mount;

//设置本地归档,归档路径,归档尺寸

SQL> alter database add ARCHIVELOG 'type=local,dest=/dm8/data/arch,file_size=1024,space_limit=0';

//开启归档

SQL> alter database ARCHIVELOG;

//打开数据库

SQL> alter database open;

SQL> select arch_mode from v$database;

LINEID     ARCH_MODE

---------- ---------

Y

      1. 2服务器DM SOFT安装

安装dm soft并初始化实例

        1. 安装dm soft

同上

        1. 初始化数据库

##创建实例

[root@dm8dw02 ~]#  su - dmdba

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dminit path=/dm8/data EXTENT_SIZE=16 PAGE_SIZE=32 case_sensitive=1 charset=1 log_size=2048 db_name=CUGDB instance_name=CUGDB03 PORT_NUM=5236 LENGTH_IN_CHAR=1 BLANK_PAD_MODE=0 SYSDBA_PWD="SYSDBA2023" SYSAUDITOR_PWD="SYSDBA2023" ELOG_PATH=/dm8/data/log

##初始化

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmserver /dm8/data/CUGDB/dm.ini

        1. 注册服务并启动实例

[root@dm8dw02 ~]# /dm8/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /dm8/data/CUGDB/dm.ini -p CUGDB

[root@dm8dw01 ~]# systemctl start DmServiceCUGDB

        1. 开启主库归档

[dmdba@dm8dw01 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236

//切换数据库到配置状态

SQL> alter database mount;

//设置本地归档,归档路径,归档尺寸

SQL> alter database add ARCHIVELOG 'type=local,dest=/dm8/data/arch,file_size=1024,space_limit=0';

//开启归档

SQL> alter database ARCHIVELOG;

//打开数据库

SQL> alter database open;

SQL> select arch_mode from v$database;

LINEID     ARCH_MODE

---------- ---------

Y

      1. 监控服务器DM SOFT安装

只安装dm soft不初始化实例

同上

    1. DMRMAN备份主库并恢复备库
      1. 确认主库 dmap 是否启动

[dmdba@dm8dw01 ~]$ ps -ef|grep dmap

若未启动,则先启动 DMAP 服务

[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/DmAPService start

Starting DmAPService:                                      [ OK ]

      1. 方法一:脱机备份、脱机还原方式
  1. 正常关闭主机数据库

[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop

  1. 进行脱机备份

[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="BACKUP DATABASE '/dm8/data/CUGDB/dm.ini' FULL BACKUPSET '/dm8/data/backup'"

  1. 拷贝备份文件到备库所在机器

[dmdba@dm8dw01 ~]$ scp -rp /dm8/data/backup/* 84.0.191.22:/dm8/data/backup

  1. 执行脱机数据库还原与恢复

备库1数据库还原:

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/CUGDB/dm.ini' FROM BACKUPSET  '/dm8/data/backup'"

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/CUGDB/dm.ini' UPDATE DB_MAGIC"

备库2数据库还原:

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/CUGDB/dm.ini' FROM BACKUPSET  '/dm8/data/backup'"

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/CUGDB/dm.ini' UPDATE DB_MAGIC"

      1. 方法二:联机备份、脱机还原方式
  1. 对主库进行联机备份操作

[dmdba@dm8dw01 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236

SQL> BACKUP DATABASE BACKUPSET '/dm8/back';

  1. 拷贝备份文件到备库所在机器

[dmdba@dm8dw01 ~]$ scp -rp /dm8/back/* 84.0.191.22:/dm8/back

  1. 执行脱机数据库还原与恢复

备库1数据库还原:

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/CUGDB/dm.ini' FROM BACKUPSET '/dm8/back'"

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/CUGDB/dm.ini' FROM BACKUPSET '/dm8/back'"

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/CUGDB/dm.ini' UPDATE DB_MAGIC"

备库2数据库还原:

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/CUGDB/dm.ini' FROM BACKUPSET '/dm8/back'"

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/CUGDB/dm.ini' FROM BACKUPSET '/dm8/back'"

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/CUGDB/dm.ini' UPDATE DB_MAGIC"

    1. 配置主备库参数文件
      1. 配置文件说明

与 DM 数据守护相关的配置文件包括:

  数据库配置文件 dm.ini

  数据库控制文件 dm.ctl

  MAL 配置文件 dmmal.ini

  Redo 日志归档配置文件 dmarch.ini

  守护进程配置文件 dmwatcher.ini

  监视器配置文件 dmmonitor.ini

  定时器配置文件 dmtimer.ini

  MPP 控制文件 dmmpp.ctl 等等

      1. 配置主库dm8dw01参数文件
        1. 配置dm.ini

在主库机器上配置主库的实例名为 CUGDB01, dm.ini 参数修改如下:

[dmdba@dm8dw01 ~]$ vi /dm8/data/CUGDB/dm.ini

INSTANCE_NAME = CUGDB01       #实例名

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次的日志发送信息

        1. 配置dmmal.ini

配置 MAL 系统,主库通过 MAL 系统发送 REDO 日志到备库

各主备库的 dmmal.ini 配置必须完全一致, MAL_HOST 使用内部网络 IP,MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值, MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:

[dmdba@dm8dw01 ~]$ vi /dm8/data/CUGDB/dmmal.ini

MAL_CHECK_INTERVAL = 5          #MAL链路检测时间间隔

MAL_CONN_FAIL_INTERVAL = 5      #判定MAL链路断开的时间

[MAL_INST1]

MAL_INST_NAME = CUGDB01     #实例名,和dm.ini中的INSTANCE_NAME一致

MAL_HOST = 10.10.10.21         #MAL系统监听TCP连接的IP地址,私网IP

MAL_PORT = 5436                 #MAL系统监听TCP连接的端口

MAL_INST_HOST = 84.0.191.21         #实例的对外服务IP地址

MAL_INST_PORT = 5236            #实例的对外服务端口,和dm.ini中的PORT_NUM一致

MAL_DW_PORT = 5536              #实例对应的守护进程监听TCP连接的端口

MAL_INST_DW_PORT = 5336         #实例监听守护进程TCP连接的端口

[MAL_INST2]

MAL_INST_NAME = CUGDB02

MAL_HOST = 10.10.10.22

MAL_PORT = 5436

MAL_INST_HOST = 84.0.191.22

MAL_INST_PORT = 5236

MAL_DW_PORT = 5536

MAL_INST_DW_PORT = 5336

[MAL_INST3]

MAL_INST_NAME = CUGDB03

MAL_HOST = 10.10.10.23

MAL_PORT = 5436

MAL_INST_HOST = 84.0.191.23

MAL_INST_PORT = 5236

MAL_DW_PORT = 5536

MAL_INST_DW_PORT = 5336

[dmdba@dm8dw01 ~]$ scp -rp /dm8/data/CUGDB/dmmal.ini 84.0.191.22:/dm8/data/CUGDB/

[dmdba@dm8dw01 ~]$ scp -rp /dm8/data/CUGDB/dmmal.ini 84.0.191.23:/dm8/data/CUGDB/

        1. 配置dmarch.ini

配置本地归档和即时归档。

除了本地归档外,其他归档配置项中的ARCH_DEST表示实例是Primary模式时,需要同步归档数据的目标实例名。

当前实例CUGDB01是主库,需要向即时备库CUGDB02/CUGDB03同步数据,因此即时归档的ARCH_DEST配置为CUGDB02和CUGDB03。

[dmdba@dm8dw01 ~]$vi /dm8/data/CUGDB/dmarch.ini

[ARCHIVE_TIMELY1]

ARCH_TYPE = TIMELY                 #即时归档类型

ARCH_DEST = CUGDB02                 #即时归档目标实例名

[ARCHIVE_TIMELY2]

ARCH_TYPE = TIMELY                 #即时归档类型

ARCH_DEST = CUGDB03                 #即时归档目标实例名

[ARCHIVE_LOCAL1]

ARCH_TYPE = LOCAL                  #本地归档类型

ARCH_DEST = /dm8/data/arch          #本地归档文件存放路径

ARCH_FILE_SIZE = 2048              #单位Mb,本地单个归档文件最大值

ARCH_SPACE_LIMIT = 0                #单位Mb,0表示无限制,范围1024~4294967294M

实时读写分离同样也支持事务一致模式和高性能模式,由配置文件 dmarch.ini 中的 ARCH_WAIT_APPLY 或 WAIT_APPLY 配置项来确定,1 表示事务一致模式,0 表示高性能模式。实时读写分离下,默认采用高性能模式

注意

实时读写分离的事务一致模式仅在数据守护配置为自动切换模式下才会生效。对于配置实时归档的DMDSC数据守护集群,不支持事务一致模式,即不支持将ARCH_WAIT_APPLY或WAIT_APPLY配置为1。

        1. 配置dmwatcher.ini

配置守护进程,配置为全局守护类型,使用自动切换模式。(主备库配置一致)

[dmdba@dm8dw01 ~]$vi /dm8/data/CUGDB/dmwatcher.ini

[GRP1]

DW_TYPE = GLOBAL                             #全局守护类型

DW_MODE = AUTO                               #自动切换模式

DW_ERROR_TIME = 10                            #远程守护进程故障认定时间

INST_RECOVER_TIME = 60                        #主库守护进程启动恢复的间隔时间

INST_ERROR_TIME = 10                          #本地实例故障认定时间

INST_OGUID = 458888                          #守护系统唯一OGUID值

INST_INI = /dm8/data/CUGDB/dm.ini             #dm.ini配置文件路径

INST_AUTO_RESTART = 1                         #打开实例的自动启动功能

INST_STARTUP_CMD = /dm8/dmdbms/bin/dmserver   #命令行方式启动

RLOG_SEND_THRESHOLD = 0          #指定主库发送日志到备库的时间阀值,默认关闭

RLOG_APPLY_THRESHOLD = 0         #指定备库重演日志的时间阀值,默认关闭

[dmdba@dm8dw01 ~]$ scp  /dm8/data/CUGDB/dmwatcher.ini 84.0.191.22:/dm8/data/CUGDB/

[dmdba@dm8dw01 ~]$ scp  /dm8/data/CUGDB/dmwatcher.ini 84.0.191.23:/dm8/data/CUGDB/

        1. 设置主库OGUID并修改数据库模式

主库(以mount形式启动)

[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop

[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/dmserver   /dm8/data/CUGDB/dm.ini mount

打开另外一个窗口,以上窗口不要关闭

[dmdba@dm8dw01 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236

SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);

SQL> sp_set_oguid(458888);     #与dmwatcher.ini中INST_OGUID相同

SQL> alter database primary;

SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

SQL> select status$ from v$instance;

LINEID     STATUS$

---------- -------

1          MOUNT

        1. 配置普通监视器dmmonitor.ini

所有主备库普通监视器配置一样。

[dmdba@dm8dw01 ~]$ vi /dm8/data/CUGDB/dmmonitor.ini

MON_DW_Confirm = 0             #1确认监视器模式,0表示观察监视器

MON_LOG_PATH = /dm8/data/log   #监视器日志文件存放路径

MON_LOG_INTERVAL = 60          #每隔60s定时记录系统信息到日志文件

MON_LOG_FILE_SIZE = 32         #每个日志文件最大32M

MON_LOG_SPACE_LIMIT = 0        #不限定日志文件总占用空间

[GRP1]

MON_INST_OGUID = 458888        #组GRP1的唯一OGUID值

#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置

#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT

MON_DW_IP = 10.10.10.21:5536    #私网IP

MON_DW_IP = 10.10.10.22:5536    #私网IP

MON_DW_IP = 10.10.10.23:5536    #私网IP

[dmdba@dm8dw01 ~]$ scp /dm8/data/CUGDB/dmmonitor.ini 84.0.191.22:/dm8/data/CUGDB/

[dmdba@dm8dw01 ~]$ scp /dm8/data/CUGDB/dmmonitor.ini 84.0.191.23:/dm8/data/CUGDB/

注:

配置普通监视器,其中MON_DW_IP中的IP和PORT和dmmal.ini中的MAL_HOST和MAL_DW_PORT配置项保持一致。

        1. 注册主库守护进程并启动

主库:

[root@dm8dw01 ~]# /dm8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/CUGDB/dmwatcher.ini -p CUGDB01

主库启动服务:

[root@dm8dw01 ~]# systemctl start DmWatcherServiceCUGDB01

或者

[root@dm8dw01 ~]# su - dmdba

[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/DmWatcherServiceCUGDB01 start

主备进程启动后,进入startup状态,守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例切换为OPEN.

SQL> select status$ from v$instance;

行号     STATUS$

---------- -------

1          OPEN

或者手工确认

[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/dmwatcher /dm8/data/CUGDB/dmwatcher.ini

数据库会自动从 mount转换成open状态。

SQL> select status$ from v$instance;

行号     STATUS$

---------- -------

1          OPEN

        1. 启动监视器

[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/dmmonitor  /dm8/data/CUGDB/dmmonitor.ini

      1. 配置备库dm8dw02参数文件
        1. 配置dm.ini

[dmdba@dm8dw02 ~]$ vi /dm8/data/CUGDB/dm.ini

INSTANCE_NAME = CUGDB02

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次的日志发送信息

        1. 配置dmmal.ini

配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致, MAL_HOST 使用内部网络 IP, MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值, MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:

[dmdba@dm8dw02 ~]$ vi /dm8/data/CUGDB/dmmal.ini

MAL_CHECK_INTERVAL = 5          #MAL链路检测时间间隔

MAL_CONN_FAIL_INTERVAL = 5      #判定MAL链路断开的时间

[MAL_INST1]

MAL_INST_NAME = CUGDB01     #实例名,和dm.ini中的INSTANCE_NAME一致

MAL_HOST = 10.10.10.21         #MAL系统监听TCP连接的IP地址,私网IP

MAL_PORT = 5436                 #MAL系统监听TCP连接的端口

MAL_INST_HOST = 84.0.191.21         #实例的对外服务IP地址

MAL_INST_PORT = 5236            #实例的对外服务端口,和dm.ini中的PORT_NUM一致

MAL_DW_PORT = 5536              #实例对应的守护进程监听TCP连接的端口

MAL_INST_DW_PORT = 5336         #实例监听守护进程TCP连接的端口

[MAL_INST2]

MAL_INST_NAME = CUGDB02

MAL_HOST = 10.10.10.22

MAL_PORT = 5436

MAL_INST_HOST = 84.0.191.22

MAL_INST_PORT = 5236

MAL_DW_PORT = 5536

MAL_INST_DW_PORT = 5336

[MAL_INST3]

MAL_INST_NAME = CUGDB03

MAL_HOST = 10.10.10.23

MAL_PORT = 5436

MAL_INST_HOST = 84.0.191.23

MAL_INST_PORT = 5236

MAL_DW_PORT = 5536

MAL_INST_DW_PORT = 5336

        1. 配置dmarch.ini

修改 dmarch.ini,配置本地归档和即时归档。

除了本地归档外,其他归档配置项中的 ARCH_DEST 表示实例是 Primary 模式时,需

要同步归档数据的目标实例名。当前实例CUGDB02是备库,

守护系统配置完成后,可能在各种故障处理中,CUGDB02切换为新的主库,正常情况下,CUGDB01会切换为新的备库,CUGDB02需要向CUGDB01CUGDB03同步数据,因此即时归档的 ARCH_DEST分别配置为 CUGDB01CUGDB03

[dmdba@dm8dw02 ~]$vi /dm8/data/CUGDB/dmarch.ini

[ARCHIVE_TIMELY1]

ARCH_TYPE = TIMELY             #即时归档类型

ARCH_DEST = CUGDB01             #即时归档目标实例名

[ARCHIVE_TIMELY2]

ARCH_TYPE = TIMELY             #即时归档类型

ARCH_DEST = CUGDB03             #即时归档目标实例名

[ARCHIVE_LOCAL1]

ARCH_TYPE = LOCAL                  #本地归档类型

ARCH_DEST = /dm8/data/arch          #本地归档文件存放路径

ARCH_FILE_SIZE = 2048              #单位Mb,本地单个归档文件最大值

ARCH_SPACE_LIMIT = 0                #单位Mb,0表示无限制,范围1024~4294967294M

        1. 配置dmwatcher.ini

dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。(主备库配置一致)。

[dmdba@dm8dw02 ~]$vi /dm8/data/CUGDB/dmwatcher.ini

[GRP1]

DW_TYPE = GLOBAL                             #全局守护类型

DW_MODE = AUTO                               #自动切换模式

DW_ERROR_TIME = 10                            #远程守护进程故障认定时间

INST_RECOVER_TIME = 60                        #主库守护进程启动恢复的间隔时间

INST_ERROR_TIME = 10                          #本地实例故障认定时间

INST_OGUID = 458888                          #守护系统唯一OGUID值

INST_INI = /dm8/data/CUGDB/dm.ini           #dm.ini配置文件路径

INST_AUTO_RESTART = 1                         #打开实例的自动启动功能

INST_STARTUP_CMD = /dm8/dmdbms/bin/dmserver   #命令行方式启动

RLOG_SEND_THRESHOLD = 0                       #指定主库发送日志到备库的时间阀值,默认关闭

RLOG_APPLY_THRESHOLD = 0                      #指定备库重演日志的时间阀值,默认关闭

        1. 设置备库OGUID并修改数据库模式

启动到mount状态下操作

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmserver  /dm8/data/CUGDB/dm.ini mount

打开另外一个窗口,以上窗口不要关闭

[dmdba@dm8dw02 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236

SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);

SQL> sp_set_oguid(458888);     ##设置所有备库的OGUID与主库相同

SQL> alter database standby;   ##修改备库模式

SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

SQL> select status$ from v$instance;

LINEID     STATUS$

---------- -------

1          MOUNT

        1. 配置观察监视器dmmonitor.ini

所有主备库普通监视器配置一样。

[dmdba@dm8dw02 ~]$ vi /dm8/data/CUGDB/dmmonitor.ini

MON_DW_Confirm = 0             #1确认监视器模式,0表示观察监视器

MON_LOG_PATH = /dm8/data/log   #监视器日志文件存放路径

MON_LOG_INTERVAL = 60          #每隔60s定时记录系统信息到日志文件

MON_LOG_FILE_SIZE = 32         #每个日志文件最大32M

MON_LOG_SPACE_LIMIT = 0        #不限定日志文件总占用空间

[GRP1]

MON_INST_OGUID = 458888        #组GRP1的唯一OGUID值

#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置

#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT

MON_DW_IP = 10.10.10.21:5536    #私网IP

MON_DW_IP = 10.10.10.22:5536    #私网IP

MON_DW_IP = 10.10.10.23:5536    #私网IP

注:

配置普通监视器,其中MON_DW_IP中的IP和PORT和dmmal.ini中的MAL_HOST和MAL_DW_PORT配置项保持一致。

        1. 注册备库守护进程并启动

[root@dm8dw02 ~]# /dm8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/CUGDB/dmwatcher.ini -p CUGDB02

备库启动服务:

[root@dm8dw02 ~]# systemctl start DmWatcherServiceCUGDB02

或者

[root@dm8dw02 ~]# su - dmdba

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/DmWatcherServiceCUGDB02 start

主备进程启动后,进入startup状态,守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例切换为OPEN.

SQL> select status$ from v$instance;

行号     STATUS$

---------- -------

  1. OPEN
        1. 启动监视器

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/dmmonitor  /dm8/data/CUGDB/dmmonitor.ini

      1. 配置备库dm8dw03参数文件
        1. 配置dm.ini

[dmdba@dm8dw03 ~]$ vi /dm8/data/CUGDB/dm.ini

INSTANCE_NAME = CUGDB03

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次的日志发送信息

        1. 配置dmmal.ini

配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致, MAL_HOST 使用内部网络 IP, MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值, MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:

[dmdba@dm8dw03 ~]$ vi /dm8/data/CUGDB/dmmal.ini

MAL_CHECK_INTERVAL = 5          #MAL链路检测时间间隔

MAL_CONN_FAIL_INTERVAL = 5      #判定MAL链路断开的时间

[MAL_INST1]

MAL_INST_NAME = CUGDB01     #实例名,和dm.ini中的INSTANCE_NAME一致

MAL_HOST = 10.10.10.21         #MAL系统监听TCP连接的IP地址,私网IP

MAL_PORT = 5436                 #MAL系统监听TCP连接的端口

MAL_INST_HOST = 84.0.191.21         #实例的对外服务IP地址

MAL_INST_PORT = 5236            #实例的对外服务端口,和dm.ini中的PORT_NUM一致

MAL_DW_PORT = 5536              #实例对应的守护进程监听TCP连接的端口

MAL_INST_DW_PORT = 5336         #实例监听守护进程TCP连接的端口

[MAL_INST2]

MAL_INST_NAME = CUGDB02

MAL_HOST = 10.10.10.22

MAL_PORT = 5436

MAL_INST_HOST = 84.0.191.22

MAL_INST_PORT = 5236

MAL_DW_PORT = 5536

MAL_INST_DW_PORT = 5336

[MAL_INST3]

MAL_INST_NAME = CUGDB03

MAL_HOST = 10.10.10.23

MAL_PORT = 5436

MAL_INST_HOST = 84.0.191.23

MAL_INST_PORT = 5236

MAL_DW_PORT = 5536

MAL_INST_DW_PORT = 5336

        1. 配置dmarch.ini

修改 dmarch.ini,配置本地归档和即时归档。

除了本地归档外,其他归档配置项中的 ARCH_DEST 表示实例是 Primary 模式时,需

要同步归档数据的目标实例名。

当前实例CUGDB03是备库,守护系统配置完成后,可能在各种故障处理中,CUGDB03切换为新的主库,正常情况下,CUGDB01会切换为新的备库,CUGDB03需要向CUGDB01CUGDB02同步数据,因此即时归档的 ARCH_DEST分别配置为 CUGDB01CUGDB02

[dmdba@dm8dw03 ~]$ vi /dm8/data/CUGDB/dmarch.ini

[ARCHIVE_TIMELY1]

ARCH_TYPE = TIMELY             #即时归档类型

ARCH_DEST = CUGDB01             #即时归档目标实例名

[ARCHIVE_TIMELY2]

ARCH_TYPE = TIMELY             #即时归档类型

ARCH_DEST = CUGDB02             #即时归档目标实例名

[ARCHIVE_LOCAL1]

ARCH_TYPE = LOCAL                  #本地归档类型

ARCH_DEST = /dm8/data/arch          #本地归档文件存放路径

ARCH_FILE_SIZE = 2048              #单位Mb,本地单个归档文件最大值

ARCH_SPACE_LIMIT = 0                #单位Mb,0表示无限制,范围1024~4294967294M

        1. 配置dmwatcher.ini

dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。(主备库配置一致)。

[dmdba@dm8dw03 ~]$ vi /dm8/data/CUGDB/dmwatcher.ini

[GRP1]

DW_TYPE = GLOBAL                             #全局守护类型

DW_MODE = AUTO                               #自动切换模式

DW_ERROR_TIME = 10                            #远程守护进程故障认定时间

INST_RECOVER_TIME = 60                        #主库守护进程启动恢复的间隔时间

INST_ERROR_TIME = 10                          #本地实例故障认定时间

INST_OGUID = 458888                          #守护系统唯一OGUID值

INST_INI = /dm8/data/CUGDB/dm.ini           #dm.ini配置文件路径

INST_AUTO_RESTART = 1                         #打开实例的自动启动功能

INST_STARTUP_CMD = /dm8/dmdbms/bin/dmserver   #命令行方式启动

RLOG_SEND_THRESHOLD = 0                       #指定主库发送日志到备库的时间阀值,默认关闭

RLOG_APPLY_THRESHOLD = 0                      #指定备库重演日志的时间阀值,默认关闭

        1. 设置备库OGUID并修改数据库模式

启动到mount状态下操作

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/bin/DmServiceCUGDB stop

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/bin/dmserver  /dm8/data/CUGDB/dm.ini mount

打开另外一个窗口,以上窗口不要关闭

[dmdba@dm8dw03 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236

SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);

SQL> sp_set_oguid(458888);     ##设置所有备库的OGUID与主库相同

SQL> alter database standby;   ##修改备库模式

SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

SQL> select status$ from v$instance;

LINEID     STATUS$

---------- -------

1          MOUNT

        1. 配置观察监视器dmmonitor.ini

所有主备库普通监视器配置一样。

[dmdba@dm8dw03 ~]$ vi /dm8/data/CUGDB/dmmonitor.ini

MON_DW_Confirm = 0             #1确认监视器模式,0表示观察监视器

MON_LOG_PATH = /dm8/data/log   #监视器日志文件存放路径

MON_LOG_INTERVAL = 60          #每隔60s定时记录系统信息到日志文件

MON_LOG_FILE_SIZE = 32         #每个日志文件最大32M

MON_LOG_SPACE_LIMIT = 0        #不限定日志文件总占用空间

[GRP1]

MON_INST_OGUID = 458888        #组GRP1的唯一OGUID值

#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置

#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT

MON_DW_IP = 10.10.10.21:5536    #私网IP

MON_DW_IP = 10.10.10.22:5536    #私网IP

MON_DW_IP = 10.10.10.23:5536    #私网IP

注:

配置普通监视器,其中MON_DW_IP中的IP和PORT和dmmal.ini中的MAL_HOST和MAL_DW_PORT配置项保持一致。

        1. 注册备库守护进程并启动

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/CUGDB/dmwatcher.ini -p CUGDB03

备库启动服务:

[dmdba@dm8dw03 ~]$ systemctl start DmWatcherServiceCUGDB03

或者

[dmdba@dm8dw03 ~]$ su - dmdba

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/bin/DmWatcherServiceCUGDB03 start

主备进程启动后,进入startup状态,守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例切换为OPEN.

SQL> select status$ from v$instance;

行号     STATUS$

---------- -------

1          OPEN

至此读写分离集群搭建完毕,在搭建步骤和各项配置都正确的情况下,在监视器上执行show命令,可以监控到所有实例都处于Open状态,所有守护进程也都处于Open状态,即为正常运行状态。

        1. 启动监视器

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/bin/dmmonitor  /dm8/data/CUGDB/dmmonitor.ini

      1. 配置确认监视器

在监视器服务器上配置

        1. 配置dmmonitor.ini

由于主库和实时备库的守护进程配置为自动切换模式,因此这里必须配置确认监视器。

和普通监视器相比,确认监视器除了相同的命令支持外,在主库发生故障时,能够自动通知备库接管为新的主库,具有自动故障处理的功能。

配置确认监视器时可以选择配置单实例监视器或配置多实例监视器,下面以配置单实例确认监视器为例。

修改 dmmonitor.ini 配置确认监视器,其中MON_DW_IP中的IP和PORT和dmmal.ini中的MAL_HOST和MAL_DW_PORT配置项保持一致。

[dmdba@dm8monitor ~]$ vi /dm8/data/monitor/dmmonitor.ini

MON_DW_Confirm = 1             #1确认监视器模式,0表示观察监视器

MON_LOG_PATH = /dm8/data/log   #监视器日志文件存放路径

MON_LOG_INTERVAL = 60          #每隔60s定时记录系统信息到日志文件

MON_LOG_FILE_SIZE = 32         #每个日志文件最大32M

MON_LOG_SPACE_LIMIT = 0        #不限定日志文件总占用空间

[GRP1]

MON_INST_OGUID = 458888        #组GRP1的唯一OGUID值

#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置

#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT

MON_DW_IP = 10.10.10.21:5536    #私网IP

MON_DW_IP = 10.10.10.22:5536    #私网IP

MON_DW_IP = 10.10.10.23:5536    #私网IP

        1. 启动确认监视器

[dmdba@dm8monitor ~]$ /dm8/dmdbms/bin/dmmonitor /dm8/data/monitor/dmmonitor.ini

      1. 启动和关闭顺序
        1. 关闭顺序

关闭确认监视器

/dm8/dmdbms/bin/DmWatcherServiceCUGDB01 stop

关闭备库的守护进程,再关闭主库守护进程

/dm8/dmdbms/bin/DmWatcherServiceCUGDB02 stop

/dm8/dmdbms/bin/DmWatcherServiceCUGDB03 stop

再关闭主库实例,最后关闭备库实例:

/dm8/dmdbms/bin/DmServiceCUGDB01 stop

/dm8/dmdbms/bin/DmServiceCUGDB02 stop

/dm8/dmdbms/bin/DmServiceCUGDB03 stop

        1. 启动顺序

先启动主库守护进程,再启动备库守护进程。

因为dmwatcher.ini中配置了INST_AUTO_RESTART = 1 ,守护进程启动后,会自动拉起数据库实例。

dmdba用户:

[dmdba@dm8dw01 ~]$ /dm8/dmdbms/bin/DmWatcherServiceCUGDB01 start

[dmdba@dm8dw02 ~]$ /dm8/dmdbms/bin/DmWatcherServiceCUGDB02 start

[dmdba@dm8dw03 ~]$ /dm8/dmdbms/bin/DmWatcherServiceCUGDB03 start

启动监视器:

[dmdba@dm8monitor ~]$ /dm8/dmdbms/bin/dmmonitor /dm8/data/monitor/dmmonitor.ini

  1. 读写分离集群测试
    1. 守护进程命令

守护进程(dmwatcher)既能以控制台方式启动,也可以配置为服务方式启动。可以在守护进程的控制台上输入命令,关闭守护进程,显示守护进程组的状态信息等,具体命令如下:

命令

含义

help

显示帮助信息

exit

退出守护进程

status

显示所有守护进程组中的本地库信息

show group group_name

显示指定守护进程组中的本地库信息

show version

显示守护进程自身版本信息

show monitor config

帮助监视器配置 ini 文件的信息

show link

显示守护进程上的 tcp 连接信息

    1. 监视器管理命令

#检查指定组的指定库是否满足自动恢复条件

check recover [group_name.]db_name

#检查指定组的指定库是否满足自动Open条件

check open [group_name.]db_name

#强制Open指定组的指定库

open database [group_name.] db_name

#切换指定组的指定库为Primary库

switchover [group_name[.]] [db_name]

#使用指定组的指定库接管故障Primary库

takeover [group_name[.]] [db_name]

#使用指定组的指定库强制接管故障Primary库

takeover force [group_name[.]] [db_name]

    1. 守护进程日志

/dm8/dmdbms/log/dm_dmwatcher_CUGDB01_202401.log

/dm8/dmdbms/log/dm_dmwatcher_CUGDB02_202401.log

/dm8/dmdbms/log/dm_dmwatcher_CUGDB03_202401.log

    1. 守护进程登录

确认监视器启动

[dmdba@dm8monitor ~]$  /dm8/dmdbms/bin/dmmonitor /dm8/data/monitor/dmmonitor.ini

登录后输入login

用户名:数据库用户名SYSDBA

密码:数据库密码SYSDBA2023

显示监视器登录成功

    1. 主备库数据同步测试
      1. 主库插入数据

dm8dw01>$disql SYSDBA/SYSDBA2023@127.0.0.1:5236

-- 创建表空间

SQL>create tablespace "OMP_TS" datafile '/dm8/data/CUGDB/omp01.dbf' size 1024 autoextend on;

-- 创建用户及授权

CREATE USER omp IDENTIFIED BY "omp123123!" DEFAULT TABLESPACE OMP_TS;

-- 密码时效不做限制

alter user "omp" limit  password_lock_time unlimited;

-- 授权

GRANT RESOURCE TO omp;

-- omp用户登录

[dmdba@dm8dw01 ~]$ disql omp/'omp123123!'@127.0.0.1:5236

create table year_2001(

ID            number(10) primary key not null,            

name       varchar2(30),

port    VARCHAR(255),

speed    VARCHAR(255),

type    VARCHAR(255),

create_time     date

);

begin

for i in 1..20 loop

insert into year_2001 values(i, 'cisco-'||i,'3306','10000','router-'||i,to_date('2021-06-20 18:31:34','YYYY-MM-DD HH24:MI:SS'));

end loop;

commit;

end;

/

SQL> select count(*) from year_2001;

行号     COUNT(*)           

---------- --------------------

1          20

      1. 备库查询数据

[dmdba@dm8dw02 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236

SQL> select count(*) from omp.year_2001;

行号     COUNT(*)           

---------- --------------------

  1. 20

[dmdba@dm8dw03 ~]$ disql SYSDBA/SYSDBA2023@127.0.0.1:5236

SQL> select count(*) from omp.year_2001;

行号     COUNT(*)           

---------- --------------------

  1. 20

结论:dm8dw01dm8dw02dm8dw03数据完全一致。

    1. 主库模拟软件故障自动切换测试
      1. 软件故障前

      1. 主库模拟故障

[dmdba@dm8dw02 ~]$ ps -ef | grep dm

[dmdba@dm8dw02 ~]$ kill -9 62923 63360

      1. 软件故障后

[dmdba@dm8monitor ~]$  /dm8/dmdbms/bin/dmmonitor /dm8/data/monitor/dmmonitor.ini

      1. 主库是否正确读写数据

[dmdba@dm8dw01 ~]$ disql omp/'omp123123!'@127.0.0.1:5236

SQL> begin

for i in 21..40 loop

insert into year_2001 values(i, 'cisco-'||i,'3306','10000','router-'||i,to_date('2021-06-21 23:51:49','YYYY-MM-DD HH24:MI:SS'));

end loop;

commit;

end;

/

SQL> select count(*) from year_2001;

行号     COUNT(*)           

---------- --------------------

1          40

结论 dm8dw01自动接管后standby库升为PRIMARY dmdb01数据库可读写。

    1. 原主库修复后是否自动加入集群测试
      1. 原主库dm8dw02启动

[dmdba@dm8dw02 ~]$  /dm8/dmdbms/bin/DmWatcherServiceCUGDB02 restart

Stopping DmWatcherServiceCUGDB02:                          [ OK ]

Starting DmWatcherServiceCUGDB02:                          [ OK ]

      1. 查看主备库状态

结论:当原主库恢复后,自动加入主备集群,原主库变为standby备库,不会自动成为主库。

      1. 原主库故障修复后,新数据是否同步

[dmdba@dm8dw02 ~]$ disql omp/'omp123123!'@127.0.0.1:5236

SQL> select count(*) from year_2001;

行号     COUNT(*)           

---------- --------------------

  1. 40

[dmdba@dm8dw03 ~]$ disql omp/'omp123123!'@127.0.0.1:5236

SQL> select count(*) from year_2001;

行号     COUNT(*)           

---------- --------------------

1          40

结论:原主库修复后,自动加入集群,数据自动同步过来。

    1. 原备库现主库插入数据同步测试
      1. 原备库现主库dm8dw01插入数据

[dmdba@dm8dw01 ~]$ disql omp/'omp123123!'@127.0.0.1:5236

SQL> begin

for i in 41..50 loop

insert into year_2001 values(i, 'cisco-'||i,'3306','10000','router-'||i,to_date('2021-06-22 08:31:49','YYYY-MM-DD HH24:MI:SS'));

end loop;

commit;

end;

/

SQL> select count(*) from year_2001;

行号     COUNT(*)           

---------- --------------------

1          50

      1. 原主库现备库dm8dw02查询数据

SQL> select count(*) from year_2001;

行号     COUNT(*)           

---------- --------------------

  1. 50
      1. 原备库现备库dm8dw03查询数据

SQL> select count(*) from year_2001;

行号     COUNT(*)           

---------- --------------------

1          50

结论:原主库修复后自动加入集群成为STANDBY备库,原备库现主库dm8dw01插入新数据后,现备库原主库dm8dw01正常接收数据,数据完全一致。

    1. 故障手工切换(switchover)
      1. 切换前主备库状态

      1. 手工switchover切换

手工切换:switchover [实例名]  

      1. 切换后主备库状态

结论:故障手工切换后,备库dm8dw03STANDBY提升为PRIMARY主库

    1. 主库模拟断电故障自动切换测试
      1. 主库断电前

      1. 主库模拟断电
      1. 主库断电后

      1. 重启原主库是否自动加入集群

  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值