emqx-mqtt服务器集群搭建

 mqtt服务器搭建参考上一篇文章

uniapp前端从零开始搭建一套mqtt服务

配置节点名称

为分别部署在 s1.emqx.io 和 s2.emqx.io 的两个节点创建一个集群

在第一个节点的 emqx.conf 配置文件中配置节点名称,例如:

node.name = emqx@s1.emqx.io

emqx.conf 配置文件默认位于/etc/emqx 

还可以使用环境变量覆盖节点名称:

env EMQX_NODE__NAME='emqx@s1.emqx.io' ./bin/emqx start

为其他节点重复上述步骤以加入集群。

现在已经命名了两个要加入集群的节点,emqx@s1.emqx.io 和 emqx@s2.emqx.io。可以手动或自动创建一个集群。

自动集群是最简单的

在所有节点 emqx.conf 文件中配置相同的集群方式和节点列表:

cluster {
    discovery_strategy = static
    static {
        seeds = ["emqx@node1.emqx.com", "emqx@node2.emqx.com"]
    }
}

出于安全考虑,应该在所有要加入集群的节点上的 emqx.conf 中将默认 cookie 设置更改为秘密 cookie。所有要加入集群的节点都应使用相同的秘密 cookie,是一个字符串

node.cookie = "mqxsecretcookie"

关闭匿名连接

emqx.conf 中加入

allow_anonymous = false

用 Nginx 负载均衡 EMQX 集群

安装 Nginx

此处使用 Ubuntu 22.04 LTS 系统,通过源码编译安装的方式安装 Nginx。您也可以使用 Docker 或二进制包安装 Nginx。

环境要求

在编译和安装 Nginx 前,需要确保系统中已经安装了以下依赖项:

  • GNU C 和 C++ 编译器
  • PCRE (Perl Compatible Regular Expressions) 库
  • zlib 压缩库
  • OpenSSL 库

可以使用以下命令在 Ubuntu 系统中安装以上依赖项:

sudo apt-get update
sudo apt-get install build-essential libpcre3-dev zlib1g-dev libssl-dev

下载源码

可以从 Nginx 官方网站下载最新的稳定版本,例如:

wget https://nginx.org/download/nginx-1.24.0.tar.gz

编译配置命名

下载完成后,需要解压并进入源码目录:

tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

使用以下命令进行编译配置:

./configure \
 --with-threads \
 --with-http_stub_status_module \
  --with-http_ssl_module \
  --with-http_realip_module \
  --with-stream \
  --with-stream_ssl_module

其中 --with-http_ssl_module 参数用于添加 SSL 功能支持,--with-stream 与 --with-stream_ssl_module 参数用于添加 TCP 反向代理支持。

开始编译

完成配置后,可以使用以下命令开始编译:

make

安装

编译完成后,可以使用以下命令安装 Nginx:

sudo make install

将 Nginx 可执行文件连接到系统 PATH 中的目录:

sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

开始使用

Nginx 的配置文件默认位于 /usr/local/nginx/conf/nginx.conf,将反向代理配置示例添加到文件末尾即可。Nginx 基本操作命令如下:

检查配置文件:

sudo nginx -t

如果 Nginx 配置文件验证成功,则可以启动 Nginx:

sudo nginx

重新加载正在运行的 Nginx 并应用新配置,建议在操作前检查配置是否无误:

sudo nginx -s reload

停止 Nginx:

sudo nginx stop

反向代理 MQTT

您可以在 Nginx 的配置文件中添加以下配置来反向代理来自客户端的 MQTT 连接请求,将请求转发至后端 MQTT 服务器。

stream {
  upstream mqtt_servers {
    # down:表示当前的 server 暂时不参与负载
    # max_fails:允许请求失败的次数;默认为 1
    # fail_timeout:失败超时时间,默认 10s, max_fails 达到次数后暂停的请求时间
    # backup:其它所有的非backup机器down或者忙的时候,请求backup机器

    server emqx1-cluster.emqx.io:1883 max_fails=2 fail_timeout=10s;
    server emqx2-cluster.emqx.io:1883 down;
    server emqx3-cluster.emqx.io:1883 backup;
  }

  server {
    listen 2883; # 这个是tcp连接时的端口
    proxy_pass mqtt_servers;

    # 启用此项时,对应后端监听器也需要启用 proxy_protocol
    proxy_protocol on;
    proxy_connect_timeout 10s;   
    # 默认心跳时间为 10 分钟
    proxy_timeout 1800s;
    proxy_buffer_size 3M;
    tcp_nodelay on;       
  }
}

 后端监听器启用 proxy_protocol可以在dashboard里设置,tcp打开就好,webscoket打开的话就连接不上了

