使用docker-compose搭建达梦数据库主备集群

目录

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中分别配置了单服务器和主备服务集群的驱动模版,然后用它们又配置了主数据库和备用数据库各自的连接,以及涵盖主备数据库的集群的连接。

单数据库服务器的驱动模版:

以及主数据库和备用数据库各自的连接:

而集群的驱动模版设置如下:

由此设置的数据库集群连接为:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值