暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

DM8数据守护与读写分离集群(实时主备)搭建

原创 郑小凤 2020-08-31
2249

一、前言

DM数据守护(Data Watch)是一种集成化的高可用、高性能数据库解决方案,是数据库异地容灾的首选方案。DM数据守护提供多种解决方案,可用配置成实时主备、MPP主备以及读写分离集群。本文章主要讲解实时主备的搭建。实时主备是由一个主库以及一个或多个实时归档的备库组成,可以保障数据库可用性,挺高数据安全性。实时主备系统中,主库提供完整的数据库功能,备库提供只读服务。主库修改数据产生的Redo日志,通过实时归档机制,在写入联机Redo日志文件之前发送到备库,实时备库通过重演Redo日志与主库保持数据同步。当主库出现故障时,备库在将所有Redo日志重演结束之后,就可以切换为主库对外提供数据库服务。

二、环境说明

准备两台机器DM01、DM02用来部署主备库,其中DM01作为主库,DM02作为备库和监视器。配置监视器在主机、备机或者第三台机器上配置都行,最好在第三台机器上配置。本文章服务器的操作系统为Redhat6.9,你可以选择其它操作系统,如CentOS,UOS,银河麒麟……,每个操作系统上都配置了两块网卡,一块作为内部网络,一块作为外部网络。
DM01和DM02操作系统上均安装DM8数据库,安装路径为’/dm8’,数据存放路径为’/dm8/data’,各主备库的实例名建议采用“组名_守护环境_序号"的方式命名,方便按组区分不同实例,注意总长度不能超过16。本文章DM01和DM02的实例名分为TEST_DM_01、TEST_DM_02。

服务器配置说明

机器名 状态 操作系统 外部服务IP 内部服务IP
DM01 主库:TEST_DM_01 RedHat 6.9 192.168.83.101 10.10.10.11
DM02 主库:TEST_DM_02 RedHat 6.9 192.168.83.102 10.10.10.12

端口配置说明

实例名 PORT_NUM MAL_PORT MAL_DW_PORT MAL_INST_PORT MAL_INST_DW_PORT MAL_HOST
TEST_DM_01 5236 5237 5238 5236 5239 10.10.10.11
TEST_DM_02 5236 5237 5238 5236 5239 10.10.10.12

三、数据准备

DM8版本必须先通过备份还原方式同步各数据库的数据,确保各数据库的数据保持完全一致。主库可以是新初始化的数据库,也可以是正在生产、使用中的数据库。本文章是新初始化的数据库,对于新初始化的库,首先启动不允许使用MOUNT方式,必须先正常启动并正常退出,然后才允许MOUNT方式启动,并且准备数据时,也要先正常启动并正常退出,然后再使用备份还原方式准备备库数据。

1、对DM01、DM02数据库实例启停一遍

(1)启动数据库

DM01启动数据库

[dmdba@DM01 ~]$ service DmServiceTEST_DM_01 start
Starting DmServiceTEST_DM_01:                              [ OK ]

DM02启动数据库

[dmdba@DM02 ~]$ service DmServiceTEST_DM_02 start
Starting DmServiceTEST_DM_02:                              [ OK ]

(2)关闭数据库

DM01关闭数据库

[dmdba@DM01 ~]$ service DmServiceTEST_DM_01 stop
Stopping DmServiceTEST_DM_01:                              [ OK ]

DM02关闭数据库

[dmdba@DM02 ~]$ service DmServiceTEST_DM_02 stop
Stopping DmServiceTEST_DM_02:                              [ OK ]

2、配置本地归档

对于搭建实时主备,不管数据库是初始化状态,还是已经处于运行状态,都需要对服务器配置本地归档。配置本地归档有两种方式,一是用SQL语句来配置,二是通过编辑dmarch.ini和dm.ini文件。DM01和DM02都需要配置本地归档,下面介绍的是用SQL语句来配置:DEST表示归档文件存放路径、TYPE表示本地归档类型、FILE_SIZE表示本地单个归档文件最大值、SPACE_LIMIT表示归档大小限制。

SQL> alter database mount;
操作已执行
已用时间: 00:00:01.760. 执行号:0.
SQL> alter database add archivelog 'DEST=/dm8/data/arch,TYPE=local,FILE_SIZE=200,SPACE_LIMIT=2048';
操作已执行
已用时间: 2.275(毫秒). 执行号:0.
SQL> alter database archivelog;
操作已执行
已用时间: 21.143(毫秒). 执行号:0.
SQL> alter database open;
操作已执行
已用时间: 00:00:01.760. 执行号:0.

3、DM01脱机备份、DM02脱机还原

(1)关闭数据库

[dmdba@DM01 ~]$ service DmServiceTEST_DM_01 stop
Stopping DmServiceTEST_DM_01:                              [ OK ]
[dmdba@DM02 ~]$ service DmServiceTEST_DM_02 stop
Stopping DmServiceTEST_DM_02:                              [ OK ]

(2)DmAPService正常运行

