集群方式接受
Erlang/OTP 最初是愛立信為開發電信設備系統設計的編程語言平台,電信設備(路由器、接入網關、…)典型設計是通過背板連接主控板卡與多塊業務板卡的分布式系統。 Erlang/OTP 語言平台的分布式程序,由分布互聯的 Erlang 運行系統組成,每個 Erlang 運行系統被稱為節點(Node),節點(Node) 間通過 TCP 互聯,消息傳遞的方式通信:
EMQ 消息服務器集群基於 Erlang/OTP 分布式設計,集群原理可簡述為下述兩條規則:
- MQTT 客戶端訂閱主題時,所在節點訂閱成功后廣播通知其他節點:某個主題(Topic)被本節點訂閱。
- MQTT 客戶端發布消息時,所在節點會根據消息主題(Topic),檢索訂閱並路由消息到相關節點。
EMQ 消息服務器同一集群的所有節點,都會復制一份主題(Topic) -> 節點(Node)映射的路由表,例如:
topic1 -> node1, node2 topic2 -> node3 topic3 -> node2, node4
EMQ集群方式分別有以下方式:
- manual 手工命令創建集群
- static 靜態節點列表自動集群
- mcast UDP 組播方式自動集群
- dns DNS A 記錄自動集群
- etcd 通過 etcd 自動集群
- k8s Kubernetes 服務自動集群
為了方便我們這里使用static方式關聯節點為列講解
已經搭建了兩台EMQ,內網IP分別是192.168.2.111和192.168.2.112(centos7上)
首先需要修改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']}]
通過界面可以看到如下顯示
總結
有了集群就解決了大規模部署的問題,但是在實際使用中還有很多需要關注的點