在不同机器上集群 vernemq docker 个容器 运行
Clustering vernemq docker containers running on different machines
我希望这会很简单,只需在第二个实例的 docker-compose.yml
文件中使用以下代码片段
- DOCKER_VERNEMQ_DISCOVERY_NODE=<ip address of the first instance>
但这似乎不起作用。
第二个实例的日志确认它正在尝试集群:
13:56:09.795 [info] Sent join request to: 'VerneMQ@<ip address of the first instance>'
13:56:16.800 [info] Unable to connect to 'VerneMQ@<ip address of the first instance>'
而第一个实例的日志根本没有显示任何内容。
在第二个实例中,我可以确认端点是可访问的:
$ docker exec -it vernemq /bin/sh
$ curl <ip address of the first instance>:44053
curl: (56) Recv failure: Connection reset by peer
然后在第一个实例的日志中,我看到一个错误,这完全是预料之中的,并确认我已经到达第一个实例
13:58:33.572 [error] CRASH REPORT Process <0.3050.0> with 0 neighbours crashed with reason: bad argument in vmq_cluster_com:process_bytes/3 line 142
13:58:33.572 [error] Ranch listener {{172,19,0,2},44053} terminated with reason: bad argument in vmq_cluster_com:process_bytes/3 line 142
这可能与以下事实有关:从 docker 容器内部看到的 IP 地址是 172.19.0.2
,而从外部看到的是 10. ...
。
还尝试将第一个实例的主机名添加到 known_hosts
,但没有成功。
请指教
我正在使用 erlio/docker-vernemq:1.10.0
$ docker --version
Docker version 19.03.13, build 4484c46d9d
$ docker-compose --version
docker-compose version 1.27.2, build 18f557f9
我设法通过创建 docker overlay network
来排序
在机器 1 上:docker swarm init
在机器 2 上:docker swarm join --token ...
在机器 1 上:docker network create --driver=overlay --attachable vernemq-overlay-net
我的 docker 文件的相关位是:
version: '3.6'
services:
vernemq:
container_name: ${NODE_NAME:?Node name not specified}
image: vernemq/vernemq:1.10.4.1
environment:
- DOCKER_VERNEMQ_NODENAME=${NODE_NAME:?Node name not specified}
- DOCKER_VERNEMQ_DISCOVERY_NODE=${DISCOVERY_NODE:-}
networks:
default:
external:
name: vernemq-overlay-net
使用以下环境变量:
机器 1:
- NODE_NAME=vernemq1.example.com
- DISCOVERY_NODE=
机器 2:
- NODE_NAME=vernemq2.example.com
- DISCOVERY_NODE=vernemq1.example.com
注:
据我所知,由于 docker-compose 中的错误,machine2 可能找不到 vernemq-overlay-net
。
在这种情况下,您可以使用 docker: docker run -dit --name alpine --net=vernemq-overlay-net alpine
启动一个容器,这将使它可用于 docker-compose.
我希望这会很简单,只需在第二个实例的 docker-compose.yml
文件中使用以下代码片段
- DOCKER_VERNEMQ_DISCOVERY_NODE=<ip address of the first instance>
但这似乎不起作用。
第二个实例的日志确认它正在尝试集群:
13:56:09.795 [info] Sent join request to: 'VerneMQ@<ip address of the first instance>'
13:56:16.800 [info] Unable to connect to 'VerneMQ@<ip address of the first instance>'
而第一个实例的日志根本没有显示任何内容。
在第二个实例中,我可以确认端点是可访问的:
$ docker exec -it vernemq /bin/sh
$ curl <ip address of the first instance>:44053
curl: (56) Recv failure: Connection reset by peer
然后在第一个实例的日志中,我看到一个错误,这完全是预料之中的,并确认我已经到达第一个实例
13:58:33.572 [error] CRASH REPORT Process <0.3050.0> with 0 neighbours crashed with reason: bad argument in vmq_cluster_com:process_bytes/3 line 142
13:58:33.572 [error] Ranch listener {{172,19,0,2},44053} terminated with reason: bad argument in vmq_cluster_com:process_bytes/3 line 142
这可能与以下事实有关:从 docker 容器内部看到的 IP 地址是 172.19.0.2
,而从外部看到的是 10. ...
。
还尝试将第一个实例的主机名添加到 known_hosts
,但没有成功。
请指教
我正在使用 erlio/docker-vernemq:1.10.0
$ docker --version
Docker version 19.03.13, build 4484c46d9d
$ docker-compose --version
docker-compose version 1.27.2, build 18f557f9
我设法通过创建 docker overlay network
来排序在机器 1 上:docker swarm init
在机器 2 上:docker swarm join --token ...
在机器 1 上:docker network create --driver=overlay --attachable vernemq-overlay-net
我的 docker 文件的相关位是:
version: '3.6'
services:
vernemq:
container_name: ${NODE_NAME:?Node name not specified}
image: vernemq/vernemq:1.10.4.1
environment:
- DOCKER_VERNEMQ_NODENAME=${NODE_NAME:?Node name not specified}
- DOCKER_VERNEMQ_DISCOVERY_NODE=${DISCOVERY_NODE:-}
networks:
default:
external:
name: vernemq-overlay-net
使用以下环境变量:
机器 1:
- NODE_NAME=vernemq1.example.com
- DISCOVERY_NODE=
机器 2:
- NODE_NAME=vernemq2.example.com
- DISCOVERY_NODE=vernemq1.example.com
注:
据我所知,由于 docker-compose 中的错误,machine2 可能找不到 vernemq-overlay-net
。
在这种情况下,您可以使用 docker: docker run -dit --name alpine --net=vernemq-overlay-net alpine
启动一个容器,这将使它可用于 docker-compose.