bifromqio / bifromq

A Multi-Tenancy MQTT broker adopting Serverless architecture
https://bifromq.io
Apache License 2.0
614 stars 61 forks source link

docker bifromq:3.0.2版本集群搭建,集群模式不可用! #85

Closed xiaonannet closed 3 months ago

xiaonannet commented 4 months ago

Describe the bug

问题:构建成功后的集群,主节点可以连接,从节点不可连接。

三个节点均打印了构建集群成功的日志 `2024-05-09 12:15:40.685 INFO [ForkJoinPool.commonPool-worker-1] --- c.b.bifromq.starter.StandaloneStarter [StandaloneStarter.java:217] AgentHost joined seedEndpoint: b1:18899,b2:18899,b3:18899 2024-05-09 12:16:26.250 INFO [main] --- c.b.bifromq.starter.StandaloneStarter [StandaloneStarter.java:557] Standalone broker started

`

Expected behavior A clear and concise description of what you expected to happen.

Logs 三个节点日志 image image

image image

image image

HOST

OS(please complete the following information):

JVM:

BifroMQ

popduke commented 4 months ago

BifroMQ集群间通信会用到以下host:port

clusterConfig
  host
  port
rpcServerConfig
  host
  port
baseKVServerConfig
  host
  port

通过docker搭建集群,你需要保证container内这几个host:port组合能正常通讯。

wei-yk commented 4 months ago

image 以指定端口,并映射。还是只有引导节点可以连接。

popduke commented 4 months ago

'b1','b2','b3'这几个地址在容器内和容器外分别解析到什么地址?,你用工具验证过容器内可以互向访问?

wei-yk commented 4 months ago

容器内解析的是公网ip地址。容器内互相访问是指什么

xiaonannet commented 4 months ago

'b1','b2','b3'这几个地址在容器内和容器外分别解析到什么地址?,你用工具验证过容器内可以互向访问?

全部在公网阿里云ECS环境下测试,'b1','b2','b3'映射的三个服务器公网IP,容器内解析的ip地址可以相互互通,所涉及端口均已放行,网络模式:host network、bridge 都尝试了不行,后尝试了腾讯ECS一样的结果:3个节点都输出 构建集群成功日志,只有引导节点可连接。

popduke commented 4 months ago

你试下把host直接指定成ip的方式? 我在单个host上用user-defined bridge network构建3节点集群没什么问题,都能连上:

Docker cmd

docker network create bifromq_dev
docker run -d -m 2G -e MEM_LIMIT='2147483648' --name bifromq_node1 --network bifromq_dev -p 1883:1883 -v ./node1_config.yml:/usr/share/bifromq/conf/standalone.yml bifromq/bifromq:latest
docker run -d -m 2G -e MEM_LIMIT='2147483648' --name bifromq_node2 --network bifromq_dev -p 2883:1883 -v ./node2_config.yml:/usr/share/bifromq/conf/standalone.yml bifromq/bifromq:latest
docker run -d -m 2G -e MEM_LIMIT='2147483648' --name bifromq_node3 --network bifromq_dev -p 3883:1883 -v ./node3_config.yml:/usr/share/bifromq/conf/standalone.yml bifromq/bifromq:latest

node1_config

bootstrap: true
clusterConfig:
  host: <NODE1_IP>
  port: 8899
  seedEndpoints: NODE1_IP:8899,NODE2_IP:8899,NODE3_IP:8899

node2_config

bootstrap: false
clusterConfig:
  host: <NODE2_IP>
  port: 8899
  seedEndpoints: NODE1_IP:8899,NODE2_IP:8899,NODE3_IP:8899

node3_config

bootstrap: false
clusterConfig:
  host: <NODE3_IP>
  port: 8899
  seedEndpoints: NODE1_IP:8899,NODE2_IP:8899,NODE3_IP:8899
wei-yk commented 3 months ago
是指定哪个ip
popduke commented 3 months ago
是指定哪个ip

就是你三个容器内部'b1','b2','b3'这几个hostname实际解析到的ip地址

xiaonannet commented 3 months ago

经过几天多次的尝试,换了多个云服务及系统,集群终于调通了,和网络有很大的关系。最终非常感谢大佬的支持! 可行的方案

尝试过程中存在的疑问:

最后非常感谢官方各位大佬的支持!

popduke commented 3 months ago

经过几天多次的尝试,换了多个云服务及系统,集群终于调通了,和网络有很大的关系。最终非常感谢大佬的支持! 可行的方案

  • docker network 调整为了host模式(bridge模式不行,尝试了多次)
  • clusterConfig -》host和seedEndpoints 中涉及的ip必须都是配置内网ip(公网ip不行,安全组都已放行)

尝试过程中存在的疑问:

  • 集群间都使用公网,所有节点都配置bootstrap: true ,所有节点均可连接并输出集群构建成功,这种的就是纯单机模式了。
  • 必须都需要配置内网ip,应该是代码层面对网络组件适配问题,官方可以验证下。

最后非常感谢官方各位大佬的支持!

docker bridge network应该做不到部署在不同host的container间的通讯,跨host的container通讯需要搭配overlay network。配置中用container IP作为host,构建cluster的时候跳过了做地址解析的步骤(从b1 -> IP)。我们做了些这方面的优化(01e99789fa5f66525121bddd142f650fe5011e5d, a1d918c657b90e478ea913fea7a4c0b6b7e74b19),不确定你碰到的问题是不是跟这个有关,你可以本地编译main branch上最新的代码,试下是否有改善?

popduke commented 3 months ago

v3.1.0 包含集群构建过程的优化,欢迎试用,有问题再开issue