EMQX 集群搭建指南

...

Posted by 呆贝斯 on September 16, 2021

1. 准备

1.1 硬件要求:

  • 3台服务器,每台服务器至少 4 核 CPU,8GB 内存,100GB 硬盘空间。
  • 3台服务器拥有外网IP,网卡配置为静态 IP,服务器之间互通。

1.2 软件要求:

  • Docker 24.04版本及以上

2. 集群搭建

2.1 使用 Docker Swarm 创建和管理网络通信

搭建 EMQX 集群(v5.6.1),首先,选择一台服务器作为管理节点初始化 Swarm 集群,其他服务器作为工作节点加入 Swarm 集群, 其次,管理节点创建 Overlay 网络,以确保各个节点容器之间可以相互通信。

  1. 初始化 Swarm 集群

    运行此命令前,请确保管理节点已安装 Docker 且已启动,替换为管理节点的 IP 地址。

     # 管理节点
     docker swarm init --advertise-addr <MANAGER-IP>
    

    执行结果如下,代表集群初始化成功。

     Swarm initialized: current node (vnxkqcu6k****4fqwor3o8f16) is now a manager.
        
     To add a worker to this swarm, run the following command:
        
         docker swarm join --token SWMTKN-1-4idcf6cbizcpmyg5nu****e1em0hytl1spldbkgv2gegg5kord-11w37gbq9bdksj7yxjpt8zzqg <MANAGER-IP>:2377
        
     To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    
  2. 获取加入令牌

    # 管理节点
     docker swarm join-token worker
    

    输出结果如下,代表成功获取加入令牌。

     To add a worker to this swarm, run the following command:
    
     docker swarm join --token SWMTKN-1-4idcf6cbizcpmyg5nu****e1em0hytl1spldbkgv2gegg5kord-11w37gbq9bdksj7yxjpt8zzqg 172.18.18.110:2377
    
  3. 增加工作节点

    运行此命令前,请确保工作节点已安装 Docker 且已启动。在每台工作节点上运行以下命令,将节点加入 Swarm 集群,

    替换为上步操作获取到的加入令牌,替换为管理节点的 IP 地址。 ```shell # 工作节点1 docker swarm join --token :2377 ``` ```shell # 工作节点2 docker swarm join --token :2377 ``` 输出结果如下,代表成功加入 Swarm 集群。 ```text This node joined a swarm as a worker. ```
  4. 查看集群状态

    经过以上操作,我们已经拥有了一个 Swarm 集群,包含一个管理节点和两个工作节点。

     # 管理节点
     docker node ls
    

    输出结果如下,代表集群正常创建。

     ID                            HOSTNAME                    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
     ocbtqtblqg0x6d****4mr15a2     gateway                     Ready     Active                          26.1.3
     vnxkqcu6kf2104****r3o8f16 *   schinper                    Ready     Active         Leader           26.1.3
     zca0hm9jcgenj5****umd8c2s     training03                  Ready     Active                          26.1.3
    
  5. 创建 Overlay 网络

    运行以下命令在管理节点上创建 overlay 网络,替换为自定义网络名称。

     # 管理节点
     docker network create --driver overlay --attachable <pub_emqx-net>
    

    输出结果如下,代表成功创建 overlay 网络。

     w7e475k2m****po21nkc1idan
    

2.2 启动 EMQX 节点容器

在每台机器上启动 EMQX 容器,并指定容器的主机名。 修改节点名称(EMQX_NODE_NAME)和集群节点通信 Cookie(EMQX_NODE_COOKIE)以确保唯一性和安全性。 确保每个节点的端口映射不冲突,并且端口是可用的。

