欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

达梦数据库的主从架构:解读大话

最编程 2024-01-09 18:50:48
...

概述

上一篇文章我们已经了解了达梦数据库的相关安装过程,本篇文章续上一篇进行达梦主从高可用的部署搭建。主要包括流程图,主备数据库同步,主从配置文件编写,启动主从库,配置监听,注册服务,以及相关验证。实现从单体达梦主数据过渡到主从库,并保证单体库数据不丢失,主从正常启动,对外提供高可用服务。

基础环境信息

  1. 系统: linux or window(针对不同的系统,则需下载不同的数据库安装包,点此下载)
  2. db-version: dm8_20230419_HWarm_centos7_64
  3. 要求主从数据库版本必须一致,如果是从单体过渡到主从,则主从版本需与单体库版本一致,否则还原数据会出错
  4. 主从数据库需先进行数据库安装,安装成功并启动后才能继续往下操作,具体安装步骤可见达梦数据库安装和卸载
  5. 均采用配置的方式进行主从搭建,具体通过界面进行搭建限于篇幅本文不做过多描述,可自行查阅了解。
  6. 主从同步方式采用实时同步的方式进行。

环境准备

master:10.0.102.89

用途 目录路径 备注
数据库软件安装目录 /data/dm8/ 可用空间>50GB
实例安装目录 /data/dmmatser/ 单独挂载性能最好的磁盘建议SSD
归档日志存放目录 /data/archlog/  
备份文件存放目录 /data/backfile/  
监视器日志文件存放目录 /data/jtlog/  

slave:10.0.101.90

用途 目录路径 备注
数据库软件安装目录 /data/dm8/ 可用空间>50GB
实例安装目录 /data/dmslave/ 单独挂载性能最好的磁盘建议SSD
归档日志存放目录 /data/archlog/  
备份文件存放目录 /data/backfile/  

注意文件夹的所属用户与用户组:chown -R dmdba:dinstall /data/dm8

端口规划

实例名 PORT public ip(公网) MAL_INST_PORT MAL_INST_DW_PORT MAL_DW_PORT private ip(内网) MAL_PORT
master 5240 10.0.102.89 5240 52141 33141 10.0.103.194 61141
slave 5240 10.0.101.90 5240 52141 33141 10.0.102.170 61141

端口号相关说明:

PORT_NUM:数据库实例监听端口
MAL_INST_PORT:实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_INST_DW_PORT:实例监听守护进程TCP连接的端口
MAL_DW_PORT:实例本地的守护进程监听TCP连接的端口
MAL_PORT MAL:系统监听TCP连接的端口

流程图

1687677466845.jpg

详细流程

主备库数据同步

同步原理:主节点的数据备份,通过SCP到从节点,然后从节点回滚主节点的数据库备份文件,做到主从同步。

主从节点创建实例与安装服务

Master:
创建实例:
./dminit PATH=/data/dmmatser/ DB_NAME=master INSTANCE_NAME=master PORT_NUM=5240 page_size=32 extent_size=16 CASE_SENSITIVE=n charset=1 LENGTH_IN_CHAR=1
注册服务:
./dm_service_installer.sh -t dmserver -dm_ini /data/dmmatser/master/dm.ini -p master
连接数据库:
./disql <SYSDBA/SYSDBA@127.0.0.1:5240>
Slave
./dminit PATH=/data/dmslave/ DB_NAME=slave INSTANCE_NAME=slave PORT_NUM=5240 page_size=32 extent_size=16 CASE_SENSITIVE=n charset=1 LENGTH_IN_CHAR=1
注册服务:
./dm_service_installer.sh -t dmserver -dm_ini /data/dmslave/slave/dm.ini -p slave
连接数据库:
./disql <SYSDBA/SYSDBA@127.0.0.1:5240>

单体数据库备份

