EMQ X R3.0 (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 语言平台开发,支持大规模连接和分布式集群,发布订阅模式的开源 MQTT 消息服务器。
MQTT是什么
MQTT是一个由IBM主导开发的物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。它的核心设计思想是开源、可靠、轻巧、简单,具有以下主要的几项特性:
emqx提供了三种消息发布服务质量
Quality of Service等级是发送与接收端的一种关于保证交付信息的协议。一共有3 个QoS 等级:
(1) "至多一次0",消息发布完全依赖底层TCP/IP 网络,会发生消息丢失或者重复,这一级别可用于如下情况,环境,传感器数据,丢失一次度记录无所谓,因为不久之后会有第二次发送
(2)"至少一次1" 确保消息到达,但消息重复可能发生
(3) “只有一次2",确保消息到达一次,这一级别可用于如下情况,在计费系统中,消息重复或者丢失导致不正确的结果
EMQ离线消息
(1) 保留消息 MQTT客户端向服务器发布(PUBLISH)消息时,可以设置保留消息(Retained Message)标志。保留消息(Retained Message)会驻留在消息服务器,后来的订阅者订阅主题时仍可以接收该消息。 例如mosquitto命令行发布一条保留消息到主题’a/b/c’: mosquitto_pub -r -q 1 -t a/b/c -m 'hello' 之后连接上来的MQTT客户端订阅主题’a/b/c’时候,仍可收到该消息: $ mosquitto_sub -t a/b/c -q 1 hello 保留消息(Retained Message)有两种清除方式: 客户端向有保留消息的主题发布一个空消息: mosquitto_pub -r -q 1 -t a/b/c -m '' 消息服务器设置保留消息的超期时间。
(2) cleanSession 清理回话 MQTT客户端向服务器发起CONNECT请求时,可以通过’Clean Session’标志设置会话。 ‘Clean Session’设置为0,表示创建一个持久会话,在客户端断开连接时,会话仍然保持并保存离线消息,直到会话超时注销。 ‘Clean Session’设置为1,表示创建一个新的临时会话,在客户端断开时,会话自动销毁。
ACL鉴权
实际场景,我们需要监听每一台设备的链接和断开事件等EMQ的系统行为,这样的事件当然不是任何一个连接到服务器的终端,这样的限制就是ACL鉴权,官方也提供了默认的鉴权,在 /usr/local/emqttd/etc/acl.conf 下,默认值允许127.0.0.1的IP地址链接监听系统主题。
官方提供如下方式来进行用户和ACL验证的存储:
可以采用大家经常用到的MYSQL作为鉴权的数据来源,首先先关闭匿名认证(默认是开启的谁都能够登录)
Nginx TCP/SSL 反向代理设置
mkdir -p /usr/local/nginx/tcp.d/
cat <<- 'EOF' >> /usr/local/nginx/nginx.conf
include /usr/local/nginx/tcp.d/*.conf;
EOF
vim emqx_tcp_nginx.conf
stream
{
log_format proxy '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
access_log /var/log/nginx/tcp-access.log proxy ;
open_log_file_cache off;
upstream mqtt1883 {
#zone tcp_servers 64k;
#hash $remote_addr;
server 192.168.1.10:1883 weight=1;
server 192.168.1.13:1883 weight=1;
}
server {
listen 1883;
proxy_send_timeout 2h;
proxy_read_timeout 2h;
proxy_connect_timeout 150s;
proxy_timeout 150s;
proxy_pass mqtt1883;
proxy_buffer_size 3M;
tcp_nodelay on;
}
}
EMQ 监控指标
关于监控,官方产品已经提供了dashboard监控面板,已经把重点需要关注的数据进行了上报,现在还需要思考一个问题,就是关于异常的告警处理。
异常数据需要有告警通知功能,比如可以使用zabbix自定义插件把重点的指标进行上报,监控告警的考虑整理如下:
(1)通用项监控,内存,硬盘,cpu,io,网络,进程,端口等
(2)emqx集群状态监控,如集群里面主机节点的健康状态
(3)重点业务指标的监控
Received---收到的消息数
Sent---发出的消息数
Dropped---丢失的消息数(在收到消息后,该消息无人订阅)
Retained---保留的消息数
控制面板里面有一些参数需要关注:
这里看到一片文章介绍很详细 《EMQ 管理控制台功能简介》https://www.jianshu.com/p/ae76ac570f51
如果 EMQ 安装在本机,则使用浏览器打开地址 http://127.0.0.1:18083 ,输入默认用户名 admin 与默认密码 public ,登录进入 Dashboard。如果忘记了管理控制台密码,使用 管理命令 重置或新建管理账号。
罗列一些重要的指标
Received---接收到的MQTT报文数
Sent---发送的MQTT报文数
Connect---几次MQTT连接
Connack---几次MQTT确认连接请求
Disconnect---几次MQTT连接断开
Pingreq---ping request 个数,在一个心跳周期内,客户端会发送一条pingreq到服务端
Pingresq---ping response 个数,服务端收到pingreq的请求之后,会立即响应一个两个字节固定格式的pingresq消息
Published/received---收到的Published报文个数
Published/sent---发送的Published报文个数
Puback/received---收到的Puback报文个数
Puback/sent---发送的Puback报文个数
Puback/missed---没收到的Puback报文个数
Pubcomp/received---收到的Pubcomp报文个数
Pubcomp/sent---发送的Pubcomp报文个数
Pubcomp/missed---失去的Pubcomp报文个数
Pubrec/received---收到的Pubrec报文个数
Pubrec/sent---发送的Pubrec报文个数
Pubrec/missed---失去的Pubrec报文个数
Pubrel/received---收到的Pubrel报文个数
Pubrel/sent---发送的Pubrel报文个数
Pubrel/missed---失去的Pubrel报文个数
Subscribe---发送的订阅数
Suback---发送返回的订阅数
Unsubscribe---发送的取消订阅数
Unsuback---发送返回的取消订阅数
The message data 消息数
Received---收到的消息数
Sent---发出的消息数
Dropped---丢失的消息数(在收到消息后,该消息无人订阅)
Retained---保留的消息数
Qos0/received---收到的qos0消息数
Qos0/sent---发送的qos0消息数
Qos1/received---收到的qos1消息数
Qos1/sent---发送的qos1消息数
Qos2/received---收到的qos2消息数
Qos2/sent---发送的qos2消息数
Qos2/dropped---丢失的qos2消息数
The bytes data 流量收发统计(字节)
Received---收到的流量字节
Sent---发送的流量字节
任意节点上使用 ./bin/emqttd_ctl cluster status 命令查询集群状态:
Cluster status: [{running_nodes,['[email protected]',
'[email protected]',
'[email protected]']}]
centos7安装emqtt_benchmark压力测试工具:
之前测试遇到了超多的坑,相信超多小伙伴也遇到了相同的问题,现将完整的安装内容整理如下,直接复制执行即可。
=====================直接复制快速安装=================================
cd /opt
wget http://erlang.org/download/otp_src_21.0.tar.gz
git clone https://github.com/erlang/rebar3.git
git clone https://github.com/emqtt/emqtt_benchmark.git
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC-devel perl
tar xf otp_src_21.0.tar.gz
cd otp_src_21.0
./configure --prefix=/usr/local/erlang --without-javac
make && make install
echo "export PATH=/usr/local/erlang/bin:$PATH" >>/etc/profile
echo "export PATH=/opt/rebar3:$PATH" >>/etc/profile
. /etc/profile
cd /opt/rebar3/
./bootstrap
cd /opt/emqtt_benchmark/
make
./emqtt_bench_sub --help
=========================安装说明=====================================
统一软件下载路径 /opt
cd /opt
wget http://erlang.org/download/otp_src_21.0.tar.gz
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC-devel perl
tar xf otp_src_21.0.tar.gz
cd otp_src_21.0
./configure --prefix=/usr/local/erlang --without-javac
make && make install
添加环境变量
echo "export PATH=/usr/local/erlang/bin:$PATH" >>/etc/profile
. /etc/profile
验证erlang环境是否ok
执行验证:erl
再次执行:crypto:start().
还需要安装rebar3:
cd /opt
git clone https://github.com/erlang/rebar3.git
cd /opt/rebar3/
./bootstrap
以及添加环境变量
echo "export PATH=/opt/rebar3:$PATH" >>/etc/profile
. /etc/profile
压测工具下载编译
git clone https://github.com/emqtt/emqtt_benchmark.git
cd /opt/emqtt_benchmark/
make
./emqtt_bench_sub --help
EMQTT benchmark测试参数说明:
https://www.cnblogs.com/saryli/p/9794640.html
转载于:https://blog.51cto.com/12083623/2379707