> 虽然使用docker部署比较方便,但是不建议使用docker部署数据库,尤其是比较关键的系统,负载比较大的系统。 # 1 部署规划 本次部署的是2节点主备集群+1个确认监视器的集群架构。使用的操作系统是centos7.6,cpu架构是x86。 ## 1.1集群ip规划 ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/202305290923542FAJY1GVRXEZEBMM4T) ## 1.2集群端口规划 ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/202305290925170RCTGTCK8A6IC53HDA) ## 1.3实例参数规划 数据库的初始化参数至关重要,一些重要参数如页大小,数据库字符集和大小写是否敏感等,一旦初始化实例是不能直接修改的,如果要修改,必须重新再初始化实例,所以一定要和应用人员沟通清楚。 ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/20230529092620G28VSVZGK73QAK7VR5) ## 1.4磁盘映射 ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/20230529092705BA00UEWDUPGPX5U6T5) ## 1.5目录规划(对应docker内) ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/202305290927573JU1SBS0TWK18VNT5F) # 2 部署前宿主机优化 ## 2.1关闭防火墙 ```gauss systemctl stop firewalld systemctl disable firewalld ``` ## 2.2关闭selinux 容器运行需要对/proc/self/attr/keycreate有写权限,因此需要将SELINUX配置为disable。 ```awk setenforce 0 sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config ``` # 3 部署步骤 ## 3.1 部署docker ```autoit [root@docker ~]#yum install -y docker 启动docker: [root@docker ~]# systemctl start docker ``` ## 3.2 加载数据库主备集群docker镜像包 根据操作系统版本和cpu架构,申请对应的DM8主备集群docker镜像包,下载后,上传到主节点服务器,如/opt目录。 执行以下命令,加载docker镜像: ```stylus docker load -i dm8_20230224_rev178822_x86_rh6_64_docker_dw.tar ``` ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/20230529093338XR209LL1HFDXAVE3XC) 查看加载的镜像:docker images ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/202305290934060KNL9GQOWE709YX59E) 镜像重命名: ```crmsh docker tag dmwatcher:dm8_20230224_rev178822_x86_rh6_64_docker_dw dmwatcher:dm8_dw ``` ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/20230529093428N2BBO716C4WPHJC3Y4) ## 3.3配置docker网络 本次部署主备集群,主库节点、备库节点和监视器节点分别部署在3台服务器上,所以采用HOST模式(容器使用宿主机的IP和端口)。这种方式需要在/etc/hosts文件中配置映射关系,否则容器运行后可能拿到的地址是127.0.0.1,而非本机的真正IP地址。三台服务器均需修改,更改如下: ```accesslog 主库节点: vi /etc/hosts 192.168.1.10 host localhost 备库节点: vi /etc/hosts 192.168.1.11 host localhost 监视器节点: vi /etc/hosts 192.168.1.12 host localhost ``` ## 3.4运行容器 ### 3.4.1运行监视器容器 ```routeros docker run -d --name dmwatcher_monitor --restart=always --privileged=true --net host -e DMWATCHER_ROLE=monitor -e CLUSTER_IPS="192.168.1.10,192.168.1.11,192.168.1.12" -e LD_LIBRARY_PATH=/opt/dmdbms/bin -v /dmdata/dmwatcher_monitor:/opt/dmdbms/data dmwatcher:dm8_dw ``` ### 3.4.2运行备库容器 ```routeros docker run -d --name dmwatcher_standby -p 5236:5236 --restart=always --privileged=true --net host -e DMWATCHER_ROLE=standby -e DW_NO=2 -e CLUSTER_IPS="192.168.1.10,192.168.1.11,192.168.1.12" -e LD_LIBRARY_PATH=/opt/dmdbms/bin -v /dmdata/dmwatcher_standby:/opt/dmdbms/data dmwatcher:dm8_dw ``` ### 3.4.3运行主库容器 ```routeros docker run -d --name dmwatcher_primary -p 5236:5236 --restart=always --privileged=true --net host -e PAGE_SIZE=32 -e extent_size=32 -e CASE_SENSITIVE=1 -e charset=1 -e DMWATCHER_ROLE=primary -e DW_NO=1 -e CLUSTER_IPS="192.168.1.10,192.168.1.11,192.168.1.12" -e LD_LIBRARY_PATH=/opt/dmdbms/bin -v /dmdata/dmwatcher_primary:/opt/dmdbms/data dmwatcher:dm8_dw ``` 注意:需要根据实际情况,设置对应的数据库页大小,字符集,大小写是否敏感,字符以字节还是字符为单位等数据库初始化参数。 ### 3.4.4查看运行的容器 ```ebnf docker ps ``` ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/20230529094945UDY9MTRAOKJGEVOV37) ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/20230529094956OJDH9R52YER1G8EYP9) ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/20230529095003RVPYRD83N033OLF6Z2) ### 3.4.5查看容器应用运行日志: ```powershell docker logs dmwatcher_monitor -f docker logs dmwatcher_standby -f docker logs dmwatcher_primary -f ``` 会发现主库这里一直卡在传输文件到备节点和监视器节点。 ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/20230529095244DS7CMC4JUVHGU54EWR) ### 3.4.6手动拷贝软件和主库备份到其他节点 ```elixir scp BACKUP_FILE_01.tar DAMENG.tar 192.168.1.11:/dmdata/dmwatcher_standby scp BACKUP_FILE_01.tar DAMENG.tar 192.168.1.12:/dmdata/dmwatcher_monitor ``` ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/202305290954161EWWUQMJKB0ISUBE5W) ### 3.4.7重启所有节点的容器 重启主库、备库和监视器的容器,会自动对软件包和备份文件进行解压执行。 ```maxima docker restart dmwatcher_primary docker restart dmwatcher_standby docker restart dmwatcher_monitor ``` 分别各节点日志,发现主备节点都显示SYSTEM IS READY,启动到了MOUNT状态,但是一直无法OPEN。监视器也显示不对,这时候要排查各节点的配置文件是否正确,且主备库是否设置了primary/standby模式,是否设置了相同的oguid。 ### 3.4.8修改主备库的相关配置文件 #### 3.4.8.1数据库参数配置文件dm.ini ```makefile 主库设置: [root@dmdb01 ~]# cd /dmdata/dmwatcher_primary/DAMENG [root@dmdb01 DAMENG]# vi dm.ini INSTANCE_NAME = DW1 #数据库实例名 PORT_NUM = 5236 #数据库实例监听端口 DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间 ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/oguid ENABLE_OFFLINE_TS = 2 #不允许备库OFFLINE表空间 MAL_INI = 1 #打开MAL系统 ARCH_INI = 1 #打开归档配置 备库设置: [root@dmdb01 ~]# cd /dmdata/dmwatcher_standby/DAMENG [root@dmdb01 DAMENG]# vi dm.ini INSTANCE_NAME = DW2 #数据库实例名 PORT_NUM = 5236 #数据库实例监听端口 DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间 ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/oguid ENABLE_OFFLINE_TS = 2 #不允许备库OFFLINE表空间 MAL_INI = 1 #打开MAL系统 ARCH_INI = 1 #打开归档配置 ``` #### 3.4.8.2修改dmmal.ini配置文件 ```makefile 主库和备库的配置是一样的,主库配置如下: [root@dmdb01 DAMENG]# cd /dmdata/dmwatcher_primary/DAMENG [root@dmdb01 DAMENG]# vi dmmal.ini MAL_CHECK_INTERVAL = 5 MAL_CONN_FAIL_INTERVAL = 5 [MAL_INST1] MAL_INST_NAME = DW1 MAL_HOST = 192.168.1.10 MAL_PORT = 61141 MAL_INST_HOST = 192.168.1.10 MAL_INST_PORT = 5236 MAL_DW_PORT = 52141 MAL_INST_DW_PORT = 33141 [MAL_INST2] MAL_INST_NAME = DW2 MAL_HOST = 192.168.1.11 MAL_PORT = 61141 MAL_INST_HOST = 192.168.1.11 MAL_INST_PORT = 5236 MAL_DW_PORT = 52141 MAL_INST_DW_PORT = 33141 ``` #### 3.4.8.3修改归档配置文件dmarch.ini ```makefile 主库设置如下: [root@dmdb01 DAMENG]# cd /dmdata/dmwatcher_primary/DAMENG [root@dmdb01 DAMENG]# vi dmarch.ini [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = DW2 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /opt/dmdbms/data/DAMENG/arch ARCH_FILE_SIZE = 1024 ARCH_SPACE_LIMIT = 10240 #根据实际磁盘设置,建议要能保存2个全备之间的归档。这里设置的是10G 备库设置如下: [root@dmdb02 DAMENG]# cd /dmdata/dmwatcher_standby/DAMENG [root@dmdb02 DAMENG]# vi dmarch.ini [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = DW1 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /opt/dmdbms/data/DAMENG/arch ARCH_FILE_SIZE = 1024 ARCH_SPACE_LIMIT = 10240 ``` #### 3.4.8.4修改数据守护进程文件dmwatcher.ini ```makefile 主库配置如下: [root@dmdb01 DAMENG]# cd /dmdata/dmwatcher_primary/DAMENG [root@dmdb01 DAMENG]# vi dmwatcher.ini [GRP453331] DW_TYPE = GLOBAL DW_MODE = AUTO DW_ERROR_TIME = 10 INST_RECOVER_TIME = 60 INST_ERROR_TIME = 10 INST_OGUID = 453331 INST_INI = /opt/dmdbms/data/DAMENG/dm.ini INST_AUTO_RESTART = 1 INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver RLOG_SEND_THRESHOLD = 0 RLOG_APPLY_THRESHOLD = 0 备库配置如下: [root@dmdb02 DAMENG]# cd /dmdata/dmwatcher_standby/DAMENG/ [root@dmdb02 DAMENG]# vi dmwatcher.ini [GRP453331] DW_TYPE = GLOBAL DW_MODE = AUTO DW_ERROR_TIME = 10 INST_RECOVER_TIME = 60 INST_ERROR_TIME = 10 INST_OGUID = 453331 INST_INI = /opt/dmdbms/data/DAMENG/dm.ini INST_AUTO_RESTART = 1 INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver RLOG_SEND_THRESHOLD = 0 RLOG_APPLY_THRESHOLD = 0 ``` #### 3.4.8.5设置数据库模式和oguid ```elixir 主库执行: [root@dmdb01 opt]# docker exec -it dmwatcher_primary /bin/bash root@dmdb01:/# cd /opt/dmdbms/bin root@dmdb01:/opt/dmdbms/bin# ./disql sysdba/SYSDBA001 SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1); ALTER DATABASE PRIMARY; SP_SET_OGUID(453331); SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0); 备库执行: [root@dmdb02 DAMENG]# docker exec -it dmwatcher_standby /bin/bash root@dmdb02:/# cd /opt/dmdbms/bin root@dmdb02:/opt/dmdbms/bin# ./disql sysdba/SYSDBA001 SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1); ALTER DATABASE STANDBY; SP_SET_OGUID(453331); SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0); ``` #### 3.4.8.6修改监视器配置文件dmmonitor.ini ```makefile 确认监视器配置如下: [root@dmmonitor ~]# cd /dmdata/dmwatcher_monitor/DAMENG/ [root@dmmonitor DAMENG]# vi dmmonitor.ini MON_DW_Confirm = 1 MON_LOG_PATH = /opt/dmdbms/data/log MON_LOG_INTERVAL = 60 MON_LOG_FILE_SIZE = 128 MON_LOG_SPACE_LIMIT = 1024 [GRP453331] MON_INST_OGUID = 453331 MON_DW_IP = 192.168.1.11:52141 MON_DW_IP = 192.168.1.10:52141 ``` #### 3.4.8.7更新数据库授权 上传数据库的授权文件dm.key到/opt,更新主库和备库的数据库授权。 ```vim 主库操作: [root@dmdb01 ~]# cd /opt/ [root@dmdb01 opt]# docker cp dm.key dmwatcher_primary:/opt/dmdbms/bin 备库操作: [root@dmdb02 ~]# cd /opt/ [root@dmdb02 opt]# docker cp dm.key dmwatcher_standby:/opt/dmdbms/bin ``` 当然这里也可以在创建容器的时候就指定授权文件。指定-v参数: ```awk -v /opt/dm.key:/opt/dmdbms/bin/dm.key ``` #### 3.4.8.8重启所有容器 ```autoit 先监视器,再主库,后备库: [root@dmmonitor DAMENG]# docker restart dmwatcher_monitor [root@dmdb01 opt]# docker restart dmwatcher_primary [root@dmdb02 opt]# docker restart dmwatcher_standby ``` #### 3.4.8.9查看监视器状态 重启完主库和备库容器后,通过监视器查看集群是否启动成功,且主库和备库数据库都处于OPEN状态,且远程归档状态都是VALID。至此,主备集群部署完成。 ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/20230529101051IY61R6K5GIYTY1ZA1M) ### 3.4.9优化数据库参数 分别登陆主库和备库节点,执行数据库参数优化脚本AutoParaAdj3.4_dm8.sql。优化完成后,重启主备集群容器。 # 4集群启停方式 ## 4.1集群启动 先启动主库,再启动备库,最后启动确认监视器。启动后,通过监视器查询集群状态。 ```autoit [root@data43 DAMENG]# docker start dmwatcher_primary [root@data44 DAMENG]# docker start dmwatcher_standby [root@monitoring DAMENG]# docker start dmwatcher_monitor ``` ## 4.2集群关闭 先关闭确认监视器,再关闭主库,最后关闭备库。 ```autoit [root@monitoring DAMENG]# docker stop dmwatcher_monitor [root@data43 DAMENG]# docker stop dmwatcher_primary [root@data44 DAMENG]# docker stop dmwatcher_standby ``` ## 4.3数据库登陆方式 方法(1):进入容器,使用disql客户端登陆 ```elixir [root@data43 DAMENG]# docker exec -it dmwatcher_primary bash root@data43:/# cd /opt/dmdbms/bin root@data43:/opt/dmdbms/bin# ./disql sysdba/SYSDBA001 Server[LOCALHOST:5236]:mode is primary, state is open login used time : 4.520(ms) last login ip : ::1 last login time : 2023-05-24 17:12:49 login failed times : 0 Whether password is expired : Not expired disql V8 ``` 方法(2):使用达梦管理工具manager登陆: ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/20230529101657VHJHIWV4S8PPBDOO0I) # 5应用链接方式 (1)数据库驱动:进入容器,数据库驱动位于/opt/dmdbms/drivers目录,如 jdbc驱动,DmJdbcDriver18.jar(对应jdk1.8),DmJdbcDriver17.jar(对应jdk1.7)。 (2)URL链接方式:采用服务名的方式链接达梦主备集群。 配置文件不是xml文件,则配置如下: ```apache jdbc:dm://DMDW?DMDW=(192.168.1.10:5236, 192.168.1.11:5236)&LOGIN_MODE=(1) ``` 配置文件是xml文件,则配置如下: ```apache jdbc:dm://DMDW?DMDW=(192.168.1.10:5236, 192.168.1.11:5236) &LOGIN_MODE=(1) ``` # 6docker参数解释 ![image.png](https://download.dameng.com/eco-file-server/file/eco/preview/20230529101924UHEN1P5RWAL4CO7KZQ) docker run -d -p 15236:5236 --restart=always --name dmwatcher_primary --privileged=true --net docker1 --ip 172.28.0.2 -e MODE=docker_dmwatcher -e PAGE_SIZE=32 -e CASE_SENSITIVE=1 -e UNICODE_FLAG=1 -e BLANK_PAD_MODE=1 -e SYSDBA_PWD=Skh_2025 -e SYSAUDITOR_PWD=Skh_2025 -e DMWATCHER_ROLE=primary -e DW_NO=1 -e CLUSTER_IPS="172.28.0.4,172.28.0.2,172.28.0.3" -v /data/deploy/dm-server/dm8/image/dm.key:/opt/dmdbms/bin/dm.key dm8:dm8_20241230_rev255012_HWarm_kylin10_64 #!/bin/env bash # 运行主节点容器 name=dmwatcher_primary img=dm8:dm8_20241230_rev255012_x86_kylin10_64 docker rm -vf $name docker run -d \ -p 30136: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=sunyard123 \ -e DMWATCHER_ROLE=primary \ -e DW_NO=1 \ -e CLUSTER_IPS="172.20.0.2,172.20.0.3,172.20.0.4" \ -e LD_LIBRARY_PATH=/opt/dmdbms/bin \ -v `pwd`/dmwatcher_primary:/opt/dmdbms/data \ -v `pwd`/dm1701120153.key:/opt/dmdbms/bin/dm.key \ $img