dm数据库备份有两种方式:1.物理备份(dmrman工具备份) 2.逻辑备份(dexp/dimp)
物理备份:通过dmrman工具进行备份,工具为dm自带,在安装目录bin下,属于脱机备份,即需要停止数据库服务
逻辑备份:通过指令进行逻辑备份,不需要停止数据库服务,备份文件相对较小。
具体备份可通过备份相关文档进行查询使用。
具体步骤如下:

  1. dm安装目录:/dm8
  2. 进入dm数据库命令:./disql "user"/'"pwd"'@ip:port
  3. ./dexp "USER_ZW_DZCL_PD_TEST"/'"1qazxsw23edcvfr4"'@10.220.196.121:5240 DIRECTORY=/home/rootadminx/dm_dexp_data FILE=DB_USER_ZW_DZCL_PD_TEST_exp.dmp schemas=USER_ZW_DZCL_PD_TEST TABLESPACE=N DROP=N LOG=DB_USER_ZW_DZCL_PD_TEST.log LOG_WRITE=N
  4. scp到主节点服务器中
  5. 开始进行数据还原
    5.1 首先通过disql登录
    5.2 创建: CREATE TABLESPACE tablespace_name datafile 'tablespace_name.DBF' size 256 autoextend on next 1 CACHE=NORMAL; --创建表空间
    CREATE USER "user_name" IDENTIFIED BY "pwd" DEFAULT TABLESPACE "tablespace_name" DEFAULT INDEX TABLESPACE "tablespace_name"; --创建用户绑定表空间
    GRANT DBA TO user;--创建用户绑定表空间
    5.3 执行导入语句:
    ./dimp "user"/'"pwd"'@ip:port file=dmpfile.dmp directory=/data schemas=db_name LOG=import.log LOG_WRITE=N table_exists_action=replace

主节点脱机备份

关闭后台启动实例的窗口关闭数据库后,使用dmrman工具脱机备份主库,dmdba用户到安装目录的bin下执行以下命令:
代码如下(示例):./dmrman
执行backup全库:
BACKUP DATABASE '/data/dmmatser/master/dm.ini' BACKUPSET '/data/backfile/'

image.png 执行完毕之后,会生成一个备份文件,通过scp命令传输到从库的/DMINSTALL/目录下面,该处注意back包的用户权限。
如果执行报错: image.png 启动dmap服务即可:
[dmdba@host bin]$ ./dmap

从库执行数据库还原

关闭数据库后,使用dmrman工具还原备库,dmdba用户到安装目录的bin下执行以下命令:
./dmrman
执行restore:
RESTORE DATABASE '/data/dmslave/slave/dm.ini' FROM BACKUPSET '/data/backfile' image.png 执行recover:
RECOVER DATABASE '/data/dmslave/slave/dm.ini' FROM BACKUPSET '/data/backfile' image.png 执行recover update db_magic:
RECOVER DATABASE '/data/dmslave/slave/dm.ini' UPDATE DB_MAGIC image.png

主从配置文件

(配置文件路径无具体说明,都与dm.ini文件路径同级)

修改dm.ini

主库修改以下参数值:
INSTANCE_NAME = MASTER
MAL_INI = 1         #打开MAL系统
ARCH_INI = 1     #打开归档配置
ALTER_MODE_STATUS = 0    #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2      #不允许备库OFFLINE表空间
备库修改以下参数值:
INSTANCE_NAME = SLAVE
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2

配置MAL系统配置文件dmmal.ini

vim dmmal.ini
MAL_CHECK_INTERVAL   = 5      #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL  = 5      #判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = MASTER       #与dm.ini中的INSTANCE_NAME一致
MAL_HOST     = 10.0.102.89      #MAL系统监听TCP内部网络IP
MAL_PORT     = 61141        #MAL系统监听TCP连接的端口
MAL_INST_HOST   = 10.0.192.89      #实例的对外服务IP地址
MAL_INST_PORT   = 5240         #与dm.ini中的PORT_NUM一致
MAL_DW_PORT   = 52141       #实例对应的守护进程监听TCP端口
MAL_INST_DW_PORT = 33141
[MAL_INST2]
MAL_INST_NAME = SLAVE      #与dm.ini中的INSTANCE_NAME一致
MAL_HOST      = 10.0.101.90  # MAL系统监听TCP内部网络 IP
MAL_PORT          = 61141    #MAL系统监听TCP连接的端口
MAL_INST_HOST         = 10.0.101.90     #实例的对外服务IP地址
MAL_INST_PORT         = 5240       #与dm.ini中的PORT_NUM一致
MAL_DW_PORT  = 52141         #实例对应的守护进程监听TCP端口
MAL_INST_DW_PORT = 33141
image.pngimage.png

