注册
DM使用心得--读写分离集群搭建
专栏/培训园地/ 文章详情 /

DM使用心得--读写分离集群搭建

浮凌 2025/04/24 155 0 0
摘要

DM使用心得--读写分离集群搭建

1.相关概念

1.1.读写分离的概念及模式

通过即时归档或实时归档所组成的主备系统
读写分离集群通过配置"一致性模式"保证主库和备库数据一致性
通过DM数据库的各种接口, 实现将读操作自动分流到备库

一致性模式: 该模式下, 当发送SELECT语句时, 不论该语句在主库执行还是备库执行其查询的结果都是一样的
高性能模式: 该模式下, 当发送SELECT语句时, 不能保证查询结果的一致性

1.2.数据守护

主库 primary模式, 提供完整数据库服务的实例, 对外提供服务

备库 standby模式, 提供只读服务

REDO 日志 记录物理数据页的变化

REDO 日志传输 主库通过MAL系统发送redo日志到备库, 日志是以RLOG_PKG为单位进行日志包的发送

REDO 日志重演 备库接收到主库的REDO日志后, 重新应用REDO日志, 严格安装REDO产生的顺序解析REOD日志, 修改相应的物理页, 并且重新应用的过程中备库也会将数据写入本地REOD

守护进程 (dmwatcher) 监控数据库实例运行状态和主备之间数据同步情况以及故障处理的方式

监视器 (dmmonitor) 监控守护进程, 数据库实例信息, 用于管理集群, 监控实例故障后切换

  • 在数据守护中, 不严格区分数据库和数据库实例的概念, 数据库实例时唯一的标识 通常使用实例名来标记一个主库或者备库

1.3.归档日志类型

实时归档

本地归档

异步归档

数据守护集群: 本地归档, 实时归档, 异步归档

读写分离集群: 本地归档, 即时归档

MPP主备集群 : 本地归档, 实时归档

本地归档: LOCAL ARCHIVE 最多设置8个, 将redo日志进行本地归档, 在写入redo日之后触发

实施归档: REALTIME ARCHIVE 最多设置8个, 在写入redo日志之前触发, 通过MAL系统发送redo日志到备机并等待返回确认消息

即时归档: TIMELY ARCHIVE 最多设置8个, 在写入redo日志之后触发, 通过MAL系统发送redo日志到备机并等待备机应用完成后返回消息

异步归档: ASYNC ARCHIVE 最多设置8个, 由备机定时同步redo日志

1.4.数据库模式

PRIMARY 服务正常, 修改对象强制生成REDO日志

NORMAL 服务正常, 操作无限限制

STANDBY 只读访问, 实时归档失败, 根据配置向本地归档写入REDO日志

  • 所有模式, 必须在MOUNT状态下进行切换

2.搭建环境环境说明

  • ip规划
虚拟机 IP 实列名 数据库名称
主机(读) 192.168.232.128 its1 its
备机(写) 192.168.232.129 its2 its
  • 端口规划
名称 端口 说明
MAL_INST_PORT 5236 实例端口
MAL_PORT 16001 MAL系统端口
MAL_DW_PORT 17001 守护进程监听端口
MAL_INST_DW_PORT 18001 本地实例守护进程的端口
  • 目录规划
    • /dm8 数据库软件目录
    • /dmdata 数据文件目录
    • /dmarch 归档日志目录
    • /dmbak 备份目录

3.数据库软件安装

两个节点同样操作

3.1 读库

[root@itsapp1 ~]# su - dmdba [dmdba@itsapp1 ~]$ cd /mnt/dm8/ [dmdba@itsapp1 dm8]$ ./DMInstall.bin -i

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

/dm8/script/root/root_installer.sh

安装结束

[dmdba@itsapp1 dm8]$ [root@itsapp1 ~] # /dm8/script/root/root_installer.sh

3.2.写库

[root@itsapp2 ~]# su - dmdba
[dmdba@itsapp2 ~]$ cd /mnt/dm8/
[dmdba@itsapp2 dm8]$ ./DMInstall.bin -i

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

 /dm8/script/root/root_installer.sh

安装结束

4.初始化数据库实例

1、主库

[dmdba@itsapp1 bin]$ ./dminit PATH=/dmdata db_name=its instance_name=its1

2、备库

[dmdba@itsapp2 bin]$ ./dminit PATH=/dmdata db_name=its instance_name=its2

5.备份数据库

需要先启动数据实例
读库

[dmdba@itsapp1 bin]$ ./dmserver /dmdata/its/dm.ini

写库

[dmdba@itsapp2 bin]$ ./dmserver /dmdata/its/dm.ini

读库进行脱机备份

[dmdba@itsapp1 bin]$ ./dmrman dmrman V8 RMAN> BACKUP DATABASE '/dmdata/its/dm.ini' FULL BACKUPSET '/dmbak/full_database';

6.主库进行数据库还原操作

1、读库复制备份文件到备库

