当前位置: 首页 > news >正文

EMQX社区版5.8.5集群搭建踩坑记

一、首先要在三台物理机上分别搭建EMQX的实例

正常的安装是很简单的,并且有多种方式,我选取的是tar.gz安装包。
只需要把安装包解压tar -zxvf emqx-5.8.5xxx.tar.gz,然后进入到bin目录下,执行./emqx start即可。

1. 需要考虑操作系统版本,找到合适的安装包

https://www.emqx.com/zh/downloads/broker/v5.8.5
要考虑操作系统、版本、架构是否匹配。
比如我在openEuler 22.03 (LTS-SP4)上使用emqx-5.8.5-el8-amd64.tar.gz安装成功,但在CentOS Linux 7 (Core)上却安装不成功,后边换成了emqx-5.8.5-el7-amd64.tar.gz才可以。

2. 需要安装好相关依赖

比如我在openEuler 22.03 (LTS-SP4)上安装了以下依赖:

yum install -y make gcc g++ ncurses-devel openssl-devel git fcgi fcgi-devel unixODBC unixODBC-develrpm -ivh libatomic-4.8.5-44.el7.x86_64.rpm

在CentOS Linux 7 (Core)上安装时老报错:
ERROR: Required dependencies: openssl-1.1.1 (libcrypto), libncurses and libatomic1
于是安装了以下依赖:

yum install -y libatomicyum install -y epel-releaseyum install -y gcc gcc-c++ make cmake protobuf-compiler openssl-devel erlang erlang-nox

二、然后修改配置,将3个实例组织成一个集群

参考官网:https://docs.emqx.com/zh/emqx/v5.8/deploy/cluster/create-cluster.html
我这边采用的是基于 static 节点列表自动集群,只需要区分一下各个节点的名称node.name即可。

以下是我对三个实例的配置:

node {name = "emqx@192.168.0.1"cookie = "emqxsecretcookie"data_dir = "data"
}cluster {name = emqxcldiscovery_strategy = staticstatic {seeds = ["emqx@192.168.0.1","emqx@192.168.0.2","emqx@192.168.0.3"]}
}
node {name = "emqx@192.168.0.2"cookie = "emqxsecretcookie"data_dir = "data"
}cluster {name = emqxcldiscovery_strategy = staticstatic {seeds = ["emqx@192.168.0.1","emqx@192.168.0.2","emqx@192.168.0.3"]}
}
node {name = "emqx@192.168.0.3"cookie = "emqxsecretcookie"data_dir = "data"
}cluster {name = emqxcldiscovery_strategy = staticstatic {seeds = ["emqx@192.168.0.1","emqx@192.168.0.2","emqx@192.168.0.3"]}
}

cookie可以设置得复杂点,更安全。但需要确保集群内的这几个节点的cookie是一致的。

除此之外,需要确保节点间的网络连接正常。
5370:集群 RPC 端口,适用于物理机环境

可以使用iptables命令


## 查看当前iptables规则‌
sudo iptables -L -n## 添加规则允许5370端口
sudo iptables -A INPUT -p tcp --dport 5370 -j ACCEPT## 保存iptables规则, 执行iptables-save也行
sudo service iptables save

也可以确保1883、8883、18083这些端口也开放。
将三个节点以此启动,你就可以在三个控制面板上看到相同的集群节点列表了:
在这里插入图片描述
或者在任一节点上执行命令,查看集群状态:

./emqx ctl cluster status

Cluster status: #{running_nodes =>
[‘emqx@192.168.0.1’,‘emqx@192.168.0.2’,
‘emqx@192.168.0.3’],
stopped_nodes => []}

三、nginx的安装、配置和部署

参考官网:https://docs.emqx.com/zh/emqx/v5.8/deploy/cluster/lb-nginx.html

使用 NGINX 负载均衡 EMQX 集群具备以下几个功能和优势:
1.作为反向代理服务器,NGINX 位于 MQTT 服务器端,代表 MQTT 客户端向 EMQX 集群发起 MQTT 连接请求,并代替 EMQX 集群处理请求,然后将 EMQX 集群的响应返回给 MQTT 客户端。这样的设置可以将多个集群隐藏起来,暴露一个接入点给 MQTT 客户端。MQTT 客户端只需要与 NGINX 通信,而不需要知道后面的集群数量和布局,这种方式可以提高系统的可维护性和可扩展性。
2.NGINX 可用于终结 MQTT 客户端与 EMQX 集群之间经 SSL 加密的 MQTT 连接,减轻 EMQX 集群的加密解密负担。从而提供多种优势,如提高性能、简化证书管理和增强安全性。
3.NGINX 具有灵活的负载均衡策略,以使用不同的策略来决定请求应该发送到集群中的哪个 EMQX 节点,有助于分摊流量和请求,提高性能和可靠性。例如粘性负载平衡,可将请求路由到同一后端服务器,从而提高性能和会话持久性。

