生产部署

在开发时我们通常使用压缩包方式以单节点的形式启动服务,生产运行需要一个更加简单稳定的方式。本页主要从部署架构最佳实践讲解如何部署你的 EMQX 服务。

提示

如果 EMQX 集群部署在 HAProxy 或 Nginx 后,且需要拿到客户端真实的源 IP 地址与端口,则需打开 Proxy Protocol 配置,配置项:EMQX 监听器 proxy_protocol

Proxy Protcol 参考: https://www.haproxy.com/blog/haproxy/proxy-protocol生产部署 - 图1 (opens new window)

Nginx 使用 Proxy Prorcol 参考: https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/生产部署 - 图2 (opens new window)

部署架构

EMQX 集群可作为物联网接入服务(IoT Hub)部署,目前 EMQ 在青云、阿里云、AWS 等云服务提供商上均提供开箱即用的免费软件镜像,对于特殊硬件平台和系统版本如树莓派、Linux ARM,可使用源码编译安装。

典型部署架构:

生产部署 - 图3

LB (负载均衡)

LB (负载均衡器) 负责分发设备的 MQTT 连接与消息到 EMQX 集群,LB 提高 EMQX 集群可用性、实现负载平衡以及动态扩容。

部署架构推荐在 LB 终结 SSL 连接。设备与 LB 之间 TLS 安全连接,LB 与 EMQX 之间普通 TCP 连接。这种部署模式下 EMQX 单集群可轻松支持 100 万设备。

公有云厂商 LB 产品:

云计算厂商是否支持 TLS 终结LB 产品介绍
青云生产部署 - 图4 (opens new window)https://docs.qingcloud.com/product/network/loadbalancer/生产部署 - 图5 (opens new window)
AWS生产部署 - 图6 (opens new window)https://aws.amazon.com/cn/elasticloadbalancing/生产部署 - 图7 (opens new window)
阿里云生产部署 - 图8 (opens new window)https://www.aliyun.com/product/slb生产部署 - 图9 (opens new window)
UCloud生产部署 - 图10 (opens new window)未知https://ucloud.cn/site/product/ulb.html生产部署 - 图11 (opens new window)
QCloud生产部署 - 图12 (opens new window)未知https://www.qcloud.com/product/clb生产部署 - 图13 (opens new window)

私有部署 LB 服务器:

开源 LB是否支持 TLS 终结方案介绍
HAProxy生产部署 - 图14 (opens new window)https://www.haproxy.com/solutions/load-balancing.html生产部署 - 图15 (opens new window)
NGINX生产部署 - 图16 (opens new window)https://www.nginx.com/solutions/load-balancing/生产部署 - 图17 (opens new window)

提示

国内公有云部署推荐青云 (EMQX 合作伙伴),国外部署推荐 AWS ,私有部署推荐使用 HAProxy 作为 LB。

EMQX 集群

EMQX 节点集群部署在 LB 之后,建议部署在 VPC 或私有网络内。公有云厂商青云、AWS、UCloud、QCloud 均支持 VPC 网络。

EMQX 默认开启的 MQTT 服务 TCP 端口:

端口说明
1883MQTT 协议端口
8883MQTT/SSL 端口
8083MQTT/WebSocket 端口
8084MQTT/WebSocket/SSL 端口
8081管理 API 端口
18083Dashboard 端口

防火墙根据使用的 MQTT 接入方式,开启上述端口的访问权限。

EMQX 节点集群使用的 TCP 端口:

端口说明
4369集群节点发现端口 (EPMD 模式)
4370集群节点发现端口
5370集群节点 PRC 通道

集群节点间如有防护墙,需开启上述 TCP 端口互访权限。

青云 (QingCloud) 部署

  1. 创建 VPC 网络。

  2. VPC 网络内创建 EMQX 集群 ‘ 私有网络 ‘,例如: 192.168.0.0/24

  3. 私有网络内创建两台 EMQX 主机,例如:

节点IP 地址
emqx1192.168.0.2
emqx2192.168.0.3
  1. 安装并集群 EMQX 主机,具体配置请参考安装集群章节。

  2. 创建 LB (负载均衡器) 并指定公网 IP 地址。

  3. 在 LB 上创建 MQTT TCP 监听器:

image

或创建 SSL 监听器,并终结 SSL 在 LB :

image

  1. MQTT 客户端连接 LB 公网地址测试。

亚马逊 (AWS) 部署

  1. 创建 VPC 网络。

  2. VPC 网络内创建 EMQX 集群 ‘ 私有网络 ‘,例如: 192.168.0.0/24

  3. 私有网络内创建两台 EMQX 主机,指定上面创建的 VPC 网络,例如:

节点IP 地址
emqx1192.168.0.2
emqx2192.168.0.3
  1. 在安全组中,开放 MQTT 服务的 TCP 端口,比如 1883, 8883。

  2. 安装并集群 EMQX 主机,具体配置请参考安装集群章节。

  3. 创建 ELB (Classic 负载均衡器),指定 VPC 网络,并指定公网 IP 地址。

  4. 在 ELB 上创建 MQTT TCP 监听器:

image

或创建 SSL 监听器,并终结 SSL 在 LB :

image

  1. MQTT 客户端连接 LB 公网地址测试。

私有网络部署

EMQX 集群直连

EMQX 集群直接挂 DNS 轮询,设备通过域名或者 IP 地址列表访问:

  1. 部署 EMQX 集群
  2. EMQX 节点防火墙开启外部 MQTT 访问端口,例如 1883, 8883
  3. 设备通过 IP 地址列表或域名访问 EMQX 集群

提示

产品部署不推荐这种部署方式。

HAProxy 负载均衡

HAProxy 作为 LB 部署 EMQX 集群,并终结 SSL 连接:

  1. 创建 EMQX 集群节点,例如:
节点IP 地址
emqx1192.168.0.2
emqx2192.168.0.3
  1. 配置 /etc/haproxy/haproxy.cfg,示例:
  1. listen mqtt-ssl
  2. bind *:8883 ssl crt /etc/ssl/emqx/emq.pem no-sslv3
  3. mode tcp
  4. maxconn 50000
  5. timeout client 600s
  6. default_backend emqx_cluster
  7. backend emqx_cluster
  8. mode tcp
  9. balance source
  10. timeout server 50s
  11. timeout check 5000
  12. server emqx1 192.168.0.2:1883 check inter 10000 fall 2 rise 5 weight 1
  13. server emqx2 192.168.0.3:1883 check inter 10000 fall 2 rise 5 weight 1

Nginx 负载均衡

Nginx 产品作为 EMQX 集群 LB,并终结 SSL 连接:

  1. 创建 EMQX 节点集群,例如:
节点IP 地址
emqx1192.168.0.2
emqx2192.168.0.3
  1. 配置 /etc/nginx/nginx.conf,示例:
  1. stream {
  2. upstream stream_backend {
  3. zone tcp_servers 64k;
  4. hash $remote_addr;
  5. server 192.168.0.2:1883 max_fails=2 fail_timeout=30s;
  6. server 192.168.0.3:1883 max_fails=2 fail_timeout=30s;
  7. }
  8. server {
  9. listen 8883 ssl;
  10. status_zone tcp_server;
  11. proxy_pass stream_backend;
  12. proxy_buffer_size 4k;
  13. ssl_handshake_timeout 15s;
  14. ssl_certificate /etc/emqx/certs/cert.pem;
  15. ssl_certificate_key /etc/emqx/certs/key.pem;
  16. }
  17. }