[dmdba@itsapp1 bin]$ scp -r /dmbak/full_database 100.63.1.2:/dmbak/

2、写库进行恢复

[dmdba@itsapp2 bin]$ ./dmrman dmrman V8 RMAN> RESTORE DATABASE '/dmdata/its/dm.ini' FROM BACKUPSET '/dmbak/full_database'; RMAN> RECOVER DATABASE '/dmdata/its/dm.ini' FROM BACKUPSET '/dmbak/full_database'; RMAN> RECOVER DATABASE '/dmdata/its/dm.ini' UPDATE DB_MAGIC;
  • 安装官方文档说的, 复制到随便的目录下进行恢复则报无效的备份集目录, 只能和主库一样在dmbak目录下进行恢复
[dmdba@itsapp2 bin]$ ./dmrman dmrman V8 RMAN> RESTORE DATABASE '/dmdata/its/dm.ini' FROM BACKUPSET '/tmp/full_database'; RESTORE DATABASE '/dmdata/its/dm.ini' FROM BACKUPSET '/tmp/full_database'; file dm.key not found, use default license! [-10001]:[错误码:-127]无效的备份集目录[/tmp/full_database] RMAN>

7.配置读库所需的文件

1、dm.ini

[dmdba@itsapp1 ~]$ vi /dmdata/its/dm.ini INSTANCE_NAME = its1 MAL_INI = 1 ARCH_INI = 1 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2

2、dmarch.ini

[dmdba@itsapp1 ~]$ vi /dmdata/its/dmarch.ini [ARCHIVE_REALTIME] ARCH_TYPE = REALTIME ARCH_DEST = its2 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /dmarch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 10240

3、dmmal.ini

[dmdba@itsapp1 ~]$ vi /dmdata/its/dmmal.ini MAL_CHECK_INTERVAL = 5 MAL_CONN_FAIL_INTERVAL = 5 [MAL_INST1] MAL_INST_NAME = its1 MAL_HOST = 192.168.232.128 MAL_PORT = 16001 MAL_INST_HOST = 100.63.1.1 MAL_INST_PORT = 5236 MAL_DW_PORT = 17001 MAL_INST_DW_PORT = 18001 [MAL_INST2] MAL_INST_NAME = its2 MAL_HOST = 192.168.232.129 MAL_PORT = 16001 MAL_INST_HOST = 100.63.1.2 MAL_INST_PORT = 5236 MAL_DW_PORT = 17001 MAL_INST_DW_PORT = 18001

4、dmwatcher.ini

[dmdba@itsapp1 ~]$ vi /dmdata/its/dmwatcher.ini [GRP_RW] DW_TYPE = GLOBAL DW_MODE = AUTO DW_ERROR_TIME = 10 INST_RECOVER_TIME = 60 INST_ERROR_TIME = 10 INST_OGUID = 453331 INST_INI = /dmdata/its/dm.ini INST_AUTO_RESTART = 1 INST_STARTUP_CMD = /dm8/bin/dmserver

8.配置写库所需的文件

1、读库复制配置文件到写库

[dmdba@itsapp1 ~]$ scp /dmdata/its/{dmarch,dmmal,dmwatcher}.ini 100.63.1.2:/dmdata/its/

2、dm.ini

[dmdba@itsapp2 ~]$ vi /dmdata/its/dm.ini INSTANCE_NAME = its2 MAL_INI = 1 ARCH_INI = 1 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2

3、dmarch.ini

[dmdba@itsapp2 ~]$ vi /dmdata/its/dmarch.ini [ARCHIVE_REALTIME] ARCH_TYPE = REALTIME ARCH_DEST = its1 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /dmarch ARCH_FILE_SIZE = 128 ARCH_SPACE_LIMIT = 10240

4、dmmal.ini

[dmdba@itsapp2 ~]$ vi /dmdata/its/dmmal.ini MAL_CHECK_INTERVAL = 5 MAL_CONN_FAIL_INTERVAL = 5 [MAL_INST1] MAL_INST_NAME = its1 MAL_HOST = 192.168.232.128 MAL_PORT = 16001 MAL_INST_HOST = 100.63.1.1 MAL_INST_PORT = 5236 MAL_DW_PORT = 17001 MAL_INST_DW_PORT = 18001 [MAL_INST2] MAL_INST_NAME = its2 MAL_HOST = 192.168.232.129 MAL_PORT = 16001 MAL_INST_HOST = 100.63.1.2 MAL_INST_PORT = 5236 MAL_DW_PORT = 17001 MAL_INST_DW_PORT = 18001

5、dmwatcher.ini

[dmdba@itsapp2 ~]$ vi /dmdata/its/dmwatcher.ini [GRP_RW] DW_TYPE = GLOBAL DW_MODE = AUTO DW_ERROR_TIME = 10 INST_RECOVER_TIME = 60 INST_ERROR_TIME = 10 INST_OGUID = 453331 INST_INI = /dmdata/its/dm.ini INST_AUTO_RESTART = 1 INST_STARTUP_CMD = /dm8/bin/dmserver