[dmdba@DM01 ~]$ service DmAPService status
DmAPService (pid 2789) is running.
[dmdba@DM02 data]$ service DmAPService status
DmAPService (pid 2787) is running.

(3)备份

[dmdba@DM01 bin]$ ./dmrman CTLSTMT="BACKUP DATABASE '/dm8/data/TEST_DM_01/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm8/data/BACKUP_FILE01'"
dmrman V8
BACKUP DATABASE '/dm8/data/TEST_DM_01/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm8/data/BACKUP_FILE01'
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[40072]
BACKUP DATABASE [TEST_DM_01],execute......
CMD CHECK LSN......
BACKUP DATABASE [TEST_DM_01],collect dbf......
CMD CHECK ......
DBF BACKUP SUBS......
total 1 packages processed...
total 2 packages processed...
total 3 packages processed...
DBF BACKUP MAIN......
BACKUPSET [/dm8/data/BACKUP_FILE01] END, CODE [0]......
META GENERATING......
total 4 packages processed...
total 4 packages processed...
total 4 packages processed!
CMD END.CODE:[0]
backup successfully!
time used: 00:00:01.108

(4)拷贝备份到DM02

[dmdba@DM01 data]$ scp -r BACKUP_FILE01 192.168.83.102:/dm8/data/

(5)DM02脱机还原

