如何部署EMQX(MQTT)社区版集群?

MQTT

1 基础知识

1.1 Erang/OTP分布式编程

1.1.1 Erang/OTP分布式编程简介

– Erlang/OTP最初是爱立信为开发电信设备系统设计的编程语言平台
– Erlang/OTP用于电信设备(路由器、接入网关等)典型设计是通过背板连接主控板卡与多块业务板卡的分布式系统
– Erlang/OTP语言平台的分布式程序,由分布互联的Erlang运行系统组成
– Erlang单个运行系统被称为节点(Node),节点(Node)间通过TCP互联,消息传递的方式通信。

1.1.2 Erang节点


– Erlang节点由唯一的节点名称标识,节点间通过名称进行通信寻址。
– 例如在本机启动四个Erlang节点,节点名称如下,

erl -name node1@127.0.0.1
erl -name node2@127.0.0.1
erl -name node3@127.0.0.1
erl -name node4@127.0.0.1

– 节点1在控制台下建立与其他节点的连接,

(node1@127.0.0.1)1> net_kernel:connect_node('node2@127.0.0.1').
true
(node1@127.0.0.1)2> net_kernel:connect_node('node3@127.0.0.1').
true
(node1@127.0.0.1)3> net_kernel:connect_node('node4@127.0.0.1').
true
(node1@127.0.0.1)4> nodes().
['node2@127.0.0.1','node3@127.0.0.1','node4@127.0.0.1']

1.2 EMQX分布集群

– EMQX消息服务器集群基于Erlang/OTP分布式设计
– MQTT客户端订阅主题时,所在节点订阅成功后广播通知其他节点:某个主题(Topic)被本节点订阅。
– MQTT客户端发布消息时,所在节点会根据消息主题(Topic),检索订阅并路由消息到相关节点。
– EMQX 消息服务器同一集群的所有节点,都会复制一份主题(Topic) -> 节点(Node)映射的路由表,例如:

topic1 -> node1, node2
topic2 -> node3
topic3 -> node2, node4

1.3 主题树(Topic Trie)与路由表(Route Table)

– EMQX消息服务器每个集群节点,都保存一份主题树(Topic Trie)和路由表。例如下述主题订阅关系:

客户端 节点 订阅主题
client1 node1 t/+/x, t/+/y
client2 node2 t/#
client3 node3 t/+/x, t/a

最终会生成如下主题树(Topic Trie)和路由表(Route Table):

1.4 订阅(Subscription)与消息派发

客户端的主题订阅(Subscription)关系,只保存在客户端所在节点,用于本节点内派发消息到客户端。
例如client1向主题’t/a’发布消息,消息在节点间的路由与派发流程:

title: Message Route and Deliver

client1 -> node1: Publish[t/a]
    node1 --> node2: Route[t/#]
        node2 --> client2: Deliver[t/#]
    node1 --> node3: Route[t/a]
        node3 --> client3: Deliver[t/a]

1.5 节点发现与自动集群

– EMQX 支持基于 Ekka 库的集群自动发现 (Autocluster)。
– Ekka是为Erlang/OTP应用开发的集群管理库。
– Ekka支持Erlang节点自动发现(Service Discovery)
– Ekka支持Erlang节点自动集群 (Autocluster)
– Ekka支持Erlang节点网络分区自动愈合 (Network Partition Autoheal)
– Ekka支持Erlang节点自动删除宕机节点 (Autoclean)
– EMQX 支持多种节点发现策略:

策略 说明
manual 手动命令创建集群
static 静态节点列表自动集群
mcast UDP 组播方式自动集群
dns DNS A 记录自动集群
etcd 通过 etcd 自动集群
k8s Kubernetes 服务自动集群

2 最佳实践

2.1 环境信息

OS = Oracle Linux 8.x x86_64
HostName = emqx0[1-3].cmdschool.org
IP Addresses = 10.168.0.22[0-2] 以上节点,请参阅如下章节准备,

如何安装部署EMQX(MQTT)社区版?

2.2 配置集群

2.2.1 开放集群所需的端口

In emqx0[1-3],

firewall-cmd --add-port=4370/tcp --permanent
firewall-cmd --add-port=5370/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all

2.2.2 修改节点1的配置

In emqx01,

cp /etc/emqx/emqx.conf /etc/emqx/emqx.conf.default
vim /etc/emqx/emqx.conf

修改如下配置,

node.name = emqx@10.168.0.220

配置修改后,你需要直行如下命令重启服务,

systemctl restart emqx

2.2.3 修改节点2的配置

In emqx02,

cp /etc/emqx/emqx.conf /etc/emqx/emqx.conf.default
vim /etc/emqx/emqx.conf

修改如下配置,

node.name = emqx@10.168.0.221

配置修改后,你需要直行如下命令重启服务,

systemctl restart emqx

2.2.4 修改节点3的配置

In emqx03,

cp /etc/emqx/emqx.conf /etc/emqx/emqx.conf.default
vim /etc/emqx/emqx.conf

修改如下配置,

node.name = emqx@10.168.0.222

配置修改后,你需要直行如下命令重启服务,

systemctl restart emqx

2.2.5 将节点2加入集群

In emqx02,

emqx_ctl cluster join emqx@10.168.0.220

如果正常可见如下提示信息,

=CRITICAL REPORT==== 13-May-2026::09:25:17.948889 ===
[EMQ X] emqx shutdown for join
Join the cluster successfully.
Cluster status: #{running_nodes => ['emqx@10.168.0.220','emqx@10.168.0.221'],
                  stopped_nodes => []}

2.2.6 将节点3加入集群

In emqx03,

emqx_ctl cluster join emqx@10.168.0.220

如果正常可见如下提示信息,

=CRITICAL REPORT==== 13-May-2026::09:25:17.948889 ===
[EMQ X] emqx shutdown for join
Join the cluster successfully.
Cluster status: #{running_nodes => ['emqx@10.168.0.220','emqx@10.168.0.221','emqx@10.168.0.222'],
                  stopped_nodes => []}

