2021-08-24

DM V8主备数据库复制的实现

一、背景
1.1需求
近期A系统持续受业务连续性的困扰,决定搭建DMV8数据库的高可用技术,最终选择了主备实时系统,满足所要达到应对主节点服务器硬件故障、主数据中心机房不可用的场景。
官方技术手册有相关描述实时主备系统的的组成,主要包括:由主数据库、实时备份数据库(备数据库)、守护进程和监视器组成。
1.2实时数据复制
翻译成大白话就是将REDO LOG打包通过复制功能,从主数据库向备数据库实时复制,备数据库将REDO LOG 写入到本地的联机REDO日志文件,通过REDO LOG回放完成数据的同步。
1.3实时同步取决于网络
显而易见,此技术是数据库层面的,要依托于成熟的IP网络。主数据库是通过网络将相关LOG传输到备节点,就要求网络质量非常高,且带宽足够大。同时备数据库的对REDO LOG回放有一定时间要求,也就是可能存在于数据库表中数据并非实时,这种情况尽可能将备数据库的服务器配置成高些,提升RLOG的回放速度。
1.4 定义
MAL系统:MAL 系统是基于 TCP 协议实现的一种内部通信机制,具有可靠、灵活、高效的特性。 DM 通过 MAL 系统实现 Redo 日志传输,以及其他一些实例间的消息通讯。
OGUID:配置成主备数据库复制的组ID
二、规划
2.1相关信息
(1)基本信息
在这里插入图片描述
(2)扩展信息
在这里插入图片描述
2.2系统示意图
在这里插入图片描述

三、主备实时数据库配置
3.1前置条件
3.1.1主备库均打开ARCHIVELOG模式
分别执行:
sql>alter database mount;
sql>alter database archivelog;
sql>alter database open;
sql>alter database add archivelog ‘DEST=/home/dmdba,TYPE=local,FILE_SIZE=512,SPACE_LIMIT=40960’

3.1.2主备库配置ORGUID
sql>SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 1);
sql>sp_set_oguid(453331);
sql>SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 0);

3.2 主数据库的配置
说明:以下直接用vi dm.ini编辑即可

3.2.1配置dm.ini

INSTANCE_NAME = DAMENG1
PORT_NUM = 5236
DW_INACTIVE_INTERVAL = 60 (接收守护进程消息超时时间为60秒)
ALTER_MODE_STATUS = 0 (禁止手工方式修改实例模式/状态/OGUID)
ENABLE_OFFLINE_TS = 2 (禁止备库 OFFLINE 表空间)
MAL_INI = 1 (打开 MAL 系统)

3.2.2配置dmmal.ini
官方文档特别强调,在配置 MAL 系统时各主备库的 dmmal.ini 配置必须完全一致,其中 MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值,MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:

MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME =DAMENT1
MAL_HOST = 10.1.1.1 (MAL 系统监听IP 地址)
MAL_PORT = 50000
MAL_INST_HOST = 192.168.1.1 (实例的对外服务 IP 地址)
MAL_INST_PORT = 5236
MAL_DW_PORT = 50001
MAL_INST_DW_PORT = 50002
[MAL_INST2]
MAL_INST_NAME =DAMENT2
MAL_HOST = 10.1.1.2 (MAL 系统监听IP 地址)
MAL_PORT = 50000
MAL_INST_HOST = 192.168.1.2 (实例的对外服务 IP 地址)
MAL_INST_PORT = 5236
MAL_DW_PORT = 50001
MAL_INST_DW_PORT = 50002
3.2.3配置 dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO (自动切换模式)
DW_ERROR_TIME = 30 (远程守护进程故障认定时间)
INST_RECOVER_TIME = 60 (主库守护进程启动恢复的间隔时间)
INST_ERROR_TIME = 30 (本地实例故障认定时间)
INST_OGUID = 453331 (OGUID组ID)
INST_INI = /home/dmdba/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
3.2.4启动主数据库
#systemctl start DmServiceDMSERVER1
#disql sysdba/
Sql>alter database mount;
说明:此处为数据库仍为mount,由后面守护进程来加载启动
3.2.5修改数据库为primary
Sql>alter database primary;

3.3 备数据库的配置
说明:以下直接用vi dm.ini编辑即可

3.3.1配置dm.ini

INSTANCE_NAME = DAMENG2
PORT_NUM = 5236
DW_INACTIVE_INTERVAL = 60 (接收守护进程消息超时时间为60秒)
ALTER_MODE_STATUS = 0 (禁止手工方式修改实例模式/状态/OGUID)
ENABLE_OFFLINE_TS = 2 (禁止备库 OFFLINE 表空间)
MAL_INI = 1 (打开 MAL 系统)

3.3.2配置dmmal.ini
官方文档特别强调,在配置 MAL 系统时各主备库的 dmmal.ini 配置必须完全一致,其中 MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值,MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:

MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME =DAMENT1
MAL_HOST = 10.1.1.1 (MAL 系统监听IP 地址)
MAL_PORT = 50000
MAL_INST_HOST = 192.168.1.1 (实例的对外服务 IP 地址)
MAL_INST_PORT = 5236
MAL_DW_PORT = 50001
MAL_INST_DW_PORT = 50002
[MAL_INST2]
MAL_INST_NAME =DAMENT2
MAL_HOST = 10.1.1.2 (MAL 系统监听IP 地址)
MAL_PORT = 50000
MAL_INST_HOST = 192.168.1.2 (实例的对外服务 IP 地址)
MAL_INST_PORT = 5236
MAL_DW_PORT = 50001
MAL_INST_DW_PORT = 50002
3.3.3配置 dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO (自动切换模式)
DW_ERROR_TIME = 30 (远程守护进程故障认定时间)
INST_RECOVER_TIME = 60 (主库守护进程启动恢复的间隔时间)
INST_ERROR_TIME = 30 (本地实例故障认定时间)
INST_OGUID = 453331 (OGUID组ID)
INST_INI = /home/dmdba/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0

