Skip to content

FreeMQTT plus 快速部署

很多用户会对部署集群服务感到有点怵,其实没那么难,很容易,甚至比单机版部署还容易。
FreeMQTT plus的易用性借助于 Docker Swarm 的强大。
本指南假设在一台主机上进行部署。
关于跨多主机部署,请参考 Docker Swarm 相应的文档教程,极其容易。

环境

  • Linux OS / x86_64
  • Docker 28.0.4+

实操

  1. 拉取 FreeMQTT plus Docker Image
bash
$ docker pull registry.freemqtt.cn/freemqttplus:v260519
  1. 拉取 Nginx Docker Image (可选)
bash
$ docker pull nginx:latest
  1. 克隆 FreeMQTT plus docker stack YAML 脚本
bash
$ git clone git@gitee.com:ningchenglin/freemqtt-swarm-compose.git
  1. 创建 Docker Swarm 集群
bash
# 把 192.168.1.100 替换为你的管理节点内网IP
$ docker swarm init --advertise-addr 192.168.1.100
  1. 创建FreeMQTT plus Docker Swarm 配置
bash
$ cd ./freemqtt-swarm-compose
$ ./create-config.sh
  1. 启动 freemqttplus 集群

直接暴露 docker swarm 集群服务端口 1883、8883 给外网

bash
$ docker stack deploy -c docker-swarm-compose.yml freemqtt

或用nginx 作为反向代理对外网提供 MQTT 服务

bash
$ docker stack deploy -c docker-swarm-compose-with-nginx.yml freemqtt

注意:上面两个命令只能二选一。

  1. 查看FreeMQTT plus 集群服务状况
bash
$ docker stack services freemqtt
# 屏幕输出如下:
ID             NAME             MODE         REPLICAS   IMAGE                                       PORTS
e32nijw41cuy   freemqtt_anode   replicated   3/3        registry.freemqtt.cn/freemqttplus:v260519   *:1883->1883/tcp, *:8080->80/tcp, *:8443->443/tcp, *:8883->8883/tcp
j61g4chdwtjc   freemqtt_bnode   replicated   2/2        registry.freemqtt.cn/freemqttplus:v260519
  1. 查看全部A节点运行状况
bash
$ docker service ps freemqtt_anode
# 屏幕输出如下:
ID             NAME               IMAGE                                       NODE              DESIRED STATE   CURRENT STATE         ERROR     PORTS
yqr2al6t6ila   freemqtt_anode.1   registry.freemqtt.cn/freemqttplus:v260519   lavm-8td4x375v6   Running         Running 4 hours ago
vc1yjcf60a5m   freemqtt_anode.2   registry.freemqtt.cn/freemqttplus:v260519   lavm-8td4x375v6   Running         Running 4 hours ago
tdw3zql8m1zb   freemqtt_anode.3   registry.freemqtt.cn/freemqttplus:v260519   lavm-8td4x375v6   Running         Running 4 hours ago
  1. 查看全部B节点运行状况
bash
$ docker service ps freemqtt_bnode
# 屏幕输出如下:
ID             NAME               IMAGE                                       NODE              DESIRED STATE   CURRENT STATE         ERROR     PORTS
vy1qm3n0m6c8   freemqtt_bnode.1   registry.freemqtt.cn/freemqttplus:v260519   lavm-8td4x375v6   Running         Running 4 hours ago
91evrko76n5j   freemqtt_bnode.2   registry.freemqtt.cn/freemqttplus:v260519   lavm-8td4x375v6   Running         Running 4 hours ago

客户端密码

FreeMQTT plus 既考虑到用户项目实施的方便性,又要兼顾系统的安全性,从而采用应用 App token 作为 MQTT 客户端连接的密码进行身份验证。 为此 FreeMQTT plus 在docker 容器内提供了 freemqtt_token 这个命令行工具。
按如下步骤为一个应用(App)生成 token:

  1. 获取一个B节点容器 ID
bash
$ docker ps | grep freemqtt_bnode
# 屏幕输出如下, 第一列即为对应的 B 节点容器 ID
91a1eabf896e   registry.freemqtt.cn/freemqttplus:v260519   "/freemqttd/freemqtt…"   8 hours ago     Up 8 hours     freemqtt_bnode.2.91evrko76n5j4bfr09b190u4a
c263bdb336dc   registry.freemqtt.cn/freemqttplus:v260519   "/freemqttd/freemqtt…"   8 hours ago     Up 8 hours     freemqtt_bnode.1.vy1qm3n0m6c8t68o1ts5qiies
  1. 利用上面得到的一个B节点 ID 进入相应的容器生成 token
bash
$ docker exec -it 91a1eabf896e /freemqttd/freemqtt_token myapp
# 输出如下:
AppID: myapp
Token: lspO0sxHe+Nhei2v1QBUr+e/9pvn7J+NYe5CPn+cZf0=
  1. 用上面输出的Token作为 MQTT 客户端连接 FreeMQTT plus 服务的密码就可进行连接测试。

    请参照 FreeMQTT指南 > 快速上手中的连接测试,这里不再赘述。

Metrics 信息

  1. 查看FreeMQTT plus Metrics
bash
$ docker exec -it 91a1eabf896e /freemqttd/cluster_view
# 输出如下:
B-Node List:
    B1  host: freemqtt_bnode-1  port: 9200  running  uptime 0 days, 08:59:14
    B2  host: freemqtt_bnode-2  port: 9200  running  uptime 0 days, 08:59:15

A-Node List:
    A1  host: freemqtt_anode-1 running  uptime 0 days, 08:59:14
    A2  host: freemqtt_anode-2 running  uptime 0 days, 08:59:14
    A3  host: freemqtt_anode-3 running  uptime 0 days, 08:59:14

A-Node Metrics:
    A1: apps = 2  clients = 2  received = 5  sent = 289  retains = 0  subs = 1  share_subs = 0  timestamp = 1779464062
    A2: apps = 2  clients = 2  received = 6  sent = 282  retains = 0  subs = 1  share_subs = 0  timestamp = 1779464062
    A3: apps = 2  clients = 2  received = 5  sent = 288  retains = 0  subs = 1  share_subs = 0  timestamp = 1779464062