2.2.7 查看集群状态

In emqx01,

emqx_ctl cluster status

如果正常可见如下提示信息,

Cluster status: #{running_nodes =>
                      ['emqx@10.168.0.220','emqx@10.168.0.221',
                       'emqx@10.168.0.222'],
                  stopped_nodes => []}

2.3 测试集群

2.3.1 准备emqx客户端

如何安装部署Ubuntu mqttx-cli?

2.3.1 订阅主题

In emqx client,

mqttx-cli sub -t 'testtopic/#' -q 1 -h 10.168.0.220 -p 1883 'public' -v

以上是终端1订阅节点1的主题,接着打开终端2订阅节点2的主题,

mqttx-cli sub -t 'testtopic/#' -q 1 -h 10.168.0.221 -p 1883 'public' -v

接着打开终端3订阅节点3的主题,

mqttx-cli sub -t 'testtopic/#' -q 1 -h 10.168.0.222 -p 1883 'public' -v

2.3.3 发布主题

mqttx-cli pub -t 'testtopic/1' -q 1 -h 10.168.0.220 -p 1883 -m 'from MQTTX CLI'
mqttx-cli pub -t 'testtopic/1' -q 1 -h 10.168.0.221 -p 1883 -m 'from MQTTX CLI'
mqttx-cli pub -t 'testtopic/1' -q 1 -h 10.168.0.222 -p 1883 -m 'from MQTTX CLI'

正常情况下,订阅的3个终端都可以收到如下信息,

mqtt-packet: Packet {
  cmd: 'publish',
  retain: false,
  qos: 1,
  dup: false,
  length: 30,
  topic: 'testtopic/1',
  payload: ,
  messageId: 1
}, topic: testtopic/1, qos: 1, size: 14B
from MQTTX CLI

mqtt-packet: Packet {
  cmd: 'publish',
  retain: false,
  qos: 1,
  dup: false,
  length: 30,
  topic: 'testtopic/1',
  payload: ,
  messageId: 2
}, topic: testtopic/1, qos: 1, size: 14B
from MQTTX CLI

mqtt-packet: Packet {
  cmd: 'publish',
  retain: false,
  qos: 1,
  dup: false,
  length: 30,
  topic: 'testtopic/1',
  payload: ,
  messageId: 3
}, topic: testtopic/1, qos: 1, size: 14B
from MQTTX CLI

参阅文档
================
https://docs.emqx.com/zh/emqx/v4.3/getting-started/cluster.html
https://docs.emqx.com/en/emqx/v4.3/getting-started/cluster.html
https://docs.emqx.com/zh/emqx/v4.3/advanced/cluster.html
https://docs.emqx.com/en/emqx/v4.3/advanced/cluster.html

k8s部署集群
————-
https://docs.emqx.com/zh/emqx/v4.3/getting-started/install-on-k8s.html

没有评论

发表回复

MQTT
如何安装部署EMQX(MQTT)社区版?

1 MQTT基础知识 1.1 MQTT的概念 – MQTT即英文“Message Que …

MQTT
如何安装部署Ubuntu mqttx-cli?

1 前言 一个问题,一篇文章,一出故事。 笔者今天部署EMQX服务端,因为需要mqtt的客户端来测试 …

Debian-Like
如何安装部署Ubuntu mqttx图形版?

1 前言 一个问题,一篇文章,一出故事。 笔者今天部署EMQX服务端,因为需要mqtt的客户端来测试 …