配置归档配置文件

vim dmarch.ini
主节点:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME       #实时归档类型
ARCH_DEST = SLAVE             #实时归档目标实例名(主库侧填写备库实例名)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL               #本地归档类型
ARCH_DEST = /data/archlog          #本地归档文件存放路径
ARCH_FILE_SIZE = 128              #单位MB,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0           #单位MB,0表示无限制,范围1024~4294967294M

从节点:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME       #实时归档类型
ARCH_DEST = MASTER     #实时归档目标实例名(备库侧填写主库实例名)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL           #本地归档类型
ARCH_DEST = /data/archlog        #本地归档文件存放路径
ARCH_FILE_SIZE = 128            #单位MB,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0           #单位MB,0表示无限制,范围1024~4294967294M

image.pngimage.png

配置守护进程

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

image.pngimage.png

启动主从库

首先启动主库:
以Mount方式启动主库
./dmserver /data/dmmatser/master/dm.ini mount
image.png
启动命令行工具DIsql(./disql SYSDBA/SYSDBA@localhost:5240),登录主库设置OGUID值。主库修改数据库为Primary模式
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(453331);       #主备库都修改oguid
alter database primary;      #主库修改数据库模式为primary
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); image.png
从库操作一样(注意文件路径):
以Mount方式启动从库
./dmserver /data/dmslave/slave/dm.ini mount
启动命令行工具DIsql(./disql SYSDBA/SYSDBA@localhost:5240),登录备库设置OGUID值为453331
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(453331);
alter database standby;     #备库修改数据库模式为standby
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

配置监听dmmonitor.ini

主从节点均可,只要配置一个,因为之前已经规划好了主从节点,所以把监听ini文件放在了主节点上面。
vim dmmonitor.ini
MON_DW_CONFIRM = 1     #确认监视器模式
MON_LOG_PATH = /DMINSTALL/jtlog      #监视器日志文件存放路径
MON_LOG_INTERVAL = 60    #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32      #每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0       #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453331     #组GRP1的唯一OGUID值
#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 10.0.102.89:52141
MON_DW_IP = 10.0.101.90:52141
配置好监听之后,启动主从守护进程:
主: ./dmwatcher /data/dmmatser/master/dmwatcher.ini
从:  ./dmwatcher /data/dmslave/slave/dmwatcher.ini
image.pngimage.png 启动监听
./dmmonitor /data/dmmatser/master/dmmonitor.ini
image.png

注册服务

以上启动为前台方式启动,仅用户搭建过程中验证配置。配置没问题后需要将实例,守护进程和确认监视器注册为系统服务。使用root用户,到数据库安装目录的script/root下,执行。
注册守护进程服务(主备库都执行)。
./dm_service_installer.sh -t dmwatcher -p master -watcher_ini /data/dmmatser/master/dmwatcher.ini
image.png ./dm_service_installer.sh -t dmwatcher -p slave -watcher_ini /data/dmslave/slave/dmwatcher.ini
image.png 注册数据库实例服务(之前已经做过,该处不需要重复注册实例服务)
./dm_service_installer.sh -t dmserver -dm_ini /data/dmmatser/master/dm.ini -p master
./dm_service_installer.sh -t dmserver -dm_ini /data/dmslave/slave/dm.ini -p slave
注册监视器服务(只需在监视器服务器上执行),执行以下命令:
./dm_service_installer.sh -t dmmonitor -p confirm -monitor_ini /data/dmmatser/master/dmmonitor.ini
image.png 以服务方式启动
启动数据库实例,执行以下命令:
主:systemctl start DmServicemaster.service
备:systemctl start DmServiceslave.service
启动守护进程,执行以下命令:
主:systemctl start DmWatcherServicemaster.service
备:systemctl start DmWatcherServiceslave.service
启动监视器,执行以下命令:
主:systemctl start DmMonitorServiceconfirm.service\

验证主备集群同步状态

