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]
以上节点,请参阅如下章节准备,
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客户端
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
没有评论