docker bifromq:3.0.2版本集群搭建,集群模式不可用!
xiaonannet opened this issue · 11 comments
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.
HOST
- CPU: 2C4G
- Memory: [e.g. 32G]
OS(please complete the following information):
- OS: Rocky Linux 9.3 Docker
JVM:
- Version: [e.g. 17]
- Arguments: [e.g. if override any JVM arguments]
BifroMQ
- Version: bifromq-3.0.2
BifroMQ集群间通信会用到以下host:port
:
clusterConfig
host
port
rpcServerConfig
host
port
baseKVServerConfig
host
port
通过docker搭建集群,你需要保证container内这几个host:port
组合能正常通讯。
'b1','b2','b3'这几个地址在容器内和容器外分别解析到什么地址?,你用工具验证过容器内可以互向访问?
容器内解析的是公网ip地址。容器内互相访问是指什么
'b1','b2','b3'这几个地址在容器内和容器外分别解析到什么地址?,你用工具验证过容器内可以互向访问?
全部在公网阿里云ECS环境下测试,'b1','b2','b3'映射的三个服务器公网IP,容器内解析的ip地址可以相互互通,所涉及端口均已放行,网络模式:host network、bridge 都尝试了不行,后尝试了腾讯ECS一样的结果:3个节点都输出 构建集群成功日志,只有引导节点可连接。
你试下把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
<NODE1_IP><NODE2_IP><NODE3_IP>是指定哪个ip
<NODE1_IP><NODE2_IP><NODE3_IP>是指定哪个ip
就是你三个容器内部'b1','b2','b3'这几个hostname实际解析到的ip地址
经过几天多次的尝试,换了多个云服务及系统,集群终于调通了,和网络有很大的关系。最终非常感谢大佬的支持!
可行的方案:
- docker network 调整为了host模式(bridge模式不行,尝试了多次)
- clusterConfig -》host和seedEndpoints 中涉及的ip必须都是配置内网ip(公网ip不行,安全组都已放行)
尝试过程中存在的疑问:
- 集群间都使用公网,所有节点都配置bootstrap: true ,所有节点均可连接并输出集群构建成功,这种的就是纯单机模式了。
- 必须都需要配置内网ip,应该是代码层面对网络组件适配问题,官方可以验证下。
最后非常感谢官方各位大佬的支持!
经过几天多次的尝试,换了多个云服务及系统,集群终于调通了,和网络有很大的关系。最终非常感谢大佬的支持! 可行的方案:
- 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)。我们做了些这方面的优化(01e9978, a1d918c),不确定你碰到的问题是不是跟这个有关,你可以本地编译main branch上最新的代码,试下是否有改善?