EMQ百萬級MQTT消息服務(分佈式集羣)

在強大的單機也比不上集羣,EMQ的集羣模式很粗暴,只須要把EMQ服務關聯在一塊兒而後負載均衡就能夠達到集羣的效果,這樣就算面對1000CK問題也迎刃而解html

附上:node

喵了個咪的博客:w-blog.cn EMQ官方地址:http://emqtt.com/ EMQ中文文檔:http://emqtt.com/docs/v2/guide.html編程

1.集羣方式接受

Erlang/OTP 最初是愛立信爲開發電信設備系統設計的編程語言平臺,電信設備(路由器、接入網關、…)典型設計是經過背板鏈接主控板卡與多塊業務板卡的分佈式系統。 Erlang/OTP 語言平臺的分佈式程序,由分佈互聯的 Erlang 運行系統組成,每一個 Erlang 運行系統被稱爲節點(Node),節點(Node) 間經過 TCP 互聯,消息傳遞的方式通訊:vim

---------         ---------
| Node1 | --------| Node2 |
---------         ---------
    |     \     /    |
    |       \ /      |
    |       / \      |
    |     /     \    |
---------         ---------
| Node3 | --------| Node4 |
---------         ---------

EMQ 消息服務器集羣基於 Erlang/OTP 分佈式設計,集羣原理可簡述爲下述兩條規則:安全

  • MQTT 客戶端訂閱主題時,所在節點訂閱成功後廣播通知其餘節點:某個主題(Topic)被本節點訂閱。
  • MQTT 客戶端發佈消息時,所在節點會根據消息主題(Topic),檢索訂閱並路由消息到相關節點。

EMQ 消息服務器同一集羣的全部節點,都會複製一份主題(Topic) -> 節點(Node)映射的路由表,例如:bash

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

EMQ集羣方式分別有如下方式:服務器

  • manual 手工命令建立集羣
  • static 靜態節點列表自動集羣
  • mcast UDP 組播方式自動集羣
  • dns DNS A 記錄自動集羣
  • etcd 經過 etcd 自動集羣
  • k8s Kubernetes 服務自動集羣

爲了方便咱們這裏使用static方式關聯節點cookie

2.集羣搭建

這裏已經基於Centos7.4搭建而且調優好了兩臺EMQ,內網IP分別是192.168.2.111和192.168.2.112負載均衡

首先須要修改Node名稱編程語言

vim /usr/local/emqttd/etc/emq.conf

node.name = emq@192.168.2.111

> emqttd_ctl status
Node 'emq@192.168.2.111' is started
emqttd 2.3.5 is running

修改配置文件配置使用靜態方式連接節點(全部節點都須要修改)

> vim /usr/local/emqttd/etc/emq.conf 

cluster.discovery = static

##--------------------------------------------------------------------
## Cluster with static node list
cluster.static.seeds = emq@192.168.2.111,emq@192.168.2.112

爲了安全Erlang 節點間經過一個相同的 cookie 進行互連認證。Erlang 節點 Cookie 設置:

# 在node1上執行
> emqttd stop
> emqttd start
> scp $HOME/.erlang.cookie root@192.168.2.112:$HOME/.erlang.cookie

經過命令查看集羣狀態

> emqttd_ctl cluster status

Cluster status: [{running_nodes,['emq@192.168.2.111','emq@192.168.2.112']}]

經過界面能夠看到以下顯示

3 總結

有了集羣就解決了大規模部署的問題,可是在實際使用中還有不少須要關注的點,在下一節將介紹用戶體系和ACL鑑權

注:筆者能力有限有說的不對的地方但願你們可以指出,也但願多多交流!

相關文章
相關標籤/搜索