本文深入探讨在docker容器下如何创建1主库1实时备库1监视器的达梦主备集群架构数据库,特别介绍达梦主备架构中参数最优配置。验证常见问题例如主库异常情况下,观察使用了服务名的业务在无需做任何变更的情况下,也能保持业务连续性,进而证明达梦主备集群架构的数据库是具有高可用性。
本次验证使用宿主机是Intel X86_64架构,操作系统为CentOS 7.9,内存8G,硬盘1T
[root@node1 ~]#
[root@node1 ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 1
Core(s) per socket: 8
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 165
Model name: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz
Stepping: 3
CPU MHz: 3599.999
BogoMIPS: 7199.99
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 6144K
NUMA node0 CPU(s): 0-7
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat md_clear spec_ctrl intel_stibp flush_l1d arch_capabilities
[root@node1 ~]#
[root@node1 ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
复制
[root@node1 ~]#
[root@node1 ~]# free -g
total used free shared buff/cache available
Mem: 7 2 1 0 3 5
Swap: 0 0 0
[root@node1 ~]#
复制
[root@node1 ~]#
[root@node1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1T 0 disk
├─sda1 8:1 0 300M 0 part /boot
├─sda2 8:2 0 7.9G 0 part
└─sda3 8:3 0 1015.9G 0 part /
sr0 11:0 1 1024M 0 rom
[root@node1 ~]#
复制
[root@node1 ~]# ip addr
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:be:50:75 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.52/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33
valid_lft 73391sec preferred_lft 73391sec
[root@node1 ~]#
[root@node1 ~]#
[root@node1 ~]# ping www.baidu.com
PING www.a.shifen.com (14.119.104.254) 56(84) bytes of data.
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=1 ttl=56 time=9.92 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=2 ttl=56 time=10.6 ms
^C
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 9.927/10.304/10.682/0.390 ms
[root@node1 ~]#
复制
[root@node1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
.....
Complete!
[root@node1 ~]#
复制
[root@node1 ~]#yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror, langpacks
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
[root@node1 ~]# yum makecache fast
Loaded plugins: fastestmirror, langpacks
......
Complete!
[root@node1 ~]#
复制
[root@node1 ~]# yum makecache fast
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
......
Metadata Cache Created
[root@node1 ~]#
复制
[root@node1 ~]# yum -y install docker-ce docker-ce-cli containerd.io
Loaded plugins: fastestmirror, langpacks
......
Complete!
[root@node1 ~]#
复制
[root@node1 ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@node1 ~]#
复制
[root@node1 ~]# systemctl start docker
[root@node1 ~]#
复制
[root@node1 ~]# docker version
Client: Docker Engine - Community
Version: 24.0.4
API version: 1.43
Go version: go1.20.5
Git commit: 3713ee1
Built: Fri Jul 7 14:54:21 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 24.0.4
API version: 1.43 (minimum version 1.12)
Go version: go1.20.5
Git commit: 4ffc614
Built: Fri Jul 7 14:53:26 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.21
GitCommit: 3dce8eb055cbb6872793272b4f20ed16117344f8
runc:
Version: 1.1.7
GitCommit: v1.1.7-0-g860f061
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@node1 ~]#
复制
创建1主库1实时备库1监视器的达梦主备集群架构数据库。
序号 角色 IP 端口
1 主库(primary) 172.20.0.2 35232
2 实时备库(standby) 172.20.0.3 35233
3 监视器(monitor) 172.20.0.4
-p<映射端口:数据库端口>:例如-p 30236:5236 是指将容器中数据库默认端口5236 映射到宿主机上 30236 端口,应用可以通过宿主机 IP:30236 端口访问容器中数据库服务;此参数为必须配置参数。5236 是数据库的默认端口,数值不能替换;宿主机端口30236 是容器映射出来的,取值范围 30000~33000。
-name:指定容器名称如 dmsingle;此参数为必须配置参数。
-e MODE:用于区分部署单机或主备容器模式的选择,若 MODE=dmsingle,则镜像运行部署单机容器,若 MODE=docker_dmwatcher,则镜像运行部署主备集群容器;此参数为必须配置参数。
-e CLUSTER_IPS:达梦主备集群所有节点容器 IP,IP 之间用“,”隔开,第一个 IP 是监视器 IP,第二个 IP 是主节点IP,主节点 IP 之后的是所有备节点 IP
-e LD_LIBRARY_PATH:指定容器 LD_LIBRARY_PATH 环境变量
-e DMWATCHER_ROLE:达梦主备集群节点角色:主节点(primary) 、 备节点(standby)、监视器(monitor)
-e DW_NODES;当 mode=dmwatcher 时配置,达梦主备集群节点数,不包含监视器节点
-e DW_NO:当 mode=dmwatcher 时配置,INSTANCE_NAME后面的序号(顺序号),例如主节点为1,备节点依次为2,3
-v <宿主机目录> <镜像名>:使用宿主机本地磁盘目录来存放 dm8 容器里的数据库数据文件。挂载的容器目录为/opt/dmdbms/data,本地磁盘的挂载路径为/home/mnt/disks/dmsingle;此参数为必须配置参数。
<镜像名>:运行容器时所需要拉取的镜像,以镜像的“name:tag”格式输入,例如dm8:dm8_20230209_rev176349_x86_rh6_64;此参数为必须配置参数。
-e PAGE_SIZE 等其他参数:达梦数据库初始化实例参数可以通过“-e 参数名=参数值”方式进行指定,初始化实例详细参数介绍可以在《DM8_dminit 使用手册》进行查阅。此类参数为包含默认值的参数,若没有通过-e 方式指定的话,则以默认值运行容器
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /opt/dmdbms/data/DAMENG/arch/ #本地归档存放路径
ARCH_FILE_SIZE = 256 #单个归档大小,单位 MB
ARCH_SPACE_LIMIT = 10240 #归档上限,单位 MB
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP453331_DW2 #实时归档目标实例名
复制
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /opt/dmdbms/data/DAMENG/arch/ #本地归档存放路径
ARCH_FILE_SIZE = 256 #单个归档大小,单位 MB
ARCH_SPACE_LIMIT = 10240 #归档上限,单位 MB
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP453331_DW1 #实时归档目标实例名
复制
MAL_CHECK_INTERVAL = 10 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间
MAL_TEMP_PATH = /opt/dmdbms/data/malpath/ #临时文件目录
MAL_BUF_SIZE = 512 #单个 MAL 缓存大小,单位 MB
MAL_SYS_BUF_SIZE = 2048 #MAL 总大小限制,单位 MB
MAL_COMPRESS_LEVEL = 0 #MAL 消息压缩等级,0 表示不压缩
[MAL_INST1]
MAL_INST_NAME = GRP453331_DW1 #实例名,和 dm.ini 的 INSTANCE_NAME 一致
MAL_HOST = 172.20.0.2 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 172.16.1.1 #实例的对外服务 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 = GRP453331_DW2
MAL_HOST = 172.20.0.3
MAL_PORT = 61141
MAL_INST_HOST = 172.16.1.2
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
MAL_INST_DW_PORT = 33141
复制
[GRP453331]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切
DW_ERROR_TIME = 20 #远程守护进程故障认定时间
INST_ERROR_TIME = 20 #本地实例故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_OGUID = 45331 #守护系统唯一 OGUID 值
INST_INI = /opt/dmdbms/data/DAMENG/dm.ini #dm.ini 文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
DW_RECONNECT = 2 #让主节点coredump 结束前开始进行切主,2023年Q4版本新增,主节点core dump 结束前开始切主
复制
MON_DW_CONFIRM = 1 #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH = /opt/dmdbms/data/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #单个日志大小,单位 MB
MON_LOG_SPACE_LIMIT = 0 #日志上限,单位 MB
[GRP453331]
MON_INST_OGUID = 45331 #组 GRP1 的唯一 OGUID 值
MON_DW_IP = 172.20.0.2:52141 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT
MON_DW_IP = 172.20.0.3:52141
复制
使用net1的docker容器可通过net1网络相互通讯,且能被外网访问
[root@node1 ~]# ddocker network create --driver bridge --subnet=172.20.0.0/24 --gateway 172.20.0.1 net1
bba9b239f696e61362442fc8e9e25abd643da9fc9b053a21c62cf812ebf70096
[root@node1 ~]#
复制
[root@node1 disks]# docker run -d -p 35232:5236 --restart=always --name dmwatcher_primary --privileged=true --net net1 --ip 172.20.0.2 -e MODE=docker_dmwatcher -e PAGE_SIZE=16 -e CASE_SENSITIVE=1 -e UNICODE_FLAG=1 -e LENGTH_IN_CHAR=1 -e SYSDBA_PWD=SYSDBA001 -e DMWATCHER_ROLE=primary -e DW_NODES=2 -e DW_NO=1 -e CLUSTER_IPS="172.20.0.4,172.20.0.2,172.20.0.3" -e LD_LIBRARY_PATH=/opt/dmdbms/bin -v /home/mnt/disks/dmwatcher_primary:/opt/dmdbms/data dm8:dm8_20230629_rev187846_x86_rh6_64
557b093aeaa5e1988862534dec7048d8d6d6b7152ad42646508db2ed987ec2f5
[root@node1 disks]#
复制
[root@node1 disks]#
[root@node1 disks]# docker run -d -p 35233:5236 --restart=always --name dmwatcher_standby --privileged=true --net net1 --ip 172.20.0.3 -e MODE=docker_dmwatcher -e PAGE_SIZE=16 -e CASE_SENSITIVE=1 -e UNICODE_FLAG=1 -e LENGTH_IN_CHAR=1 -e SYSDBA_PWD=SYSDBA001 -e DMWATCHER_ROLE=standby -e DW_NODES=2 -e DW_NO=2 -e CLUSTER_IPS="172.20.0.4,172.20.0.2,172.20.0.3" -e LD_LIBRARY_PATH=/opt/dmdbms/bin -v /home/mnt/disks/dmwatcher_standby:/opt/dmdbms/data dm8:dm8_20230629_rev187846_x86_rh6_64
8e6b12f7c221cb6214b9bb6c786cbda9fcc69cc43349144e09e1bc4426049633
[root@node1 disks]#
复制
[root@node1 disks]#
[root@node1 disks]# docker run -d --restart=always --name dmwatcher_monitor --privileged=true --net net1 --ip 172.20.0.4 -e MODE=docker_dmwatcher -e PAGE_SIZE=16 -e CASE_SENSITIVE=1 -e UNICODE_FLAG=1 -e LENGTH_IN_CHAR=1 -e SYSDBA_PWD=SYSDBA001 -e DMWATCHER_ROLE=monitor -e CLUSTER_IPS="172.20.0.4,172.20.0.2,172.20.0.3" -e LD_LIBRARY_PATH=/opt/dmdbms/bin -v /home/mnt/disks/dmwatcher_monitor:/opt/dmdbms/data dm8:dm8_20230629_rev187846_x86_rh6_64
185e5835554b877719295f437558b80e5608e2b104c9d60ea8bf5767afe0560b
[root@node1 disks]#
复制
docker logs -f -n10 dmwatcher_primary #查看主数据库容器日志
==> /opt/dmdbms/log/DmServiceDMSERVER.log <==
checkpoint requested by CKPT_INTERVAL, rlog free space[536849408], used space[13312]
checkpoint generate by ckpt_interval
checkpoint begin, used_space[13312], free_space[536849408]...
checkpoint end, 0 pages flushed, used_space[13824], free_space[536848896].
复制
docker logs -f -n10 dmwatcher_standby #查看备数据库容器日志
==> /opt/dmdbms/log/DmServiceDMSERVER.log <==
checkpoint requested by CKPT_INTERVAL, rlog free space[536848384], used space[14336]
checkpoint generate by ckpt_interval
checkpoint begin, used_space[14336], free_space[536848384]...
checkpoint end, 0 pages flushed, used_space[14848], free_space[536847872].
复制
docker logs -f -n10 dmwatcher_monitor #查看监视器容器日志
[monitor] 2024-03-31 22:48:43:
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP453331 453331 TRUE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
172.20.0.2 52141 2024-03-31 22:48:42 GLOBAL VALID OPEN GRP453331_DW1 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
172.20.0.2 5236 OK GRP453331_DW1 OPEN PRIMARY 0 0 REALTIME VALID 4726 38650 4726 38650 NONE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
172.20.0.3 52141 2024-03-31 22:48:42 GLOBAL VALID OPEN GRP453331_DW2 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
172.20.0.3 5236 OK GRP453331_DW2 OPEN STANDBY 0 0 REALTIME VALID 4722 38650 4722 38650 NONE
DATABASE(GRP453331_DW2) APPLY INFO FROM (GRP453331_DW1), REDOS_PARALLEL_NUM (1), WAIT_APPLY(FALSE):
DSC_SEQNO[0], (RSEQ, SSEQ, KSEQ)[4726, 4726, 4726], (RLSN, SLSN, KLSN)[38650, 38650, 38650], N_TSK[0], TSK_MEM_USE[0]
REDO_LSN_ARR: (38650)
复制
至此,通过查看主备集群日志,可以发现1主1备1监视器的主备集群架构已成功搭建。
根据应用需求,定制备份策略如下所示
备份类型 备份周期 备份时间
全量备份 每周 每周六 22 点
增量备份 每天 除周六外每天 22 点
删除备份 每天 每天 23 点 30
登录数据库执行以下命令,
SP_INIT_JOB_SYS(1);
复制
每周六 23 点全备
call SP_CREATE_JOB('bakfull',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('bakfull');
call SP_ADD_JOB_STEP('bakfull', 'bak1', 6, '01020000/dmbak', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakfull', 'std1', 1, 2, 1, 64, 0, '22:00:00', NULL, '2021-11-01 21:17:22', NULL, '');
call SP_ADD_JOB_SCHEDULE('bakfull', 'once_test', 1, 0, 0, 0, 0, NULL, NULL, sysdate+1/1440, NULL, '');
call SP_JOB_CONFIG_COMMIT('bakfull');
复制
每周除周六外每天 23 点增量备份
call SP_CREATE_JOB('bakincr',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('bakincr');
call SP_ADD_JOB_STEP('bakincr', 'bak2', 6, '41010000/dmbak|/dmbak', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakincr', 'std2', 1, 2, 1, 63, 0, '22:00:00', NULL, '2021-11-01 21:19:30', NULL, '');
call SP_JOB_CONFIG_COMMIT('bakincr');
复制
每天 23:30 删除 14 天前备份
call SP_CREATE_JOB('delbak',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('delbak');
call SP_ADD_JOB_STEP('delbak','bak1',0, 'SF_BAKSET_BACKUP_DIR_ADD(''DISK'',''/dmdata/dmbak'');call sp_db_bakset_remove_batch(''DISK'',now()-14);', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('delbak', 'del01', 1, 1, 1, 0, 0, '23:30:00', NULL, '2020-11-02 14:48:41', NULL, '');
call SP_JOB_CONFIG_COMMIT('delbak');
复制
每周6凌晨1点开始收集
call SP_CREATE_JOB('statistics',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('statistics');
call SP_ADD_JOB_STEP('statistics', 'statistics1', 0, 'begin
for rs in (select ''sf_set_SESSION_para_value(''''HAGR_HASH_SIZE'''',(select cast(
case when max(table_rowcount(owner,table_name))<=(select max_value from v$dm_ini
where para_Name=''''HAGR_HASH_SIZE'''') and max(table_rowcount(owner,table_name))>=(
select min_value from v$dm_ini where para_Name=''''HAGR_HASH_SIZE'''') then
max(table_rowcount(owner,table_name)) when max(table_rowcount(owner,table_name))<(
select min_value from v$dm_ini where para_Name=''''HAGR_HASH_SIZE'''') then
(select min_value from v$dm_ini where para_Name=''''HAGR_HASH_SIZE'''') else
(select max_value from v$dm_ini where para_Name=''''HAGR_HASH_SIZE'''') end as bigint)
from dba_tables where owner=''''''||NAME||''''''));''
sql1,''DBMS_STATS.GATHER_SCHEMA_STATS(''''''||NAME||'''''',100,TRUE,''''FOR ALL COLUMNS SIZE AUTO'''');''
sql2
from SYS.SYSOBJECTS where TYPE$=''SCH'' ) loop
execute immediate rs.sql1;
execute immediate rs.sql2;
end loop;
end;', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('statistics', 'statistics1', 1, 2, 1, 64, 0, '01:00:00', NULL, '2021-06-09 22:54:37', NULL, '');
call SP_JOB_CONFIG_COMMIT('statistics');
复制
使用了服务名的Jmeter在无需做任何变更的情况下,也能保持Jmeter连续性,进而证明达梦主备集群架构的数据库具有高可用性。
达梦数据库提供客户端(通常为应用)通过服务名连接集群的方式,在客户端所在的服务器(通常为应用服务器)的指定位置配置 dm_svc.conf 文件,该文件路径为:32/64位Win32 操作平台下,此文件位于 %SystemRoot%\system32 目录;在 Linux 平台下,此文件位于/etc 目录。
如果该文件在以上位置不存在,直接新建dm_svc.conf 文件即可。
文件内容:
# 以#开头的行表示是注释
# 全局配置区
DMDW=(192.168.0.52:35232,192.168.0.52:35233)
TIME_ZONE=(+480) #表示+8:00 时区
LOGIN_ENCRYPT=(0)
DIRECT=(Y)
# 服务配置区
[DMDW]
LOGIN_MODE=(1) #只连主库
复制
图:Jmeter的服务名配置
图:Jmeter可正常查询
图:Jmeter可正常查询
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
185e5835554b dm8:dm8_20230629_rev187846_x86_rh6_64 "/bin/bash /opt/star…" 28 minutes ago Up 28 minutes 5236/tcp, 52141/tcp, 61141/tcp dmwatcher_monitor
8e6b12f7c221 dm8:dm8_20230629_rev187846_x86_rh6_64 "/bin/bash /opt/star…" 29 minutes ago Up 29 minutes 52141/tcp, 61141/tcp, 0.0.0.0:35233->5236/tcp dmwatcher_standby
557b093aeaa5 dm8:dm8_20230629_rev187846_x86_rh6_64 "/bin/bash /opt/star…" 29 minutes ago Up 29 minutes 52141/tcp, 61141/tcp, 0.0.0.0:35232->5236/tcp dmwatcher_primary
89e71c7d22bd dm8:dm8_20230629_rev187846_x86_rh6_64 "/bin/bash /opt/star…" 35 hours ago Up 3 hours 52141/tcp, 61141/tcp, 0.0.0.0:35236->5236/tcp dmsingle
[root@node1 ~]#
[root@node1 ~]# docker kill dmwatcher_primary
dmwatcher_primary
[root@node1 ~]# docker start dmwatcher_primary
dmwatcher_primary
[root@node1 ~]#
复制
图:Jmeter可感知数据库故障
图:Jmeter可正常查询
通过模拟主库故障,在故障前后,使用了服务名的Jmeter在无须做任何变更的情况下,也能保持业务连续性,进而证明达梦主备集群架构的数据库具有高可用性。
本文详细描述如何在docker容器下创建1主库1实时备库1监视器的达梦主备集群架构数据库,同时也特别介绍达梦主备架构中参数最优配置。
通过模拟主库异常情况后,观察使用了服务名的业务在无需做任何变更的情况下,也能保持业务连续性,进而证明达梦主备集群架构的数据库是具有高可用性。
文章
阅读量
获赞