【问题标题】:ClusterJ cannot connect to dockerized Mysql cluster from outside the containerClusterJ 无法从容器外部连接到 dockerized Mysql 集群
【发布时间】:2018-10-20 17:08:51
【问题描述】:

我已经使用 docker hub 上的 mysql/mysql-cluster 映像在我的 PC 上设置了 MySQL 集群,并且它启动良好。但是,当我尝试使用 clusterJ 从外部 docker(通过主机)连接到集群时,它没有连接。

最初我收到以下错误:Could not alloc node id at 127.0.0.1 port 1186: No free node id found for mysqld(API)

所以我创建了一个自定义的 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 manager 日志的摘录:

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

任何解决此问题的帮助将不胜感激。

【问题讨论】:

  • 你必须在宿主机上发布服务器端口,尝试运行带有-p 1186:1186参数的管理节点
  • 我已经使用 docker-compose ports 属性发布了管理器端口。
  • 如果您的帖子还有 docker compose yml 以及与您的问题相关的任何其他文件,会更清楚
  • 你真的能把 127.0.0.1 和 192.168.0.2 混在一起吗?不确定此处进行的所有 IP 地址转换。在日志中注意到 MGM 服务器认为连接来自 10.0.0.2。

标签: docker mysql-cluster


【解决方案1】:

这里是 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 转换表。

【讨论】:

    猜你喜欢
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2016-09-10
    • 2015-12-31
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    相关资源
    最近更新 更多