注意事项:

  • 确保每个节点的主机名是唯一的。
  • 确保每个节点的容器在同一个 Docker 网络中。
  • 如果有防火墙,确保节点间的通信端口是开放的。
  • 建议将节点间的时间进行同步,以避免时间差导致的问题。
  1. EMQX 容器1:核心节点

    在管理节点命令行工具中输入如下命令,替换为自定义网络名称,下载并运行最新版 EMQX。

     # 管理节点
     docker run -d --restart=always --name emqx1 \
         --hostname e1.emqx.io \
         -e TZ=Asia/Shanghai \
         -e EMQX_NODE_NAME=emqx@e1.emqx.io \
         -e EMQX_NODE_COOKIE=emqxsecretschinper \
         --network <pub_emqx-net> \
         --network-alias e1.emqx.io \
         -v /opt/emqx/data:/opt/emqx/data \
         -v /opt/emqx/log:/opt/emqx/log \
         -p 1883:1883 \
         -p 8083:8083 \
         -p 4369:4369 \
         -p 8084:8084 \
         -p 8883:8883 \
         -p 18083:18083 \
         -e EMQX_NODE__PROCESS_LIMIT=2097152 \
         -e EMQX_NODE__MAX_PORTS=1048576 \
         -e EMQX_ERLANG__ASYNC_THREADS=1280 \
         -e EMQX_ERLANG__SMP=auto \
         -e EMQX_LISTENER__TCP__EXTERNAL__ACCEPTORS=1024 \
         -e EMQX_LISTENER__TCP__EXTERNAL__MAX_CONNECTIONS=1024000 \
         -e EMQX_LISTENER__WS__EXTERNAL__ACCEPTORS=1024 \
         -e EMQX_LISTENER__WS__EXTERNAL__MAX_CONNECTIONS=1024000 \
         -e EMQX_LISTENER__WS__EXTERNAL__BUFFER=1310720 \
         -e EMQX_LISTENER__WS__EXTERNAL__RECBUF=1310720 \
         -e EMQX_LISTENER__WS__EXTERNAL__SNDBUF=1310720 \
         -e EMQX_MQTT__MAX_PACKET_SIZE=20MB \
         emqx:5.6.1
    

    设置权限

     # 管理节点
     chmod -R 777 /opt/emqx/*
    
  2. EMQX 容器2:核心节点

    在工作节点1命令行工具中输入如下命令,替换为自定义网络名称,下载并运行最新版 EMQX。

     # 工作节点1
     docker run -d --restart=always --name emqx2 \
         --hostname e2.emqx.io \
         -e TZ=Asia/Shanghai \
         -e EMQX_NODE_NAME=emqx@e2.emqx.io \
         -e EMQX_NODE_COOKIE=emqxsecretschinper \
         --network <pub_emqx-net> \
         --network-alias e2.emqx.io \
         -v /opt/emqx/data:/opt/emqx/data \
         -v /opt/emqx/log:/opt/emqx/log \
         -p 1883:1883 \
         -p 8083:8083 \
         -p 4369:4369 \
         -p 8084:8084 \
         -p 8883:8883 \
         -p 18083:18083 \
         -e EMQX_NODE__PROCESS_LIMIT=2097152 \
         -e EMQX_NODE__MAX_PORTS=1048576 \
         -e EMQX_ERLANG__ASYNC_THREADS=1280 \
         -e EMQX_ERLANG__SMP=auto \
         -e EMQX_LISTENER__TCP__EXTERNAL__ACCEPTORS=1024 \
         -e EMQX_LISTENER__TCP__EXTERNAL__MAX_CONNECTIONS=1024000 \
         -e EMQX_LISTENER__WS__EXTERNAL__ACCEPTORS=1024 \
         -e EMQX_LISTENER__WS__EXTERNAL__MAX_CONNECTIONS=1024000 \
         -e EMQX_LISTENER__WS__EXTERNAL__BUFFER=1310720 \
         -e EMQX_LISTENER__WS__EXTERNAL__RECBUF=1310720 \
         -e EMQX_LISTENER__WS__EXTERNAL__SNDBUF=1310720 \
         -e EMQX_MQTT__MAX_PACKET_SIZE=20MB \
         emqx:5.6.1
    

    设置权限

     # 管理节点
     chmod -R 777 /opt/emqx/*
    
  3. EMQX 容器3:核心节点

    在工作节点2命令行工具中输入如下命令,替换为自定义网络名称,下载并运行最新版 EMQX。

     # 工作节点2
     docker run -d --restart=always --name emqx3 \
         --hostname e3.emqx.io \
         -e TZ=Asia/Shanghai \
         -e EMQX_NODE_NAME=emqx@e3.emqx.io \
         -e EMQX_NODE_COOKIE=emqxsecretschinper \
         --network <pub_emqx-net> \
         --network-alias e3.emqx.io \
         -v /opt/emqx/data:/opt/emqx/data \
         -v /opt/emqx/log:/opt/emqx/log \
         -p 1883:1883 \
         -p 8083:8083 \
         -p 4369:4369 \
         -p 8084:8084 \
         -p 8883:8883 \
         -p 18083:18083 \
         -e EMQX_NODE__PROCESS_LIMIT=2097152 \
         -e EMQX_NODE__MAX_PORTS=1048576 \
         -e EMQX_ERLANG__ASYNC_THREADS=1280 \
         -e EMQX_ERLANG__SMP=auto \
         -e EMQX_LISTENER__TCP__EXTERNAL__ACCEPTORS=1024 \
         -e EMQX_LISTENER__TCP__EXTERNAL__MAX_CONNECTIONS=1024000 \
         -e EMQX_LISTENER__WS__EXTERNAL__ACCEPTORS=1024 \
         -e EMQX_LISTENER__WS__EXTERNAL__MAX_CONNECTIONS=1024000 \
         -e EMQX_LISTENER__WS__EXTERNAL__BUFFER=1310720 \
         -e EMQX_LISTENER__WS__EXTERNAL__RECBUF=1310720 \
         -e EMQX_LISTENER__WS__EXTERNAL__SNDBUF=1310720 \
         -e EMQX_MQTT__MAX_PACKET_SIZE=20MB \
         emqx:5.6.1
    

    设置权限

     # 管理节点
     chmod -R 777 /opt/emqx/*
    
  4. 将节点加入集群

    在管理节点命令行工具中输入如下命令,将工作节点加入 EMQX 集群。

     # 管理节点
     docker exec -it emqx2 emqx_ctl cluster join emqx@e1.emqx.io
     docker exec -it emqx3 emqx_ctl cluster join emqx@e1.emqx.io
    

3.验证

在管理节点上执行查询命令,验证集群状态。

docker exec -it emqx1 /opt/emqx/bin/emqx_ctl cluster status

输出结果如下,代表集群状态正常。

Cluster status: #{running_nodes =>
                      ['emqx@e1.emqx.io','emqx@e2.emqx.io','emqx@e3.emqx.io'],
                  stopped_nodes => []}
  • Web界面查看:http://:18083
    • 默认账户:admin public,请及时登录并修改密码

Reference

  • 官方文档:https://www.emqx.io/docs/zh/v5.6/
    • 性能测试(emqtt_bench):https://www.emqx.io/docs/zh/v5.6/performance/benchmark-emqtt-bench.html
    • 集群构建:https://www.emqx.io/docs/zh/v5.6/deploy/cluster/introduction.html
    • 配置文件:https://www.emqx.io/docs/zh/v5.6/configuration/configuration.html
      • EMQX 主配置文件为 emqx.conf,根据安装方式其所在位置有所不同:
      • DEB 或 RPM 包安装:/etc/emqx/emqx.conf
      • Docker 容器: /opt/emqx/etc/emqx.conf
      • 解压缩包安装: ./etc/emqx.conf
    • 性能调优:https://www.emqx.io/docs/zh/v5.6/performance/overview.html
    • 系统调优:https://www.emqx.io/docs/zh/v5.6/performance/tune.html
    • 使用限制:https://www.emqx.io/docs/zh/v5.6/getting-started/restrictions.html
    • 常见问题解答:https://www.emqx.io/docs/zh/v5.6/faq/faq.html
    • EMQX 配置手册:https://www.emqx.io/docs/zh/v5.6.1/hocon/