达梦数据库(二)实时主备集群搭建

一、概述

本部分内容是介绍主备集群部署中涉及到的一些知识,便于理解后续的操作步骤

数据库模式

  • normal: 提供正常的数据库服务,操作没有限制;正常生成本地归档,但不发送实时/即时/异步归档

  • primary: 提供正常的数据库服务,部分操作受限(不支持修改表空间文件名、不支持修改 arch_ini 参数);正常生成本地归档,支持实时/即时/异步归档

  • standby: 仅支持备份、查询等只读操作;正常生成本地归档,支持异步归档 ;实时/即时归档均强制失效

主备模式下,主节点为 primary 模式,备节点为 standby 模式

数据库主要状态

  • open: 正常服务状态,可以访问数据库对象,不能进行控制文件维护、归档配置等操作

  • mount:配置状态,不允许访问数据库对象,只能进行控制文件维护、归档配置、数据库模式修改等操作

  • suspend:挂起状态,对比open状态多了磁盘无法写入的限制,一旦修改了数据页,触发 REDO 日志、数据页刷盘,当前用户将被挂起

数据库归档

联机redo日志:默认包含两个联机 Redo 日志文件(0号、1号文件),可以覆盖重用、循环使用,当一个日志文件写满后,自动切换到另一个文件,确保 Redo 日志文件不会随着日志量的增加而增长

本地归档日志:不能被覆盖,若没有配置归档文件空间上限,会在配置的归档目录下生成并保存,若配置归档文件空间上限,在配置空间写满时系统会自动删除最早生成的归档文件;当磁盘空间不足导致归档写入失败时,系统会挂起等待,直到用户释放出足够的磁盘空间,当磁盘损坏导致归档日志写入失败时,系统会强制停机

主备模式下,主机 redo 日志写入归档日志文件和联机日志文件,归档日志文件内容与联机日志保持一致;备机重演日志重新产生的 redo 日志只写入联机日志文件,归档日志文件保存主库产生的 redo 日志,这样可以确保集群中所有节点的归档日志文件内容是完全一致的
主从同步流程

如上图所示,实时主备集群中,备库确认收到主库 redo 日志,并不一定完成了重演,因此主备数据同步存在一定的时间差

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

守护进程启动

Primary/Standby 模式的库启动后,自动进入 Mount 状态。

数据守护系统启动时,所有数据库实例处于 Mount 状态。所有守护进程处于 Startup 状态。Global 守护类型的守护进程,需要相互协调信息,自动将数据库实例切换到 Open 状态,并将守护进程状态也切换为 Open 状态。

Global 守护类型的守护进程通知本地库 Open 的总体原则:

  • 对于备库,如果可加入远程任意一个库,则允许将其 Open;
  • 对于主库,如果远程所有库都可加入自己,则允许将其 Open。

二、安装部署

本次部署实时主备,一主一备,对于部分性能参数均采用默认值,有需要自定义参数的可以自行调整。
实时主备部署拓扑

本次主备集群目录规划

  • 安装目录:/home/dmdba/dmdbms

  • 实例目录:/opt/dmdata/data

  • 归档目录:/opt/dmdata/arch

  • 备份目录:/opt/dmdata/bak

集群信息

机器A机器B
ip地址8.134.142.49159.75.229.38
数据库端口52365236
MAL端口53365336
MAL守护进程端口54365436
守护进程端口55365536
实例名dmserver1dmserver2
守护组dmgroupdmgroup
OGUID123456123456

ps: 集群搭建节点间要相互通信,要注意防火墙或服务器安全组策略的设置,确保端口互通

准备工作+安装包下载+交互式安装

主备集群的安装所需的准备工作以及安装包下载、交互式安装与单机一致(初始化数据库实例开始有差别),具体可参考达梦数据库(一)单机部署

  • 此流程集群内所有节点都需执行一次

配置机器 A

初始化数据库
/home/dmdba/dmdbms/bin/dminit PATH=/opt/dmdata/data INSTANCE_NAME=dmserver1

在这里插入图片描述

通过前台方式启动数据库,维持这个界面不动

/home/dmdba/dmdbms/bin/dmserver /opt/dmdata/data/DAMENG/dm.ini

前台启动数据库

新开启一个终端,进入disql客户端

(后文中代码段的 “$” 以及 “SQL>” 是为了方便读者区分代码的执行环境,没有输入意义)

