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;}
}
四、集群的自测验证
-
采用nginx暴露出去的emqx集群地址,是否能平替之前的单节点地址?
答: 可以。多个client都用这个集群地址去连接,它们之间是可以正常进行消息的收发的,而不论它们是否连到了集群的同一个节点上。 -
可以监听系统消息吗?
答:可以。需要在控制台 【访问控制】 --> 【客户端授权】ACL File找中添加一行配置,然后对应用服务重启,以便可以重新订阅上系统主题。
{allow, {username, "zhangsan"}, subscribe, ["$SYS/#"]}.
- 集群相对于单点来说,高可用上有体现吗?
答:有。手动stop其中一个节点时,连接会自动转移到其他节点上,不影响业务。