集群负载均衡

负载均衡(Load Balancing)用于均衡多个网络组件的负载,从而优化资源的使用,避免由于组件过载造成故障。负载均衡虽然不是集群中的必备组件,但是能给集群带来一些非常有用的特性,例如当配置在 EMQX 集群中时,将能带来如下优势:

  • 均衡 EMQX 的负载,避免出现单节点过载的情况;
  • 简化客户端配置,客户端只需连接到负载均衡器上,无需关心集群内部伸缩变化;
  • TLS/SSL 终结,减轻 EMQX 集群的负担;
  • 提高安全性,有了负载均衡在集群前端,能够通过设置阻止不需要的流量,保护 EMQX 集群免受恶意攻击。

本章节将指导您为 EMQX 集群选择并启用负载器。

部署架构

当在 EMQX 中部署 LB (负载均衡器) 后,LB 会负责处理 TCP 连接,并将收到的 MQTT 连接与消息分发到不同的 EMQX 集群节点,部署架构如下所示:

EMQX TCP 负载均衡部署

推荐在 LB 终结 SSL/TLS 连接。设备与 LB 之间采用 SSL/TLS 安全连接,LB 与 EMQX 之间普通 TCP 连接,这种模式能够使 EMQX 集群性能最大化,部署架构如下所示:

EMQX 负载均衡终结 TLS 部署

除了负载均衡部署集群外,还可以使用 DNS 轮询直连 EMQX 集群,即将所有节点加入 DNS 轮询列表,设备通过域名或者 IP 地址列表访问集群,通常不建议在生产环境中采用 DNS 轮询直连方式。

选择负载均衡产品

目前可用的负载均衡产品很多,有开源的也有商业的,各个公有云服务商一般也都会提供各自的负载均衡服务。

公有云厂商 LB 产品:

云计算厂商是否支持 TLS 终结LB 产品介绍
华为云集群负载均衡 - 图3 (opens new window)https://www.huaweicloud.com/product/elb.html集群负载均衡 - 图4 (opens new window)
阿里云集群负载均衡 - 图5 (opens new window)https://www.aliyun.com/product/slb集群负载均衡 - 图6 (opens new window)
腾讯云集群负载均衡 - 图7 (opens new window)https://cloud.tencent.com/product/clb集群负载均衡 - 图8 (opens new window)
青云集群负载均衡 - 图9 (opens new window)https://docs.qingcloud.com/product/network/loadbalancer/集群负载均衡 - 图10 (opens new window)
天翼云集群负载均衡 - 图11 (opens new window)https://www.ctyun.cn/products/elb集群负载均衡 - 图12 (opens new window)
UCloud集群负载均衡 - 图13 (opens new window)https://ucloud.cn/site/product/ulb.html集群负载均衡 - 图14 (opens new window)
AWS集群负载均衡 - 图15 (opens new window)https://aws.amazon.com/cn/elasticloadbalancing/集群负载均衡 - 图16 (opens new window)
Azure集群负载均衡 - 图17 (opens new window)未知https://azure.microsoft.com/zh-cn/products/load-balancer/集群负载均衡 - 图18 (opens new window)
Google Cloud集群负载均衡 - 图19 (opens new window)https://cloud.google.com/load-balancing?hl=zh-cn集群负载均衡 - 图20 (opens new window)

私有部署 LB 服务器

开源 LB是否支持 TLS 终结方案介绍
HAProxy集群负载均衡 - 图21 (opens new window)https://www.haproxy.com/solutions/load-balancing.html集群负载均衡 - 图22 (opens new window)(推荐)
Nginx集群负载均衡 - 图23 (opens new window)https://www.nginx.com/solutions/load-balancing/集群负载均衡 - 图24 (opens new window)

下面我们将以私有部署 LB 服务器为例向大家介绍如何配置并负载均衡 EMQX 集群。

配置 HAProxy/NGINX 负载均衡

假设 EMQX 集群中有以下 2 个节点:

节点IP 地址
emqx1192.168.0.2
emqx2192.168.0.3

对应的配置方式如下。

启用 Proxy Protocol

如果 EMQX 集群部署在 HAProxy 或 NGINX 后,且需要拿到客户端真实的源 IP 地址与端口,则需要在 EMQX 对应监听器打开 Proxy Protocol 配置,以 1883 监听器为例,在 etc/emqx.conf 中找到监听器配置并添加 proxy_protocol 配置项:

  1. listeners.tcp.default {
  2. bind = "0.0.0.0:1883"
  3. max_connections = 1024000
  4. proxy_protocol = true
  5. }

有关 Proxy Protocol 的介绍和 NGINX 中使用的 Proxy Protocol,可以参考:

前置准备:HAProxy 已安装,有关 HAProxy 介绍及安装请参考 HAProxy 官方网站集群负载均衡 - 图27 (opens new window)

如使用 HAProxy 作为 EMQX 集群的 LB,并终结 SSL 连接,可参照如下示例修改 /etc/haproxy/haproxy.cfg

注意:根据您所选的 HAProxy 安装方式,文件路径会有差异。

  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 介绍及安装请参考 Nginx 官方网站集群负载均衡 - 图28 (opens new window)

如使用 NGINX 作为 EMQX 集群的 LB,并终结 SSL 连接,修改 /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. proxy_pass stream_backend;
  11. proxy_buffer_size 4k;
  12. ssl_handshake_timeout 15s;
  13. ssl_certificate /etc/emqx/certs/cert.pem;
  14. ssl_certificate_key /etc/emqx/certs/key.pem;
  15. }
  16. }