$ /home/dmdba/dmdbms/bin/disql SYSDBA/SYSDBA@127.0.0.1
SQL> ALTER DATABASE MOUNT;
# 开启归档配置
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/opt/dmdata/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
SQL> ALTER DATABASE OPEN;
# 备份数据
SQL> BACKUP DATABASE BACKUPSET '/opt/dmdata/bak/BACKUP_FILE';
# 修改dm.ini配置参数
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236);
SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60);
SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);
SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);
SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1);
SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);

配置数据库1
配置数据库2

回到数据库前台启动页面,通过 ctrl+c 关闭实例服务

配置文件

修改 dmarch.ini 配置参数

$ vi /opt/dmdata/data/DAMENG/dmarch.ini
ARCH_WAIT_APPLY            = 0   #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE                = LOCAL  #本地归档类型
ARCH_DEST                = /opt/dmdata/arch  #本地归档存放路径
ARCH_FILE_SIZE           = 1024  #单个归档大小,单位 MB
ARCH_SPACE_LIMIT         = 51200  #归档上限,单位 MB

[ARCHIVE_REALTIME1]
ARCH_TYPE                = REALTIME  #实时归档类型
ARCH_DEST                = dmserver2  #实时归档目标实例名

创建 dmmal.ini 文件

$ vi /opt/dmdata/data/DAMENG/dmmal.ini

MAL_CHECK_INTERVAL         = 10  #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL     = 10  #判定 MAL 链路断开的时间
MAL_TEMP_PATH              = /opt/dmdata/data/malpath/  #临时文件目录
MAL_BUF_SIZE               = 512  #单个 MAL 缓存大小,单位 MB
MAL_SYS_BUF_SIZE           = 2048  #MAL 总大小限制,单位 MB
MAL_COMPRESS_LEVEL         = 0  #MAL 消息压缩等级,0 表示不压缩
# 本次部署只有两个节点,如果有其他节点需要在下方添加新的实例信息(模版一致,改下实例名和ip即可)
[MAL_INST1]
MAL_INST_NAME            = dmserver1  #实例名,和 dm.ini 的 INSTANCE_NAME 一致
MAL_HOST                 = 8.134.142.49  #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT                 = 5336  #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST            = 8.134.142.49  #实例的对外服务 IP 地址
MAL_INST_PORT            = 5236  #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致
MAL_DW_PORT              = 5436  #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT         = 5536  #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME            = dmserver2
MAL_HOST                 = 159.75.229.38
MAL_PORT                 = 5336
MAL_INST_HOST            = 159.75.229.38
MAL_INST_PORT            = 5236
MAL_DW_PORT              = 5436
MAL_INST_DW_PORT         = 5536

创建 dmwatcher.ini

$  vi /opt/dmdata/data/DAMENG/dmwatcher.ini

[dmgroup]
DW_TYPE                  = GLOBAL  #全局守护类型
DW_MODE                  = MANUAL  #MANUAL:故障手切 AUTO:故障自切
DW_ERROR_TIME            = 20  #远程守护进程故障认定时间
INST_ERROR_TIME          = 20  #本地实例故障认定时间
INST_RECOVER_TIME        = 60  #主库守护进程启动恢复的间隔时间
INST_OGUID               = 123456 #守护系统唯一 OGUID 值
INST_INI                 = /opt/dmdata/data/DAMENG/dm.ini  #dm.ini 文件路径
INST_AUTO_RESTART        = 1  #打开实例的自动启动功能
INST_STARTUP_CMD         = /home/dmdba/dmdbms/bin/dmserver  #命令行方式启动
RLOG_SEND_THRESHOLD      = 0  #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD     = 0  #指定备库重演日志的时间阈值,默认关闭
注册服务

此步骤的执行需要以 root 用户进行

这里注册服务设置数据库以 mount 状态启动,由守护进程去调整数据库的状态

/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p dmserver1 -dm_ini /opt/dmdata/data/DAMENG/dm.ini -m mount
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /opt/dmdata/data/DAMENG/dmwatcher.ini

配置机器 B

初始化数据库
/home/dmdba/dmdbms/bin/dminit PATH=/opt/dmdata/data INSTANCE_NAME=dmserver2
数据恢复

将机器 A 的数据拷贝到机器 B

# 通过scp拷贝文件
scp -r dmdba@8.134.142.49:/opt/dmdata/bak/BACKUP_FILE /opt/dmdata/bak

通过dmrman工具恢复数据

/home/dmdba/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/opt/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdata/bak/BACKUP_FILE'"
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/opt/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdata/bak/BACKUP_FILE'"
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/opt/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC"

