You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ClusterJ无法从容器外部连接Docker部署的MySQL集群

解决Docker搭建的MySQL Cluster外部ClusterJ连接失败问题

让我们一步步拆解你的问题并找到解决方案:

问题根源分析

从你的日志可以看到,管理节点已经成功给你的ClusterJ客户端分配了NodeID 6,但随即断开连接。核心原因有两个:

  1. 网络可达性问题:Docker自定义网段(192.168.0.0/16)的IP对于主机来说是不可直接访问的,当管理节点把数据节点的地址(192.168.0.3/4)返回给ClusterJ客户端后,主机无法连接到这些内网地址。
  2. API节点配置不明确:虽然你添加了[api]段,但没有指定可用的NodeID范围,容易导致节点分配冲突。

解决方案步骤

1. 修正MySQL Cluster配置文件(mysql-cluster.cnf)

明确指定API节点的ID范围,避免分配冲突:

[ndbd default]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M

[ndb_mgmd]
NodeId=1
hostname=192.168.0.2
datadir=/var/lib/mysql

[ndbd]
NodeId=2
hostname=192.168.0.3
datadir=/var/lib/mysql

[ndbd]
NodeId=3
hostname=192.168.0.4
datadir=/var/lib/mysql

[mysqld]
NodeId=4
hostname=192.168.0.10

# 为外部API客户端预留明确的NodeID范围
[api]
NodeId=6-10

2. 调整Docker Compose配置,暴露数据节点端口

ClusterJ客户端不仅需要连接管理节点的1186端口,还需要和数据节点的2202端口通信,所以要添加端口映射:

version: '3'
services:
  database-manager:
    image: mysql/mysql-cluster
    networks:
      database_net:
        ipv4_address: 192.168.0.2
    command: ndb_mgmd
    ports:
      - "1186:1186"
    volumes:
      - /c/Users/myuser/conf/mysql-cluster.cnf:/etc/mysql-cluster.cnf

  database-node-1:
    image: mysql/mysql-cluster
    networks:
      database_net:
        ipv4_address: 192.168.0.3
    command: ndbd --bind-address=0.0.0.0
    depends_on:
      - database-manager
    ports:
      - "2202:2202"

  database-node-2:
    image: mysql/mysql-cluster
    networks:
      database_net:
        ipv4_address: 192.168.0.4
    command: ndbd --bind-address=0.0.0.0
    depends_on:
      - database-manager
    ports:
      - "2203:2202"

  database-server:
    image: mysql/mysql-cluster
    networks:
      database_net:
        ipv4_address: 192.168.0.10
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=true
      - MYSQL_DATABASE=my_db
      - MYSQL_USER=my_user
    command: mysqld

networks:
  database_net:
    ipam:
      config:
        - subnet: 192.168.0.0/16

这里做了两个关键修改:

  • 给数据节点添加--bind-address=0.0.0.0,允许从任意地址连接
  • 将两个数据节点的2202端口分别映射到主机的2202和2203,避免端口冲突

3. 修改ClusterJ配置,使用主机可访问的地址

把ClusterJ配置中的host从127.0.0.1:1186改成你的主机对外IP(比如日志里显示的10.0.2.2,或者你主机的局域网IP):

com.mysql.clusterj.connect:
  host: <你的主机IP>:1186
  database: my_db

4. 重启集群并验证

停止所有容器后重新启动:

docker-compose down
docker-compose up -d

然后进入管理节点查看集群状态:

docker exec -it $(docker ps -q -f name=database-manager) ndb_mgm

在控制台输入show,确认所有节点(包括API节点)都处于connected状态。


额外排查点

  • 确保主机防火墙没有阻止1186、2202、2203端口的流量
  • 检查ClusterJ依赖的版本是否和Docker镜像中的MySQL Cluster版本完全匹配

内容的提问来源于stack exchange,提问作者R. Antunes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:58:53