监视器查看读写分离集群状态
启动监视器,执行以下命令:./dmmonitor /data/dmslave/slave/dmmonitor.ini
image.png 输入show命令查看集群状态,执行以下命令:
image.png 其中守护进程状态WSTATUS为OPEN,实例状态ISTATUS为OPEN,归档类型RTYPE为REALTIME(实时),归档状态RSTAT为VALID。
disql客户端验证
使用disql客户端登录主库,创建测试表,插入数据,执行以下命令:
./disql SYSDBA/SYSDBA@localhost:5240
create table test(id int);
insert into test values (2);
commit;
使用disql客户端登录备库,查询测试表验证,执行以下命令:
./disql SYSDBA/SYSDBA@localhost:5240
select * from test;\

重启集群

主备集群重启有顺序要求
关闭监视器:systemctl stop DmMonitorServiceconfirm
关闭主库守护进程:systemctl stop DmWatcherServicemaster
关闭备库守护进程:systemctl stop DmWatcherServiceslave
关闭主库实例:systemctl stop DmServicemaster
关闭备库实例:systemctl stop DmServiceslave
启动主库实例:systemctl start DmServicemaster
启动备库实例:systemctl start DmServiceslave
启动主库守护进程:systemctl start DmWatcherServicemaster
启动备库守护进程:systemctl start DmWatcherServiceslave
启动监视器:systemctl start DmMonitorServiceconfirm
卸载服务
./dm_service_uninstaller.sh -n DmMonitorServiceconfirm
./dm_service_uninstaller.sh -n DmWatcherServicemaster
./dm_service_uninstaller.sh -n DmServicemaster
./dm_service_uninstaller.sh -n DmWatcherServiceslave
./dm_service_uninstaller.sh -n DmServiceslave\

守护集群主库处于mount状态问题

完成搭建后,需要用dmwatcher将数据库由mount状态拉起到open状态,但是等操作完monitor后,回来再访问主机,发现又变为了配置状态。怀疑是dmwatcher有问题,于是在主机上重新启动了dmwatcher守护进程。
[dmdba@kylin]dmwatcher /dm8/data/DMOA/dmwatcher.ini
DMWATCHER[4.0] V8
DMWATCHER[4.0] IS READY
再次查看主库的状态,发现主库仍然处于mount状态
查看主库的dmwatcher日志
[dmdba@kylin log] tail -0f dm_dmwatcher_DMDW1_202110.log
2022-10-30 22:31:42.930 [INFO] dmwatcher P0000020612 T0000139923596203840 dw2_conn_mgr_thread create, connect ip:10.228.10.16, port:5236, from_flag:0
2022-10-30 22:32:48.981 [INFO] dmwatcher P0000020612 T0000139923596203840 DMWATCHER[4.0] group(GRP1) initialized succeed.
GUID(7EF96A5E7EF96A5E26F9D02F7841ABD7)
2022-10-30 22:33:48.997 [INFO] dmwatcher P0000020612 T0000139923596203840 DMWATCHER[4.0] IS READY
2022-10-30 22:35:49.917 [INFO] dmwatcher P0000020612 T0000139923485456128 dw2_send_port_set to dmserver vio(3) set, mid(-1), to name:DMOA, ip:127.0.0.1
2022-10-30 22:35:49.990 [ERROR] dmwatcher P0000020612 T0000000000000020617 Can’t connect to DM server on ‘10.228.10.16’ port(5236) errno(111)
从日志可以看到一条错误信息,发现主库访问不到备库的5236端口
测试端口的情况:从主库链接备库的5236端口:
[dmdba@kylin log] telnet 192.168.2.18 5236
Trying 192.168.2.18…
telnet: connect to address 192.168.2.18: Connection refused
链接端口失败,检查备库上端口是否开启:
[dmdba@kylin DMOA]$ lsof -i:5236
备库上5536为开启,同样检查主库上的5536是否开启,开启的进程是哪个
[dmdba@kylin log]$ lsof -i:5536
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dmwatcher 21412 dmdba 4u IPv6 422116 0t0 TCP *:5236 (LISTEN)
上面结果表示,5235端口应该由dmwatcher进程开启,发现是由于备库的dmwatcher进程未启动,导致的主库无法切换成open状态。
在备库上启动dmwatcher进程
[dmdba@kylin ~]$ dmwatcher /dm8/data/DMOA/dmwatcher.ini 再次通过disql查询主库状态时发现正常!