避坑:即使是两台初始数据库,也要进行数据备份恢复操作,不能跳过!

通过备份还原方式同步各数据库的数据,确保各数据库的数据保持完全一致,不能使用分别初始化库或者直接拷贝数据文件的方法来直接配置数据库守护(涉及到数据库魔数的概念,此处先不介绍)。

主库可以是新初始化的数据库,也可以是正在生产、使用中的数据库。备库在备份还原前,需要先准备初始化一个新库。

主备不一致
如上图所示,两个数据库节点LSN不一致,数据库处于 mount 状态,无法对外服务。

配置文件

替换 dmarch.ini 配置文件

$ vi /opt/dmdata/data/DAMENG/dmarch.ini

ARCH_WAIT_APPLY            = 0  #0:高性能  1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE                = LOCAL  #本地归档类型
ARCH_DEST                = /opt/dmdata/arch/  #本地归档存放路径
ARCH_FILE_SIZE           = 1024  #单个归档大小,单位 MB
ARCH_SPACE_LIMIT         = 51200  #归档上限,单位 MB

[ARCHIVE_REALTIME1]
ARCH_TYPE                = REALTIME  #实时归档类型
ARCH_DEST                = dmserver1 #实时归档目标实例名

配置 dm.ini 文件,与机器A 的配置文件改动同步(上述步骤是通过执行 sql 去动态修改机器A 的 dm.ini 配置文件)

$ vi /opt/dmdata/data/DAMENG/dm.ini

INSTANCE_NAME  = dmserver2
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 和 dmwatcher.ini 文件,配置与机器 A 相同

如上配置

注册服务

此步骤的执行需要以 root 用户进行

/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p dmserver2 -dm_ini /opt/dmdata/data/DAMENG/dm.ini -m mount
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /opt/dmdata/data/DAMENG/dmwatcher.ini

配置监视器

官方建议监视器配置在第三台机器上,本次部署在机器A上

配置确认监视器
$ vi /home/dmdba/dmdbms/bin/dmmonitor.ini

MON_DW_CONFIRM             = 1  #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH               = ../log  #监视器日志文件存放路径
MON_LOG_INTERVAL           = 60  #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE          = 512  #单个日志大小,单位 MB
MON_LOG_SPACE_LIMIT        = 2048  #日志上限,单位 MB

[dmgroup]
MON_INST_OGUID           = 123456 #组 dmgroup 的唯一 OGUID 值
MON_DW_IP                = 8.134.142.49:5436      #机器A的ip:port,要替换成实际机器ip 端口
MON_DW_IP                = 159.75.229.38:5436      #机器B的ip:port,要替换成实际机器ip 端口

也可以额外配置一份非确认监视器文件(官方建议执行此步骤),与确认监视器的配置文件大体相同,仅需把 MON_DW_CONFIRM 参数设置为0即可,后续用户可通过非确认监视器在集群正常的情况下手动进行主备切换。

注册服务

此步骤的执行需要以 root 用户进行

/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /home/dmdba/dmdbms/bin/dmmonitor.ini

启动集群

# 机器 A 
$ /home/dmdba/dmdbms/bin/DmServicedmserver1 start
$ /home/dmdba/dmdbms/bin/disql SYSDBA/SYSDBA@127.0.0.1:5236
SQL> SP_SET_OGUID(123456);
SQL> ALTER DATABASE PRIMARY;

# 机器 B
$ /home/dmdba/dmdbms/bin/DmServicedmserver2 start
$ /home/dmdba/dmdbms/bin/disql SYSDBA/SYSDBA@127.0.0.1:5236
SQL> SP_SET_OGUID(123456);
SQL> ALTER DATABASE STANDBY;

# 分别在机器 A 和机器 B 上开启守护进程
/home/dmdba/dmdbms/bin/DmWatcherServiceWatcher start

# 后台启动监视器(本次部署在机器A上)
/home/dmdba/dmdbms/bin/DmMonitorServiceMonitor start

三、集群状态验证

  1. 通过非确认监视器查看

确认监视器仅能在前台或后台运行一个,非确认监视器可以启动多个

详细的监视器使用手册参考官方文档

cd /home/dmdba/dmdbms/bin
# dmmonitor_manual.ini 的配置参考dmmonitor.ini,修改MON_DW_CONFIRM = 0即可
./dmmonitor dmmonitor_manual.ini
show global info

监视器查看集群状态

  1. 在主节点写入数据,在从节点查看,验证数据是否同步
  • 11
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值