ClusterJ无法从容器外部连接Docker部署的MySQL集群
解决Docker搭建的MySQL Cluster外部ClusterJ连接失败问题
让我们一步步拆解你的问题并找到解决方案:
问题根源分析
从你的日志可以看到,管理节点已经成功给你的ClusterJ客户端分配了NodeID 6,但随即断开连接。核心原因有两个:
- 网络可达性问题:Docker自定义网段(192.168.0.0/16)的IP对于主机来说是不可直接访问的,当管理节点把数据节点的地址(192.168.0.3/4)返回给ClusterJ客户端后,主机无法连接到这些内网地址。
- 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
相关产品推荐
相关产品推荐