反向代理 MQTT WebSocket

您可以使用以下配置使 Nginx 反向代理 MQTT WebSocket 连接,将客户端请求转发至后端 MQTT 服务器。需要使用 server_name 指定 HTTP 域名或 IP 地址。

http {
  upstream mqtt_websocket_servers {
    server emqx1-cluster.emqx.io:8083;
    server emqx2-cluster.emqx.io:8083;
  }

  server {
    listen 8085;# 这个是webscoket连接时的端口
    server_name mqtt.example.com; # 这个是webscoket连接时的地址

    location /mqtt {
      proxy_pass http://mqtt_websocket_servers;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";

      # 禁用缓存             
      proxy_buffering off;

      proxy_connect_timeout 10s;        
      # WebSocket 连接有效时间
      # 在该时间内没有数据交互的话 WebSocket 连接会自动断开,默认为 60s 
      proxy_send_timeout 3600s;            
      proxy_read_timeout 3600s;            

      # 反向代理真实 IP            
      proxy_set_header Host $host;            
      proxy_set_header X-Real-IP $remote_addr;            
      proxy_set_header REMOTE-HOST $remote_addr;            
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }
}

目前项目里只使用了tcp及wenbscoket连接,需要代理其他连接的看官网用 Nginx 负载均衡 EMQX 集群 | EMQX 文档 

修改完记得重新加载nginx 

sudo nginx -s reload

负载均衡策略

Nginx 提供了多种负载均衡策略,用于控制连接的分发方式。我们目前只用到一种

在 upstream 块中配置即可。

轮询(Round Robin)

这是默认的负载均衡策略,它将请求依次分配给每个后端服务器,循环往复。这样可以平均分担负载,适用于后端服务器性能差不多的情况。

upstream backend_servers {
  server emqx1-cluster.emqx.io:1883;
  server emqx2-cluster.emqx.io:1883;
  server emqx3-cluster.emqx.io:1883;
}

开放端口 

emqx有几个默认端口需要开放,tcp:1883,ws:8083,wss:8084,ssl:8883,这几个是可以修改的,也是可以在dashboard里设置

 负载均衡的端口自己设置就好了,比如实例里的2883和8085

还有两个集群内通信端口4370,5370,这两个前三个数字默认不可以配置,集群通信端口一定要打开,不然部署了集群与负载均衡后,不在相同节点的客户端无法通信

dashboard默认端口是18083,修改的话在emqx.conf中修改

dashboard {
    listeners.http {
        bind = 18084
    }
}

集群内通信端口

为了形成一个集群,EMQX 节点需要通过一些常规端口进行互联

如果集群节点之间有防火墙,常规监听端口应该允许集群中的其他节点连通。

EMQX 节点之间有两种不同的通道进行通信。

Erlang 分布式传输端口

EMQX 采用了传统的端口映射机制,而非 Erlang Port Mapper Daemon, EPMD

Erlang 分布端口。ListeningPort = BasePort + Offset。 其中 BasePort 是 4370(默认不可以配置),Offset 是节点名称的后缀。 如果节点名称没有数字后缀,Offsset 就是 0。

例如,在 emqx.conf 中的 node.name = emqx@192.168.0.12 应该使 节点的监听端口为 4370,而 emqx1(或 emqx-1)的端口为 4371,以此类推。

集群 RPC 端口

默认情况下,每个 EMQX 节点有一个 RPC 监听端口。 防火墙应该配置成允许访问。

端口映射规则类似于 Erlang 分布式端口映射规则。 只有 "BasePort" 是 "5370"。

也就是说,在 emqx.conf 中的 node.name = emqx@192.168.0.12 应该使节点的 监听端口 5370,端口 5371 用于 emqx1(或 emqx-1),以此类推。

Docker 容器中的 EMQX 使用静态端口 5369 进行集群 RPC。

设置完记得重启emqx服务

  • 31
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值