达梦数据库的主从架构:解读大话
概述
上一篇文章我们已经了解了达梦数据库的相关安装过程,本篇文章续上一篇进行达梦主从高可用的部署搭建。主要包括流程图,主备数据库同步,主从配置文件编写,启动主从库,配置监听,注册服务,以及相关验证。实现从单体达梦主数据过渡到主从库,并保证单体库数据不丢失,主从正常启动,对外提供高可用服务。
基础环境信息
- 系统: linux or window(针对不同的系统,则需下载不同的数据库安装包,点此下载)
- db-version: dm8_20230419_HWarm_centos7_64
- 要求主从数据库版本必须一致,如果是从单体过渡到主从,则主从版本需与单体库版本一致,否则还原数据会出错
- 主从数据库需先进行数据库安装,安装成功并启动后才能继续往下操作,具体安装步骤可见达梦数据库安装和卸载
- 均采用配置的方式进行主从搭建,具体通过界面进行搭建限于篇幅本文不做过多描述,可自行查阅了解。
- 主从同步方式采用实时同步的方式进行。
环境准备
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连接的端口
流程图
详细流程
主备库数据同步
同步原理:主节点的数据备份,通过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下,属于脱机备份,即需要停止数据库服务
逻辑备份:通过指令进行逻辑备份,不需要停止数据库服务,备份文件相对较小。
具体备份可通过备份相关文档进行查询使用。
具体步骤如下:
- dm安装目录:/dm8
- 进入dm数据库命令:./disql "user"/'"pwd"'@ip:port
./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
- scp到主节点服务器中
- 开始进行数据还原
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/'
执行完毕之后,会生成一个备份文件,通过scp命令传输到从库的/DMINSTALL/目录下面,该处注意back包的用户权限。
如果执行报错:
启动dmap服务即可:
[dmdba@host bin]$ ./dmap
从库执行数据库还原
关闭数据库后,使用dmrman工具还原备库,dmdba用户到安装目录的bin下执行以下命令:
./dmrman
执行restore:
RESTORE DATABASE '/data/dmslave/slave/dm.ini' FROM BACKUPSET '/data/backfile'
执行recover:
RECOVER DATABASE '/data/dmslave/slave/dm.ini' FROM BACKUPSET '/data/backfile'
执行recover update db_magic:
RECOVER DATABASE '/data/dmslave/slave/dm.ini' UPDATE DB_MAGIC
主从配置文件
(配置文件路径无具体说明,都与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
配置归档配置文件
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
配置守护进程
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 #指定备库重演日志的时间阀值,默认关闭
启动主从库
首先启动主库:
以Mount方式启动主库
./dmserver /data/dmmatser/master/dm.ini mount
启动命令行工具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);
从库操作一样(注意文件路径):
以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
启动监听
./dmmonitor /data/dmmatser/master/dmmonitor.ini
注册服务
以上启动为前台方式启动,仅用户搭建过程中验证配置。配置没问题后需要将实例,守护进程和确认监视器注册为系统服务。使用root用户,到数据库安装目录的script/root下,执行。
注册守护进程服务(主备库都执行)。
./dm_service_installer.sh -t dmwatcher -p master -watcher_ini /data/dmmatser/master/dmwatcher.ini
./dm_service_installer.sh -t dmwatcher -p slave -watcher_ini /data/dmslave/slave/dmwatcher.ini
注册数据库实例服务(之前已经做过,该处不需要重复注册实例服务)
./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
以服务方式启动
启动数据库实例,执行以下命令:
主: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
输入show命令查看集群状态,执行以下命令:
其中守护进程状态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查询主库状态时发现正常!