本来安装过nginx做过静态资源服务器和http的反向代理,想着照搬过来就行,但看了官网才知道,还需要附带一些模块才能支持tcp反向代理

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

于是,就干脆照着官网上的建议重新安装了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_modulemake
make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
cd sbin./nginx -t./nginx -s reload

特别需要注意的一点是,要设置代理协议为true
在这里插入图片描述


stream {upstream mqtt_servers {# down:表示当前的 server 暂时不参与负载# max_fails:允许请求失败的次数;默认为 1# fail_timeout:失败超时时间,默认 10s, max_fails 达到次数后暂停的请求时间# backup:其它所有的非backup机器down或者忙的时候,请求backup机器server 192.168.0.1:1883;server 192.168.0.2:1883;server 192.168.0.3:1883;}server {listen 10884;proxy_pass mqtt_servers;# 启用此项时,对应后端监听器也需要启用 proxy_protocolproxy_protocol on;proxy_connect_timeout 10s;   # 默认心跳时间为 10 分钟proxy_timeout 1800s;proxy_buffer_size 3M;tcp_nodelay on;       }upstream mqtts_servers {server 192.168.0.1:1883;server 192.168.0.2:1883;server 192.168.0.3:1883;}server {listen 20884 ssl;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;ssl_certificate /usr/local/NGINX/certs/server.crt;ssl_certificate_key /usr/local/NGINX/certs/server.key;ssl_verify_depth 2;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers HIGH:!aNULL:!MD5;# 添加 CA 证书及开启验证客户端证书参数即可启用双向认证# ssl_client_certificate /usr/local/NGINX/certs/ca.pem;# ssl_verify_client on;# ssl_verify_depth 1;proxy_pass mqtts_servers;# 启用此项时,对应后端监听器也需要启用 proxy_protocolproxy_protocol on;proxy_connect_timeout 10s;   # 默认心跳时间为 10 分钟proxy_timeout 1800s;proxy_buffer_size 3M;tcp_nodelay on;}
}

四、集群的自测验证

  1. 采用nginx暴露出去的emqx集群地址,是否能平替之前的单节点地址?
    答: 可以。多个client都用这个集群地址去连接,它们之间是可以正常进行消息的收发的,而不论它们是否连到了集群的同一个节点上。

  2. 可以监听系统消息吗?
    答:可以。需要在控制台 【访问控制】 --> 【客户端授权】ACL File找中添加一行配置,然后对应用服务重启,以便可以重新订阅上系统主题。

{allow, {username, "zhangsan"}, subscribe, ["$SYS/#"]}.
  1. 集群相对于单点来说,高可用上有体现吗?
    答:有。手动stop其中一个节点时,连接会自动转移到其他节点上,不影响业务。

相关文章:

  • 30V/150A MOSFET 150N03在无人机驱动动力系统中的性能边界与热设计挑战
  • 【JavaWeb】Maven、Servlet、cookie/session
  • 人工智能在智能金融中的创新应用与未来趋势
  • c++ 模板
  • 如何使用Python从MySQL数据库导出表结构到Word文档
  • OleDbParameter.Value 与 DataTable.Rows.Item.Value 的性能对比
  • Vue中 toRaw 和 markRaw 的使用
  • Java面试:企业协同SaaS中的技术挑战与解决方案
  • 龙舟竞渡与芯片制造的共通逻辑:华芯邦的文化破局之道
  • RAG混合检索:倒数秩融合RRF算法
  • 在日常管理服务器中如何防止SQL注入与XSS攻击?
  • 从公开到私密:重新思考 Web3 的数据安全
  • 2025最新Nginx安装配置保姆级教程(Windows)
  • Dify运行本地和在线模型
  • 随笔20250530 C# 整合 IC卡读写技术解析与实现
  • 《java创世手记》---java基础篇(上)
  • Paraformer语音模型:一种语音模型加速方法
  • π0-FAST-针对VLA模型的高效动作token化技术-2025.1.16-开源
  • MySQL + CloudCanal + Iceberg + StarRocks 构建全栈数据服务
  • 【Netty系列】核心概念
  • 怎么把网站上传到空间/谷歌浏览器官方app下载
  • 做的网站上传到服务器吗/良品铺子网络营销策划书
  • 12306网站多少钱做的/石家庄疫情太严重了
  • 厚街网站建设公司/郑州seo技术代理
  • 广州冼村是什么地方/网站关键词优化培训
  • 怎么打帮人做网站开发的广告/网站排名提升软件