EMQ集群功能

分布集群 (Clustering)

 

注:大部分是摘自EMQ官网,部分根据自己的实践进行完善

 

EMQ R2 分布集群设计

EMQ 消息服务器集群基于 Erlang/OTP 分布式设计,集群原理可简述为下述两条规则:

  1. MQTT 客户端订阅主题时,所在节点订阅成功后广播通知其他节点:某个主题(Topic)被本节点订阅。
  2. MQTT 客户端发布消息时,所在节点会根据消息主题(Topic),检索订阅并路由消息到相关节点。

EMQ 消息服务器同一集群的所有节点,都会复制一份主题(Topic) -> 节点(Node)映射的路由表,例如:

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

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

EMQ 消息服务器每个集群节点,都保存一份主题树(Topic Trie)和路由表。

例如下述主题订阅关系:

客户端节点订阅主题
client1node1t/+/x, t/+/y
client2node2t/#
client3node3t/+/x, t/a

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

--------------------------
|             t          |
|            / \         |
|           +   #        |
|         /  \           |
|       x      y         |
--------------------------
| t/+/x -> node1, node3  |
| t/+/y -> node1         |
| t/#   -> node2         |
| t/a   -> node3         |
--------------------------

订阅(Subscription)与消息派发

客户端的主题订阅(Subscription)关系,只保存在客户端所在节点,用于本节点内派发消息到客户端。

例如client1向主题’t/a’发布消息,消息在节点间的路由与派发流程:

title: Message Route and Deliver

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

_images/route.png

假设部署两台服务器 s1.emqtt.io, s2.emqtt.io 上部署集群:

节点名主机名(FQDN)IP 地址
emq@s1.emqtt.io 或 emq@192.168.0.10s1.emqtt.io192.168.0.10
emq@s2.emqtt.io 或 emq@192.168.0.20s2.emqtt.io192.168.0.20

警告

节点名格式: Name@Host, Host必须是IP地址或FQDN(主机名.域名)

emq@s1.emqtt.io 节点设置

emqttd/etc/emq.conf:

node.name = emq@s1.emqtt.io

或

node.name = emq@192.168.0.10

也可通过环境变量:

export EMQ_NODE_NAME=emq@s1.emqtt.io && ./bin/emqttd start

警告

节点启动加入集群后,节点名称不能变更。

emq@s2.emqtt.io 节点设置

emqttd/etc/emq.conf:

node.name = emq@s2.emqtt.io

或

node.name = emq@192.168.0.20

节点加入集群

注意:

EMQ 节点集群使用的 TCP 端口:

4369    集群节点发现端口
6369    集群节点控制通道
集群节点间如有防护墙,需开启上述 TCP 端口互访权限。

 

启动两台节点后,emq@s2.emqtt.io 上执行:

$ ./bin/emqttd_ctl cluster join emq@s1.emqtt.io

Join the cluster successfully.
Cluster status: [{running_nodes,['emq@s1.emqtt.io','emq@s2.emqtt.io']}]

或,emq@s1.emqtt.io 上执行:

$ ./bin/emqttd_ctl cluster join emq@s2.emqtt.io

Join the cluster successfully.
Cluster status: [{running_nodes,['emq@s1.emqtt.io','emq@s2.emqtt.io']}]

任意节点上查询集群状态:

$ ./bin/emqttd_ctl cluster status

Cluster status: [{running_nodes,['emq@s1.emqtt.io','emq@s2.emqtt.io']}]

节点退出集群

节点退出集群,两种方式:

  1. leave: 本节点退出集群
  2. remove: 从集群删除其他节点

emq@s2.emqtt.io 主动退出集群:

$ ./bin/emqttd_ctl cluster leave

或 emq@s1.emqtt.io 节点上,从集群删除 emq@s2.emqtt.io 节点:

$ ./bin/emqttd_ctl cluster remove emq@s2.emqtt.io
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
集成Spring Boot和EMQ X集群的具体逻辑可以包括以下几个步骤: 1. 添加依赖:首先,确保你的Spring Boot项目已经添加了EMQ X相关的依赖。这通常通过在项目的`pom.xml`文件中添加相应的依赖项来完成。 2. 配置连接:在Spring Boot项目中,你需要配置与EMQ X集群的连接。这通常涉及设置MQ连接参数,如主机名、端口、用户名和密码等。这些配置通常在项目的`application.properties`或`application.yml`文件中进行。 3. 创建消息生产者:在Spring Boot项目中,你需要创建一个消息生产者来将消息发送到EMQ X集群。这可以通过使用Spring的`MessageProducer`接口来实现。你可以使用Spring的AMQP(高级消息队列协议)支持来与EMQ X通信。 4. 创建消息接收者:在Spring Boot项目中,你需要创建一个消息接收者来从EMQ X集群接收消息。这可以通过实现`MessageListener`接口并注册监听器来实现。你可以在接收者中处理接收到的消息,并将其传递给应用程序的其他部分。 5. 集成负载均衡:如果你的EMQ X集群有多个节点,你可能需要集成负载均衡来确保消息被均匀地分发到各个节点上。你可以使用Spring Boot的负载均衡功能来实现这一点,例如使用`Ribbon`库来提供负载均衡支持。 6. 测试集成:完成上述步骤后,你可以通过测试来验证Spring Boot与EMQ X集群的集成是否正常工作。你可以发送消息并验证它们是否被正确地接收和处理。 总的来说,集成Spring Boot和EMQ X集群涉及配置连接、创建生产者和接收者、集成负载均衡以及进行测试。具体的实现细节可能因你的项目结构和需求而有所不同,但上述步骤提供了一个基本的框架来指导你进行集成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值