EMQX 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器,本文主要介绍其安装及简单使用,文中使用到的软件版本:emqx 4.4.2、Centos 7.
1、概述
EMQX (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。
Erlang/OTP是出色的软实时 (Soft-Realtime)、低延时 (Low-Latency)、分布式 (Distributed)的语言平台。
MQTT 是轻量的 (Lightweight)、发布订阅模式 (PubSub) 的物联网消息协议。
EMQX 设计目标是实现高可靠,并支持承载海量物联网终端的 MQTT 连接,支持在海量物联网设备间低延时消息路由:
- 稳定承载大规模的 MQTT 客户端连接,单服务器节点支持 200 万连接。
- 分布式节点集群,快速低延时的消息路由。
- 消息服务器内扩展,支持定制多种认证方式、高效存储消息到后端数据库。
- 完整物联网协议支持,MQTT、MQTT-SN、CoAP、LwM2M、WebSocket 或私有协议支持。
2、单机安装
EMQX 提供了多种安装方式:RPM/DEB包安装 (Linux)、ZIP 压缩包安装 (Linux、MacOS、Windows)、通过 Docker 运行、通过 Helm 安装、源码编译安装;这里主要介绍 通过ZIP 压缩包安装 EMQX。
2.1、下载并解压安装包
下载对应系统的安装包:https://www.emqx.com/zh/try?product=broker,然后解压:
unzip emqx-4.4.2-otp24.1.5-3-el7-amd64.zip
2.2、启动 EMQX Broker
cd emqx/bin
./emqx start
2.3、停止 EMQX Broker
cd emqx/bin
./emqx stop
2.4、查看状态
cd emqx/bin
./emqx_ctl status
2.5、Listener
Listener 主要用于配置不同协议的监听端口和相关参数,EMQX 支持配置多个 Listener 以同时监听多个协议或端口,以下是支持的 Listener:
监听器 | 说明 |
---|---|
TCP Listener | A listener for MQTT which uses TCP |
SSL Listener | A secure listener for MQTT which uses TLS |
Websocket Listener | A listener for MQTT over WebSockets |
Secure Websocket Listener | A secure listener for MQTT over secure WebSockets (TLS) |
EMQX 默认提供 5 个 Listener,它们将占用以下端口:
端口 | 说明 |
---|---|
1883 | MQTT/TCP 协议端口 |
11883 | MQTT/TCP 协议内部端口,仅用于本机客户端连接 |
8883 | MQTT/SSL 协议端口 |
8083 | MQTT/WS 协议端口 |
8084 | MQTT/WSS 协议端口 |
2.5、控制台
EMQX 提供了 Dashboard 以方便用户管理设备与监控相关指标。控制台地址为:http://localhost:18083,默认用户名密码为:admin/public,可以在 etc/plugins/emqx_dashboard.conf 配置文件中修改默认密码。
3、集群安装
3.1、集群原理
Erlang/OTP 最初是爱立信为开发电信设备系统设计的编程语言平台,电信设备(路由器、接入网关等)典型设计是通过背板连接主控板卡与多块业务板卡的分布式系统。
Erlang/OTP 语言平台的分布式程序,由分布互联的 Erlang 运行系统组成,每个 Erlang 运行系统被称为节点(Node),节点(Node) 间通过 TCP 互联,消息传递的方式通信:
EMQX 消息服务器集群基于 Erlang/OTP 分布式设计,集群原理可简述为下述两条规则:
MQTT 客户端订阅主题时,所在节点订阅成功后广播通知其他节点:某个主题(Topic)被本节点订阅。
MQTT 客户端发布消息时,所在节点会根据消息主题(Topic),检索订阅并路由消息到相关节点。
3.2、集群规划
ip | 节点名称 |
10.49.196.10 | emqx@10.49.196.10 |
10.49.196.11 | emqx@10.49.196.11 |
10.49.196.12 | emqx@10.49.196.12 |
3.3、按单机方式安装 EMQX
在各机器上按单机方式安装 EMQX,注意修改配置(etc/emqx.conf)的节点名称:
10.49.196.10 上:
node.name = emqx@10.49.196.10
10.49.196.11 上:
node.name = emqx@10.49.196.11
10.49.196.12 上:
node.name = emqx@10.49.196.12
分别启动各机器上的 EMQX。
3.4、节点加入集群
在 10.49.196.11 和 10.49.196.12 上执行:
cd emqx/bin ./emqx_ctl cluster join emqx@10.49.196.10
3.5、节点推出集群
A、节点主动退出集群:
cd emqx/bin
./emqx_ctl cluster leave
B、在其他节点上删除其他节点
如在 emqx@10.49.196.11 上删除 emqx@10.49.196.12 节点:
cd emqx/bin ./emqx_ctl cluster force-leave emqx@10.49.196.12
3、认证
身份认证是大多数应用的重要组成部分,MQTT 协议支持用户名密码认证,启用身份认证能有效阻止非法客户端的连接。
EMQX 中的认证指的是当一个客户端连接到 EMQX 的时候,通过服务器端的配置来控制客户端连接服务器的权限。
EMQX 的认证支持包括两个层面:
-
MQTT 协议本身在 CONNECT 报文中指定用户名和密码,EMQX 以插件形式支持基于 Username、ClientID、HTTP、JWT、LDAP 及各类数据库如 MongoDB、MySQL、PostgreSQL、Redis 等多种形式的认证。
-
在传输层上,TLS 可以保证使用客户端证书的客户端到服务器的身份验证,并确保服务器向客户端验证服务器证书。也支持基于 PSK 的 TLS/DTLS 认证。
这里主要介绍下基于内置数据源(Mnesia)的认证。
3.1、修改配置
根据需要在 etc/plugins/emqx_auth_mnesia.conf 文件中修改密钥算法、增加或修改用户信息。
## Value: plain | md5 | sha | sha256 | sha512 auth.mnesia.password_hash = sha256 auth.user.1.username = admin auth.user.1.password = 123456
3.2、启用插件
在控制台启用该插件即可。
4、MQTTX 使用
MQTT X 是一款优雅的跨平台 MQTT 5.0 开源桌面客户端工具,支持在 macOS, Linux 和 Windows 上运行。下载与使用可参考 MQTT X 官网。