[dmdba@DM02 bin]$ ./dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/TEST_DM_02/dm.ini' FROM BACKUPSET '/dm8/data/BACKUP_FILE01'"
dmrman V8
RESTORE DATABASE '/dm8/data/TEST_DM_02/dm.ini' FROM BACKUPSET '/dm8/data/BACKUP_FILE01'
RESTORE DATABASE CHECK......
RESTORE DATABASE,data collect......
RESTORE DATABASE,database refresh ......
RESTORE BACKUPSET [/dm8/data/BACKUP_FILE01] START......
total 3 packages processed...
total 4 packages processed...
RESTORE DATABASE,UPDATE ctl file......
RESTORE DATABASE,REBUILD key file......
RESTORE DATABASE,CHECK db info......
RESTORE DATABASE,UPDATE db info......
total 4 packages processed...
total 4 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 494.587(ms)
[dmdba@DM02 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/TEST_DM_02/dm.ini' FROM BACKUPSET '/dm8/data/BACKUP_FILE01'"
dmrman V8
RECOVER DATABASE '/dm8/data/TEST_DM_02/dm.ini' FROM BACKUPSET '/dm8/data/BACKUP_FILE01'
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[40072]
RESTORE RLOG CHECK......
CMD END.CODE:[603],DESC:[备份集[/dm8/data/BACKUP_FILE01]备份过程中未产生日志]
备份集[/dm8/data/BACKUP_FILE01]备份过程中未产生日志
recover successfully!
time used: 260.015(ms)
[dmdba@DM02 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/TEST_DM_02/dm.ini' UPDATE DB_MAGIC"
dmrman V8
RECOVER DATABASE '/dm8/data/TEST_DM_02/dm.ini' UPDATE DB_MAGIC
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[40072]
EP[0]'s apply_lsn[40072] >= end_lsn[40072]
recover successfully!
time used: 00:00:01.006

4、配置主库TEST_DM_01

(1)配置dm.ini

INSTANCE_NAME = TEST_DM_01
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2 #不允许备库OFFLINE表空间
MAL_INI = 1 #打开MAL系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近64次的日志发送信息

(2)配置dmmal.ini

配置MAL系统,各主备库的dmmal.ini配置必须完全一致。

MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = TEST_DM_01 #实例名,和dm.ini中的INSTANCE_NAME一致
MAL_HOST = 10.10.10.11 #MAL系统监听TCP连接的IP地址
MAL_PORT = 5237 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.83.101 #实例的对外服务IP地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 5238 #实例本地的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 5239 #实例监听守护进程TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = TEST_DM_02
MAL_HOST = 10.10.10.12
MAL_PORT = 5237
MAL_INST_HOST = 192.168.83.102
MAL_INST_PORT = 5236
MAL_DW_PORT = 5238
MAL_INST_DW_PORT = 5239

(3)配置dmmarch.ini

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

[ARCHIVE_LOCAL1]
        ARCH_TYPE            = LOCAL
        ARCH_DEST            = /dm8/data/arch
        ARCH_FILE_SIZE       = 200
        ARCH_SPACE_LIMIT     = 2048

[ARCHIVE_PRALTIME]
        ARCH_TYPE            = REALTIME
        ARCH_DEST            = TEST_DM_02

(4)配置dmwatcher.ini

修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。

[TEST]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 190810 #守护系统唯一OGUID值
INST_INI = /dm8/data/TEST_DM_01/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭

5、配置备库TEST_DM_02

(1)配置dm.ini

INSTANCE_NAME = TEST_DM_02
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2 #不允许备库OFFLINE表空间
MAL_INI = 1 #打开MAL系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近64次的日志发送信息

(2)配置dmmal.ini

从TEST_DM_01上拷贝到TEST_DM_02

[dmdba@DM01 TEST_DM_01]$ scp dmmal.ini 192.168.83.102:/dm8/data/TEST_DM_02/

(3)配置dmmarch.ini

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

[ARCHIVE_LOCAL1]
        ARCH_TYPE            = LOCAL
        ARCH_DEST            = /dm8/data/arch
        ARCH_FILE_SIZE       = 200
        ARCH_SPACE_LIMIT     = 2048

[ARCHIVE_PRALTIME]
        ARCH_TYPE            = REALTIME
        ARCH_DEST            = TEST_DM_01

(4)配置dmwatcher.ini

修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。

[TEST]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 190810 #守护系统唯一OGUID值
INST_INI = /dm8/data/TEST_DM_02/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭

6、启动主库、备库到mount

配置主备库后,一定要以Mount方式启动数据库实例,否则系统启动时会重构回滚表空间,生产Redo日志;并且,启动后应用可能连接到数据库实例进程操作,破环主备库的数据一致性。启动数据库到mount,可以直接通过dmserver启动,这里,为了方便服务在后台运行,先注册服务。

[root@DM01 root]# ./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/TEST_DM_01/dm.ini -auto false -m mount -p DM01_Mount
移动服务脚本文件(/dm8/bin/DmServiceDM01_Mount 到 /etc/rc.d/init.d/DmServiceDM01_Mount)
创建服务(DmServiceDM01_Mount)完成
[root@DM01 root]# su - dmdba
[dmdba@DM01 ~]$ service DmServiceDM01_Mount start
Starting DmServiceDM01_Mount:                              [ OK ]
[root@DM02 root]#  ./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/TEST_DM_02/dm.ini -auto false -m mount -p DM02_Mount
移动服务脚本文件(/dm8/bin/DmServiceDM02_Mount 到 /etc/rc.d/init.d/DmServiceDM02_Mount)
创建服务(DmServiceDM02_Mount)完成
[root@DM02 root]# su - dmdba
[dmdba@DM02 ~]$ service DmServiceDM02_Mount start
Starting DmServiceDM01_Mount:                              [ OK ]

7、设置OGUID(主备库都设置)

启动命令工具DISQL

SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1); 
DMSQL 过程已成功完成
已用时间: 22.344(毫秒). 执行号:1.
SQL> SP_SET_OGUID(190810);
DMSQL 过程已成功完成
已用时间: 10.900(毫秒). 执行号:2.
SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
DMSQL 过程已成功完成
已用时间: 4.465(毫秒). 执行号:3.

8、修改数据库模式

(1)修改TEST_DM_01为主库

SQL> alter database primary;

(2)修改TEST_DM_02为备库

SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
DMSQL 过程已成功完成
已用时间: 4.993(毫秒). 执行号:5.
SQL> ALTER DATABASE STANDBY;
操作已执行
已用时间: 9.767(毫秒). 执行号:0.
SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
DMSQL 过程已成功完成
已用时间: 5.904(毫秒). 执行号:6.

9、配置监视器

修改dmmonitor.ini,由于主库和实时备库的守护进程配置为自动切换模式,所有需要配置监视器,这里没有第三方服务器来作为监视器,所有选择DM02来配置监视器。

MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /dm8/data/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[TEST]
MON_INST_OGUID = 190810 #组GRP1的唯一OGUID值
#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 10.10.10.11:5238
MON_DW_IP = 10.10.10.12:5238

10、启动守护进程

[root@DM01 root]# ./dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/TEST_DM_01/dmwatcher.ini  -p DM01
移动服务脚本文件(/dm8/bin/DmWatcherServiceDM01 到 /etc/rc.d/init.d/DmWatcherServiceDM01)
创建服务(DmWatcherServiceDM01)完成
[root@DM01 root]# service  DmWatcherServiceDM01 start
Starting DmWatcherServiceDM01:                             [ OK ]
[root@DM02 root]#  ./dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/TEST_DM_02/dmwatcher.ini  -p DM02
移动服务脚本文件(/dm8/bin/DmWatcherServiceDM02 到 /etc/rc.d/init.d/DmWatcherServiceDM02)
创建服务(DmWatcherServiceDM02)完成
[root@DM02 root]# service  DmWatcherServiceDM02 start
Starting DmWatcherServiceDM02:                             [ OK ]

11、启动监视器

[root@DM02 root]#  ./dm_service_installer.sh -t dmmonitor -monitor_ini /dm8/data/TEST_DM_02/dmmonitor.ini -p DM02
[root@DM02 root]# su - dmdba
[dmdba@DM02 TEST_DM_02]$ service DmMonitorServiceDM02 start
Starting DmMonitorServiceDM02:                             [ OK ]

查看监视器信息,能看出TEST_DM_01、TEST_DM02的实例都处于Open状态,即正常运行。
image.png
如果想了解更多达梦数据库的信息,推荐达梦官方的在线服务平台 https://eco.dameng.com/

最后修改时间:2024-06-21 09:37:48
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论