目录
1. Docker集群的搭建
2. 检查主备数据库
3. 主备集群的JDBC连接设置
1. Docker集群的搭建
达梦的镜像文件都是tar文件,通过docker load命令导入:
docker load -i dm8_20240422_x86_rh6_64_rq_ent_8.1.3.140.tar
成功导入后,可看到镜像的仓库名和标签:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dm8 dm8_20240422_rev222308_x86_rh6_64 c6c32f5a271c 6 weeks ago 1.25GB
选择一个目录创建我们的docker-compose.yml文件:
networks:
dmnet:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
services:
dm_monitor:
container_name: dm_monitor
image: dm8:dm8_20240422_rev222308_x86_rh6_64
networks:
dmnet:
ipv4_address: 172.20.0.2
restart: always
volumes:
- ./data/monitor:/opt/dmdbms/data
environment:
- MODE=docker_dmwatcher
- PAGE_SIZE=16
- CASE_SENSITIVE=1
- UNICODE_FLAG=1
- LENGTH_IN_CHAR=1
- SYSDBA_PWD=SYSDBA001
- DMWATCHER_ROLE=monitor
- CLUSTER_IPS="172.20.0.2,172.20.0.3,172.20.0.4"
- LD_LIBRARY_PATH=/opt/dmdbms/bin
dm_primary:
container_name: dm_primary
image: dm8:dm8_20240422_rev222308_x86_rh6_64
networks:
dmnet:
ipv4_address: 172.20.0.3
ports:
- '30136:5236'
restart: always
volumes:
- ./data/primary:/opt/dmdbms/data
environment:
- MODE=docker_dmwatcher
- PAGE_SIZE=16
- CASE_SENSITIVE=1
- UNICODE_FLAG=1
- LENGTH_IN_CHAR=1
- SYSDBA_PWD=SYSDBA001
- DMWATCHER_ROLE=primary
- DW_NO=1
- CLUSTER_IPS="172.20.0.2,172.20.0.3,172.20.0.4"
- LD_LIBRARY_PATH=/opt/dmdbms/bin
depends_on:
- dm_monitor
dm_standby:
container_name: dm_standby
image: dm8:dm8_20240422_rev222308_x86_rh6_64
networks:
dmnet:
ipv4_address: 172.20.0.4
ports:
- '30236:5236'
restart: always
volumes:
- ./data/standby:/opt/dmdbms/data
environment:
- MODE=docker_dmwatcher
- PAGE_SIZE=16
- CASE_SENSITIVE=1
- UNICODE_FLAG=1
- LENGTH_IN_CHAR=1
- SYSDBA_PWD=SYSDBA001
- DMWATCHER_ROLE=standby
- DW_NO=2
- CLUSTER_IPS="172.20.0.2,172.20.0.3,172.20.0.4"
- LD_LIBRARY_PATH=/opt/dmdbms/bin
depends_on:
- dm_primary
就在这个docker-compose.yml文件的目录下,执行docker-compose载入配置:
docker-compose up -d --wait
载入完成后可以查看运行着的3个容器:
docker ps --format "table {{.Image}}\t{{.Ports}}\t{{.Names}}"
IMAGE PORTS NAMES
dm8:dm8_20240422_rev222308_x86_rh6_64 52141/tcp, 61141/tcp, 0.0.0.0:30236->5236/tcp dm_standby
dm8:dm8_20240422_rev222308_x86_rh6_64 52141/tcp, 61141/tcp, 0.0.0.0:30136->5236/tcp dm_primary
dm8:dm8_20240422_rev222308_x86_rh6_64 5236/tcp, 52141/tcp, 61141/tcp dm_monitor
可以检查日志来确认3个容器都初始化完成:
docker logs dm_primary | more
docker logs dm_standby | more
docker logs dm_monitor | more
有可能standby或monitor节点没有能正常启动,这时就需要手动将primary节点的数据库tar文件和备份tar文件手动复制到没有能复制的standby或monitor节点的数据目录。然后再重启相应的standby或monitor容器。
cp data/primary/*.tar data/standby
docker restart dm_standby
cp data/primary/*.tar data/monitor
docker restart dm_monitor
也可以直接检查这些tar文件:
ls -l1 data/*/*.tar
data/monitor/BACKUP_FILE_01.tar
data/monitor/DAMENG.tar
data/primary/BACKUP_FILE_01.tar
data/primary/DAMENG.tar
data/standby/BACKUP_FILE_01.tar
data/standby/DAMENG.tar
2. 检查主备数据库
我们开两个Console窗口:一个窗口先进入容器dm_monitor,然后尝试连接各自主数据库和备用数据库;另一个窗口用来停止和启动主数据库和备用数据库的运行容器,从而模仿实际情况下数据库的宕机和重启。
docker exec -it dm_monitor bash
这样就以root用户登陆到了dm_monitor的命令行窗口。然后尝试连接dm_primary节点的主数据库,既可以用容器名dm_primary,也可以用docker-compose.yml文件中定义的IP地址172.20.0.3:
/opt/dmdbms/bin/disql SYSDBA/SYSDBA001@dm_primary:5236
## OR
/opt/dmdbms/bin/disql SYSDBA/SYSDBA001@172.20.0.3:5236
这时就会显示进入了集群数据库主节点的SQL模式:
Server[dm_primary:5236]:mode is primary, state is open
login used time : 41.247(ms)
disql V8
SQL>
## OR
Server[172.20.0.3:5236]:mode is primary, state is open
login used time : 11.328(ms)
disql V8
SQL>
quit退出后,又尝试备用节点dm_standby,或IP 172.20.0.4:
/opt/dmdbms/bin/disql SYSDBA/SYSDBA001@dm_standby:5236
## OR
/opt/dmdbms/bin/disql SYSDBA/SYSDBA001@172.20.0.4:5236
显示进入了集群数据库备用节点的SQL模式:
Server[dm_standby:5236]:mode is standby, state is open
login used time : 33.271(ms)
disql V8
## OR
Server[172.20.0.4:5236]:mode is standby, state is open
login used time : 11.359(ms)
disql V8
另外,可以通过跟踪dm_monitor节点的日志来判定主备服务器的状态及变化情况:
docker logs dm_monitor -f
......
[monitor] 2024-06-10 17:08:32: <MON CHECK GRP453331_DW1>
[monitor] 2024-06-10 17:08:32: Dmwatcher process GRP453331_DW1 status switching [STARTUP-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-06-10 17:08:32 OPEN OK GRP453331_DW1 OPEN PRIMARY VALID 4 43564 43564
[monitor] 2024-06-10 17:08:32: </MON CHECK GRP453331_DW1>
[monitor] 2024-06-10 17:08:32: <MON CHECK GRP453331_DW2>
[monitor] 2024-06-10 17:08:32: Dmwatcher process GRP453331_DW2 status switching [STARTUP-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-06-10 17:08:32 OPEN OK GRP453331_DW2 OPEN STANDBY VALID 4 43564 43564
[monitor] 2024-06-10 17:08:32: </MON CHECK GRP453331_DW2>
......
请注意“INAME”和“IMODE”这两列,分别是数据库实体的名字和实体的主备模式。这里看到实体GRP453331_DW1的模式为PRIMARY,而实体GRP453331_DW2的模式为STANDBY。
3. 主备集群的JDBC连接设置
达梦的服务网站可以下载JDBC驱动程序:产品下载 | 达梦数据库,而在其技术文档中有基本的JDBC连接配置说明:JDBC 接口 | 达梦技术文档。
jdbc:dm[://host][:port][?propName1=propValue1][&propName2=propValue2]...
然而,主备集群的JDBC连接url有所不同:
jdbc:dm://dmconn?dmconn=(host1:port1,host2:port2,host3:port3)
我在DBeaver中分别配置了单服务器和主备服务集群的驱动模版,然后用它们又配置了主数据库和备用数据库各自的连接,以及涵盖主备数据库的集群的连接。
单数据库服务器的驱动模版:
以及主数据库和备用数据库各自的连接:
而集群的驱动模版设置如下:
由此设置的数据库集群连接为: