Docker ClusterJ无法从容器外部连接到停靠的Mysql群集

Docker ClusterJ无法从容器外部连接到停靠的Mysql群集,docker,mysql-cluster,Docker,Mysql Cluster,我已经使用docker hub上的MySQL/MySQL集群映像在我的PC上安装了MySQL集群,它启动得很好。但是,当我尝试使用clusterJ从外部docker(通过主机)连接到集群时,它不会连接 最初,我遇到以下错误:无法在127.0.0.1端口1186分配节点id:未找到mysqld(API)的可用节点id 因此,我创建了一个定制的mysql-cluster.cnf,它与docker映像中的一个非常相似,但有一个新的api端点: [ndbd default] NoOfReplicas=2

我已经使用docker hub上的MySQL/MySQL集群映像在我的PC上安装了MySQL集群,它启动得很好。但是,当我尝试使用clusterJ从外部docker(通过主机)连接到集群时,它不会连接

最初,我遇到以下错误:无法在127.0.0.1端口1186分配节点id:未找到mysqld(API)的可用节点id

因此,我创建了一个定制的mysql-cluster.cnf,它与docker映像中的一个非常相似,但有一个新的api端点:

[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]
这是用于clusterJ设置的配置:

com.mysql.clusterj.connect:
    host: 127.0.0.1:1186
    database: my_db
以下是docker compose配置:

version: '3'

services:
    #Sets up the MySQL cluster ndb_mgmd process
    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

#  Sets up the first MySQL cluster data node
database-node-1:
    image: mysql/mysql-cluster
    networks:
        database_net:
            ipv4_address: 192.168.0.3
    command: ndbd
    depends_on:
        - database-manager

#  Sets up the second MySQL cluster data node
database-node-2:
    image: mysql/mysql-cluster
    networks:
        database_net:
            ipv4_address: 192.168.0.4
    command: ndbd
    depends_on:
        - database-manager

#Sets up the first MySQL server process
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
当我尝试连接到集群时,我得到以下错误:“127.0.0.1:1186”nodeId 0;返回代码:-1错误代码:0消息:

我可以看到运行ClusterJ的应用程序已注册到集群,但随后它断开了连接。以下是docker mysql管理器日志的摘录:

database-manager_1  | 2018-05-10 11:18:43 [MgmtSrvr] INFO     -- Node 3: Communication to Node 4 opened
database-manager_1  | 2018-05-10 11:22:16 [MgmtSrvr] INFO     -- Alloc node id 6 succeeded
database-manager_1  | 2018-05-10 11:22:16 [MgmtSrvr] INFO     -- Nodeid 6 allocated for API at 10.0.2.2

如果您能帮助解决此问题,我们将不胜感激。

以下是ndb_mgmd如何处理启动ClusterJ应用程序的请求。 您连接到端口1186上的MGM服务器。在这方面,你 将获取配置。此配置包含IP地址 数据节点的类型。要连接到数据节点,ClusterJ将尝试 连接到192.168.0.3和192.168.0.4。因为ClusterJ在Docker外面, 我猜这些地址指向不同的地方

管理服务器还将提供一个动态端口,以便在需要时使用 正在连接到NDB数据节点。管理这一点要容易得多 通过为NDB数据节点设置ServerPort。我通常使用11860作为 ServerPort,2202也很常用

我不知道如何将Docker环境与外部环境混合 环境我认为通过设置
在正确的位置创建正确的IP转换表。

您必须在主机上发布服务器端口,尝试使用
-p 1186:1186
参数运行管理节点。我已使用docker compose ports属性发布了manager端口。如果您的帖子还包含docker compose yml以及与您的问题相关的任何其他文件,则会更加清楚。您可以真正将127.0.0.1与192.168.0.2混合使用。不确定所有的IP地址转换都在这里进行。在日志中注意到,MGM服务器认为连接来自10.0.0.2。