3.3.4启动备数据库
#systemctl start DmServiceDMSERVER2
#disql sysdba/
Sql>alter database mount;
说明:此处为数据库仍为mount,由后面守护进程来加载启动
3.3.5修改数据库为standby
Sql >SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 1);
Sql >alter database standby;
Sql >SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 0);

四、配置实例监控器与启动主备库模式

4.1配置实例监控器

4.1.1配置监视器dmmonitor.ini
说明:配置文件中的MON_DW_IP和PORT要与dmmal.ini 中的MAL_HOST 和 MAL_DW_PORT 配置项保持一致。

MON_DW_CONFIRM = 1
MON_LOG_PATH = /home/dmdba/dmdbms/log
MON_LOG_INTERVAL =10
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP1]
MON_INST_OGUID = 453331
MON_DW_IP = 10.1.1.1:50001
MON_DW_IP = 10.1.1.2.1.2:50001
4.2启动监视器守护进程
$dmwatcher /home/dmdba/dmdbms/DAMENG/dmwatcher.ini
注意:我是加了环境变量到.bash_profile,方便执行相关命令

4.3启动监视器
$dmmonitor /home/dmdba/dmdbms/DAMENG/dmmonitor.ini
注意:我是加了环境变量到.bash_profile,方便执行相关命令

五、总结
前面在3.2.5、3.3.5分别提到数据库是处理mount状态,在4.2步时由dmwatcher加载并启动数据库状态为open。
此文档省去数据库的安装等过程,只展现了主备库配置过程还算容易,关键是后续的维护。
至此,整体配置完成,DM数据库仍在学习当中,难免有指令遗漏问题,同时文章中如有不妥之处还望大家指正。

这段代码存在一些语法错误。具体来说: 1. `console.log` 方法中的字符串应该使用引号括起来,例如 `"每页 ${val} 条"` 和 `"当前页: ${val}"`。 2. `toggleContent` 方法应该定义在 `methods` 对象中,并且缺少一个左大括号 `{`。 3. `toggleContent` 方法中的 `console.log` 方法没有使用正确的字符串格式化,应该使用反引号括起来,并在占位符 `${}` 中使用变量名,例如 ``console.log(`当前高度: ${content.style.height}`)``。 4. 在 `v-for` 指令中,应该使用 `v-bind:key` 显式地绑定 `tableData` 数组中每个对象的唯一标识符,例如 `v-for="(item, index) in tableData" v-bind:key="item.number"`。 下面是修正后的代码: ``` <script> let v = new Vue({ el: '#app', data: { value1: '', value2: '', pickerOptions: { shortcuts: [ { text: '今天', onClick(picker) { picker.$emit('pick', new Date()); } }, { text: '昨天', onClick(picker) { const date = new Date(); date.setTime(date.getTime() - 3600 * 1000 * 24); picker.$emit('pick', date); } }, { text: '一周前', onClick(picker) { const date = new Date(); date.setTime(date.getTime() - 3600 * 1000 * 24 * 7); picker.$emit('pick', date); } } ] }, tableData: [ { number: '1', date: '2021-08-01' }, { number: '2', date: '2021-08-01' }, { number: '3', date: '2021-08-01' }, { number: '4', date: '2021-08-01' }, { number: '5', date: '2021-08-01' }, { number: '6', date: '2021-08-01' }, { number: '7', date: '2021-08-01' }, { number: '8', date: '2021-08-01' } ], currentPage1: 5, currentPage2: 5, currentPage3: 5, currentPage4: 4 }, methods: { deleteRow(index, rows) { rows.splice(index, 1); }, handleSizeChange(val) { console.log(`每页 ${val} 条`); }, handleCurrentChange(val) { console.log(`当前页: ${val}`); }, toggleContent() { var content = document.getElementById("content"); var btn = document.getElementById("toggle-btn"); if (content.style.height === "100px") { content.style.height = "auto"; btn.innerHTML = "收起"; } else { content.style.height = "100px"; btn.innerHTML = "展开"; } console.log(`当前高度: ${content.style.height}`); } } }); </script> <table> <thead> <tr> <th>序号</th> <th>日期</th> <th>操作</th> </tr> </thead> <tbody> <tr v-for="(item, index) in tableData" v-bind:key="item.number"> <td>{{ item.number }}</td> <td>{{ item.date }}</td> <td><button @click="deleteRow(index, tableData)">删除</button></td> </tr> </tbody> </table> <div class="pagination"> <el-pagination background layout="sizes, prev, pager, next, jumper" :current-page.sync="currentPage1" :page-sizes="[5, 10, 20]" :page-size="5" @size-change="handleSizeChange" @current-change="handleCurrentChange" :total="tableData.length" ></el-pagination> </div> <div id="content" style="overflow: hidden; height: 100px;"> 这是一段需要展开的内容。 </div> <button id="toggle-btn" @click="toggleContent">展开</button> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值