在多主机上创建 Hazelcast 集群的简单方法 Docker

Simple way to create Hazelcast cluster on Multi-hosts Docker

我使用 Docker 的时间很短,所以我对 docker 网络不是很清楚。目前我正在尝试将系统转换为使用 docker 进行部署。系统包含多个Java应用服务器:API服务器、聊天服务器、WebWorkbench、插件服务器...

我已经为每个服务器创建了 docker-compose 文件和其他 Docker 文件。这是docker-compose.yml

的一部分
version: '3.7'

services:
  apiserver:
    build:
      context: ./apiserver
      dockerfile: APIServerDockerfile
  image: apiserver
  container_name: apiserver
  ports:
    - "8000:8000"
  tty: true
  depends_on:
    - mariadb
  networks:
    - chat_net

chatserver:
  build:
    context: ./chatserver
    dockerfile: ChatserverDockerfile
  image: chatserver
  container_name: chatserver
  ports:
    - "8088:8088"
  tty: true
  depends_on:
    - mariadb
  networks:
    - chat_net

mariadb:
  image: mariadb/server:10.3
  environment:
  MYSQL_ROOT_PASSWORD: abc12345
  ports:
    - "3306:3306"
  networks:
    - chat_net
  restart: always
  container_name: mariadb10.3
  volumes:
    - ./mariadb:/var/lib/mysql

networks:
  chat_net:
  external: true

chat_net默认是桥接网络。系统需要分布式,即apiserver和chatserver等可以安装在不同的物理服务器上。 Apiserver 和 chatserver 共享 hazelcast 集群进行通信。通常每个服务器都有一个 hazelcast.xml,其中包含如下信息:

<group>
  <name>CHAT_NET_OVERALL_V2</name>
  <password>abc123!@#</password>
</group>

<network>
   <port auto-increment="true" port-count="100">8701</port>
   <join>
     <multicast enabled="false"></multicast>
     <tcp-ip enabled="true">
          <member>127.0.0.1</member>
          <member>15.23.24.56</member>
     </tcp-ip>
   </join>
</network>

Hazelcast 集群使用 ICP/IP 与服务器地址连接。现在使用 docker hazelcast 集群,而不是使用桥接网络创建的。如果我使用network_mode:host,它们可以形成集群,但我们的案例需要多主机,所以这不是解决方案。以我的理解,我需要一个覆盖网络。我试图做的是创建一个覆盖网络,但即使我在覆盖网络中添加服务器的 IP,也无法创建 hazelcast 集群,每个服务器都启动其独立的 hazelcast。

所以有人能告诉我在多主机环境中创建 hazelcast 集群的最简单方法是什么吗?我知道还有其他一些服务,例如 Swarm、Kubernetes 或 Weavenet,但不确定哪一个最适合我的情况。非常感谢。

主题在以下文章中有解释:Configuring Hazelcast in Non-Orchestrated Docker Environments

基本上,如果没有第三方工具,您有两个选择:

  • 要么在Docker
  • 中使用网络模式host
  • 或将 Docker 端口映射 (-p 5701:5701) 与在 Hazelcast 配置 (-Dhazelcast.local.publicAddress=$DOCKER_HOST_IP:$DOCKER_HOST_PORT)
  • 中定义 public(外部)地址相结合