9.配置组件

9.1.以mount方式启动读写库

9.1.1.读库

[dmdba@itsapp1 bin]$ ./dmserver /dmdata/its/dm.ini mount [dmdba@itsapp1 bin]$ ./disql SQL> SP_SET_OGUID(453331); SQL> ALTER DATABASE PRIMARY;

9.1.2.写库

[dmdba@itsapp2 bin]$ ./dmserver /dmdata/its/dm.ini mount [dmdba@itsapp2 bin]$ ./disql SQL> SP_SET_OGUID(453331); SQL> ALTER DATABASE STANDBY;

9.2.各个节点启动dmwatcher进程

[dmdba@itsapp1 bin]$ ./dmwatcher /dmdata/its/dmwatcher.ini DMWATCHER[4.0] V8 DMWATCHER[4.0] IS READY [dmdba@itsapp2 bin]$ ./dmwatcher /dmdata/its/dmwatcher.ini DMWATCHER[4.0] V8 DMWATCHER[4.0] IS READY

9.3.配置监视器

9.3.1配置

[dmdba@itsapp2 ~]$ vi /dmdata/its/dmmonitor.ini MON_DW_CONFIRM = 1 MON_LOG_PATH = /dm8/log MON_LOG_INTERVAL = 60 MON_LOG_FILE_SIZE = 32 MON_LOG_SPACE_LIMIT = 0 [GRP_RW] MON_INST_OGUID = 453331 MON_DW_IP = 192.168.232.128:17001 MON_DW_IP = 192.168.232.129:17001

9.3.2.启动监视器

[dmdba@itsapp2 bin]$ ./dmmonitor /dmdata/its/dmmonitor.ini

9.4.注册服务

9.4.1.读库

[root@itsapp1 ~]# cd /dm8/script/root/ [root@itsapp1 root]# ./dm_service_installer.sh -t dmwatcher -p its1 -watcher_ini /dmdata/its/dmwatcher.ini [root@itsapp1 root]# ./dm_service_installer.sh -t dmserver -p its1 -dm_ini /dmdata/its/dm.ini

9.4.2.写库

[root@itsapp2 ~]# cd /dm8/script/root/ [root@itsapp2 root]# ./dm_service_installer.sh -t dmwatcher -p its2 -watcher_ini/dmdata/its/dmwatcher.ini [root@itsapp2 root]# ./dm_service_installer.sh -t dmserver -p its2 -dm_ini /dmdata/its/dm.ini [root@itsapp2 root]# ./dm_service_installer.sh -t dmmonitor -p confirm -monitor_ini/dmdata/its/dmmonitor.ini

9.5.停止所有服务, 以后台方式启动

停止集群顺序

1、监视器

2、主库守护进程

3、备库守护进程

4、主库实例

5、备库实例

启动集群顺序
1、主库实例

[root@itsapp1 ~]# systemctl start DmServiceits1.service

2、备库实例

[root@itsapp2 ~]# systemctl start DmServiceits2.service

3、主句守护进程

[root@itsapp1 ~]# systemctl start DmWatcherServiceits1.service

4、备库守护进程

[root@itsapp2 ~]# systemctl start DmWatcherServiceits2.service

5、监视器

[root@itsapp2 ~]# systemctl start DmMonitorServiceconfirm.service

9.6.配置普通监视器, 用于查看集群信息

[dmdba@itsapp2 ~]$ vi /dmdata/its/dmmonitor_0.ini MON_DW_CONFIRM = 0 MON_LOG_PATH = /dm8/log MON_LOG_INTERVAL = 60 MON_LOG_FILE_SIZE = 32 MON_LOG_SPACE_LIMIT = 0 [GRP_RW] MON_INST_OGUID = 453331 MON_DW_IP = 192.168.232.128:17001 MON_DW_IP = 192.168.232.129:17001 [dmdba@itsapp2 ~]$ cd /dm8/bin [dmdba@itsapp2 bin]$ ./dmmonitor /dmdata/its/dmmonitor_0.ini

10.配置客户端连接

10.1读库

[root@itsapp1 ~]# vi /etc/dm_svc.conf TIME_ZONE=(480) LANGUAGE=(cn) ITSDATA=(100.63.1.1:5236,100.63.1.2:5236) [ITSDATA] TIME_ZONE=(480) LANGUAGE=(cn) LOGIN_MODE=(1) SWITCH_TIME=(3) SWITCH_INTERVAL=(10)

10.2.备库

[root@itsapp2 ~]# vi /etc/dm_svc.conf TIME_ZONE=(480) TIME_ZONE=(480) LANGUAGE=(cn) ITSDATA=(100.63.1.1:5236,100.63.1.2:5236) [ITSDATA] TIME_ZONE=(480) LANGUAGE=(cn) LOGIN_MODE=(1) SWITCH_TIME=(3) SWITCH_INTERVAL=(10)
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服