实时主备
实时主备介绍
配置实时主备,有以下几种配置方案,可以根据实际情况部署:
1.只配置主库和最多 8 个实时备库。
2.只配置主库和最多 8 个异步备库。
3.配置主库、最多 8 个实时备库,和最多 8 个异步备库。
在实际应用中,如果数据库规模很大,并且对数据的实时性要求不是很严格,则可以配置多个异步备库用于分担统计报表等任务。
注意事项:
实际配置时,相关的端口配置和 OGUID 值建议不要和手册示例使用完全相同的值,避免多个用户在同一个环境下搭建不同的数据守护系统,出现消息乱掉或者端口冲突等问题。
环境准备、规划
OS:中标麒麟7.3
database:DM8
架构设计
1台虚拟机做主机
1台虚拟机做备机
1台虚拟机做监控
三台机器都事先安装了 DM(详细安装步骤见 达梦数据库学习札记-达梦8安装),安装路径为’/dm’,执行程序保存在’/dm/bin’目录中,数据存放路径为’/dm/data’。
机器名 IP 地址 初始状态 操作系统 备注
PRIMARY 192.168.234.131 GRP1_RT_01 中标麒麟7.3 外部服务IP
10.10.20.2 HeartBeat IP
STANDBY-A 192.168.234.132 GRP1_RT_02 中标麒麟7.3 外部服务IP
10.10.20.3 HeartBeat IP
MONITOR 192.168.234.133 确认监视器 中标麒麟7.3
10.10.20.4
实例名 PORT_NUM MAL_INST_DW_PORT MAL_HOST MAL_PORT MAL_DW_PORT
GRP1_RT_01 5236 33141 10.10.20.2 61141 52141
GRP1_RT_02 5236 33142 10.10.20.3 61142 52142
主库、备库创建实例
[dmdba@PRIMARY bin]$ ./dminit PATH=/dm/data INSTANCE_NAME=GRP1_RT_01
[dmdba@STANDBY-A bin]$ ./dminit PATH=/dm/data INSTANCE_NAME=GRP1_RT_02
主库新创建实例,通过前台启动
[dmdba@PRIMARY bin]$ ./dmserver /dm/data/DAMENG/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-87-20.06.01-122565-ENT startup...
Database mode = 0, oguid = 0
License will expire on 2021-06-01
file lsn: 0
ndct db load finished
ndct fill fast pool finished
iid page's trxid[1002]
NEXT TRX ID = 1003
pseg_collect_items, collect 0 active_trxs, 0 cmt_trxs, 0 pre_cmt_trxs, 0 active_pages, 0 cmt_pages, 0 pre_cmt_pages
pseg_process_collect_items end, 0 active trx, 0 active pages, 0 committed trx, 0 committed pages
total 0 active crash trx, pseg_crash_trx_rollback sys_only(0) begin ...
pseg_crash_trx_rollback end
purg2_crash_cmt_trx end, total 0 page purged
set EP[0]'s pseg state to inactive
pseg recv finished
nsvr_startup end.
aud sys init success.
aud rt sys init success.
……
trx: 2482 purged 1 pages
trx: 2485 purged 8 pages
trx: 2514 purged 1 pages
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 sys_only(0) begin ...
pseg_crash_trx_rollback end
SYSTEM IS READY.
主库联机备份
SQL> BACKUP DATABASE BACKUPSET '/dm/data/BACKUP_FILE_01';
主库拷贝备份文件到备库
[dmdba@PRIMARY data]$ scp -r /dm/data/BACKUP_FILE_01/ 192.168.234.132:/dm/data/
The authenticity of host '192.168.234.132 (192.168.234.132)' can't be established.
ECDSA key fingerprint is SHA256:kmbJVTN0u8TRXEraOVfXpiXiUvX7dYF+IJIpw8tc01o.
ECDSA key fingerprint is MD5:fc:4c:2c:e3:8f:7a:f7:fd:af:82:3d:4a:27:59:19:92.
Are you sure you want to continue connecting (yes/no)? yes
dmdba@192.168.234.132's password:
BACKUP_FILE_01.bak 100% 5990KB 53.4MB/s 00:00
BACKUP_FILE_01_1.bak 100% 119KB 20.0MB/s 00:00
BACKUP_FILE_01.meta 100% 81KB 18.5MB/s 00:00
备机执行脱机数据库还原与恢复
[dmdba@STANDBY-A bin] ./dmrman CTLSTMT="RESTORE DATABASE '/dm/data/DAMENG/dm.ini' FROM BACKUPSET '/dm/data/BACKUP_FILE_01'"
[dmdba@STANDBY-A bin] ./dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' FROM BACKUPSET '/dm/data/BACKUP_FILE_01'"
[dmdba@STANDBY-A bin] ./dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
1.主库操作
修改参数文件dm.ini
[dmdba@PRIMARY DAMENG]$ vi dm.ini
INSTANCE_NAME = GRP1_RT_01
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 次的日志发送信息
配置 dmmal.ini文件
配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致,MAL_HOST 使用内部网络 IP,MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值,MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
[dmdba@PRIMARY DAMENG]$ vi dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 10.10.20.2 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.234.131 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 10.10.20.3
MAL_PORT = 61142
MAL_INST_HOST = 192.168.234.132
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
配置 dmarch.ini文件
除了本地归档外,其他归档配置项中的 ARCH_DEST 表示实例是 Primary 模式时,需要同步归档数据的目标实例名。
当前实例 GRP1_RT_01 是主库,需要向 GRP1_RT_02(实时备库)同步数据,因此实时归档的 ARCH_DEST 配置为 GRP1_RT_02。
[dmdba@PRIMARY DAMENG]$ vi dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RT_02 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
配置 dmwatcher.ini文件
修改 dmwatcher.ini 配置守护进程,配置为全局守护类型,使用自动切换模式。
[dmdba@PRIMARY DAMENG]$ vi dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453301 #守护系统唯一 OGUID 值
INST_INI = /dm/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
mount方式启动主库
一定要以 Mount 方式启动数据库实例,否则系统启动时会重构回滚表空间,生成Redo 日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主备库动的数据一致性。数据守护配置结束后,守护进程会自动Open数据库。
[dmdba@PRIMARY bin]$ ./dmserver /dm/data/DAMENG/dm.ini mount
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-87-20.06.01-122565-ENT startup...
Database mode = 0, oguid = 0
License will expire on 2021-06-01
file lsn: 35295
ndct db load finished
ndct fill fast pool finished
nsvr_startup end.
aud sys init success.
aud rt sys init success.
systables desc init success.
ndct_db_load_info success.
SYSTEM IS READY.
设置 OGUID
启动命令行工具 DIsql,登录主库设置 OGUID 值。
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(453301);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
修改数据库模式
SQL>alter database primary;
2.备库操作
配置 dm.ini
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME = GRP1_RT_02
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 次的日志重演信息
配置 dmmal.ini文件
[dmdba@STANDBY-A bin]$ cat /dm/data/DAMENG/dmmal.ini
======================================================================================
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 10.10.20.2 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.234.131 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 10.10.20.3
MAL_PORT = 61142
MAL_INST_HOST = 192.168.234.132
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
配置 dmarch.ini
[dmdba@STANDBY-A bin]$ cat /dm/data/DAMENG/dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RT_01 #实时归档目标实例名
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm/data/DAMENG/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 20480
配置 dmwatcher.ini
[dmdba@STANDBY-A bin]$ cat /dm/data/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453301 #守护系统唯一 OGUID 值
INST_INI = /dm/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
Mount 方式启动备库
[dmdba@STANDBY-A bin]$ ./dmserver /dm/data/DAMENG/dm.ini mount
设置 OGUID
启动命令行工具 DIsql,登录备库设置 OGUID 值为 453301
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(453301);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
修改数据库为 Standby 模式
SQL> alter database standby;
分别创建主、备守护服务开机自启动
[root@PRIMARY ~]# /dm/script/root/dm_service_installer.sh -t dmwatcher -p GRP1_RT_01 -watcher_ini /dm/data/DAMENG/dmwatcher.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceGRP1_RT_01.service to /usr/lib/systemd/system/DmWatcherServiceGRP1_RT_01.service.
创建服务(DmWatcherServiceGRP1_RT_01)完成
[root@STANDBY-A ~]# /dm/script/root/dm_service_installer.sh -t dmwatcher -p GRP1_RT_02 -watcher_ini /dm/data/DAMENG/dmwatcher.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceGRP1_RT_02.service to /usr/lib/systemd/system/DmWatcherServiceGRP1_RT_02.service.
创建服务(DmWatcherServiceGRP1_RT_02)完成
启动守护服务
[root@PRIMARY ~]# systemctl start DmWatcherServiceGRP1_RT_01.service
[root@STANDBY-A ~]# systemctl start DmWatcherServiceGRP1_RT_02.service
3.配置监控
[root@Monitor monitor]# cat dmmonitor.ini
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /dameng/dmdbms/monitor/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453301 #组 GRP1 的唯一 OGUID 值
#以下配置为监视器到组 GRP1 的守护进程的连接信息,以―IP:PORT‖的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 10.10.20.2:52141
MON_DW_IP = 10.10.20.3:52142
启动监控
[dmdba@Monitor bin]$ ./dmmonitor /dameng/dmdbms/monitor/dmmonitor.ini
[monitor] 2020-12-14 11:11:13: DMMONITOR[4.0] V8
[monitor] 2020-12-14 11:11:13: DMMONITOR[4.0] IS READY.
[monitor] 2020-12-14 11:11:13: 收到守护进程(GRP1_RT_01)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2020-12-14 11:11:13 OPEN OK GRP1_RT_01 OPEN PRIMARY VALID 3 39133 39133
[monitor] 2020-12-14 11:11:13: 收到守护进程(GRP1_RT_02)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2020-12-14 11:11:13 OPEN OK GRP1_RT_02 OPEN STANDBY VALID 3 39133 39133
show
2020-12-14 11:12:00
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 453301 TRUE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.20.2 52141 2020-12-14 11:11:59 GLOBAL VALID OPEN GRP1_RT_01 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
EP INFO:
INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
5236 OK GRP1_RT_01 OPEN PRIMARY 0 0 REALTIME VALID 3968 39133 3968 39133 NONE
<<DATABASE GLOBAL INFO:>>
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.20.3 52142 2020-12-14 11:11:59 GLOBAL VALID OPEN GRP1_RT_02 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
EP INFO:
INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
5236 OK GRP1_RT_02 OPEN STANDBY 0 0 REALTIME VALID 3943 39133 3943 39133 NONE
DATABASE(GRP1_RT_02) APPLY INFO FROM (GRP1_RT_01):
DSC_SEQNO[0], (ASEQ, SSEQ, KSEQ)[3968, 3968, 3968], (ALSN, SLSN, KLSN)[39133, 39133, 39133], N_TSK[0], TSK_MEM_USE[0]
#================================================================================#