emq作為一個mqtt的消息broker,可以通過它的相關學習,一方面掌握emq本身的一些功能點,另一方面對於集群系統也有一個更好的了解,Mark起來
說明emqx的配置文件主要由主配置文件etc/emqx.conf以及各種插件配置文件etc/plugins/*.conf組成
附上原版md文件,感興趣的可以在此基礎上編輯https://files.cnblogs.com/files/marshwinter/emqx.rar
一、幾個默認端口
1883: MQTT protocol
8883: MQTT/SSL Protocol
8083: MQTT/WebSocket Protocol
8080: HTTP API
18083: Dashboard Interface
修改etc/emqx.conf里面的這幾項
listener.tcp.external = 0.0.0.0:1883
listener.ssl.external = 8883
listener.ws.external = 8083
以及etc/plugins/emqx_management.conf
management.listener.http = 8080
以及etc/plugins/emqx_dashboard.conf里面的這幾項
dashboard.listener.http = 18083
注意:emqx中TCP端口4369被epmd(Erlang Port Mapper Daemon,守護進程服務,管理節點名到機器地址的映射)占用,所以單機部署兩個emqx這種騷操作應該是不可行的,目前沒發現哪里可以配置這個端口號。
二、Erlang VM配置
在emqx.conf中影響emq的最大連接數
node.process_limit:VM的進程數量,一個連接需要兩個進程
node.max_ports:VM的最大端口數,一個連接需要一個端口
注:在 Erlang 虛擬機中的 Port 概念並不是 TCP 端口,可以近似的理解為文件句柄
三、cluster集群相關概念(可以作為理解其他集群系統的很好的范本)
集群的概念:一組軟硬件協同完成一項任務,並且軟硬件通過計算機網絡進行通訊。從外部來看,集群被當做一個整體,並且提供某項服務。服務的享受着不需要關心集群內部是交互的細節。集群中能夠提供服務的最小的軟硬件單元組合稱為節點(Node)
集群的幾個主要優勢:
- 高可用:單節點的損壞並不會導致整個服務的不可用
- 負載均衡:通過引入負載均衡服務,集群中的節點不會過載
- 高性能:相比單機部署,多節點的 EMQ X 集群能夠成倍的提升整個系統的連接和消息處理能力。
- 可擴展性:通過添加節點無需停機的方式來完成擴容
emqx集群中相關概念
節點
emqx集群中的相關節點由唯一節點名做區分,形式為 name@node ,其中 name 由用戶決定, node由ip地址或者FQDN(Full Qualified Domain Name)決定,例子
emqx1@192.168.1.165
emqx2@broker1.emqx.io
節點間的通訊方式
這里就直接摘用原文了
EMQ X cluster uses epmd to map the node name to TCP port. If there is firewall on the network please make sure the communication among nodes is allowed.
EMQ X uses magic cookie of Erlang/OTP to verify if the nodes belong to a same cluster. Nodes of a cluster should have same cookie.
The cluster internal connection can be TCPv4 or TCPv6, TLS is supported
集群中的消息處理方式
單個mqtt客戶端只能連接到集群中的某個節點上,消息處理歸納為兩點
- 客戶端在某個節點上訂閱到某條消息的時候會被告知到集群的所有節點
- 當某個主題下的消息被發布的時候,會被轉發到所有有訂閱該主題的客戶端的節點上(根據主題樹和路由表)
所有節點都有一份路由表和主題樹的拷貝,路由表的每一項由主題和節點構成,類似於
--------------------------
| t |
| / \ |
| + # |
| / \ |
| x y |
--------------------------
| t/+/x -> node1, node3 |
| t/+/y -> node1 |
| t/# -> node2 |
| t/a -> node3 |
--------------------------
另外具體某個節點上某個主題被哪個客戶端訂閱的信息則由節點本地保存
四、集群建立方式
-
手工方式(以下參數均在emqx.conf中配置)
-
1.設置節點名(配置項名稱為node.name),emqx@s1.emqx.io(emq@192.168.0.10), emqx@s2.emqx.io(emq@192.168.0.20),
2.設置集群cookie, emqx使用cookie來確認同一集群中的節點,同一集群中的節點必須使用相同的cookie,設置
node.cookie = emqxsecretcookie
3.設置集群發現方式為手動 cluster.discovery = manual
4.利用命令行工具在s1上運行emqx_ctl cluster join emq@s2.emqx.io
5.查詢集群的相關狀態,emqx_ctl cluster status
6.節點移除以及退出則直接查看emqx_ctl命令行工具的提示即可 -
自動集群方式(以下參數均在emqx.conf中配置)
1、 簡介:emqx使用Ekka來實現集群節點自動發現,支持以下幾種策略:
- static : 使用靜態節點列表
- mcast : 使用UDP組播
- dns : 使用DNS記錄
- etcd : 使用etcd服務
- k8s : 使用Kubernetes服務
同時結合Ekka,還提供了自動腦裂愈合以及自動移除宕機節點的功能(貌似是個集群都會有的這兩個功能)
static方式:
不需要任何其他網絡組件或服務,也不需要網絡支持網絡IP組播只需,node間只需要可以通過TCP訪問即可
同時所有集群節點配置一個完全一樣的節點列表
配置集群方式和節點列表即可
集群方式cluster.discovery = static
cluster.static.seeds 配置項為集群列表。列表中的節點名遵從name@host的格式,各個節點名以逗號(,)分隔。
配置完成后,啟動各節點即可
其他幾種方式,目前用不到,用到的話可以翻看手冊,鏈接
https://docs.emqx.io/tutorial/v3/en/cluster
五、負載均衡配置
為集群配置負載均衡(LB, Load Balancer),主要作用就是平衡網絡組件的負載,最小化系統響應時間,最大化服務能力,優化資源利用。對於集群,雖然LB不是必須的,但能給整個系統帶來額外的性能,因此經常在集群前面提供一個LB。使用負載可以通過雲服務商提供的,或者開源的Nginx或者HAproxy
六、Mqtt協議配置
主要用來配置協議的相關參數
在emqx.conf的## MQTT Protocol模塊下
mqtt.max_clientid_len:客戶端id長度限制
mqtt.max_packet_size:單個包大小
mqtt.keepalive_backoff:mqtt協議的keepalive參數的補償,和mqtt協議的連接超時有關,如果'Keepalive * backoff * 2'這么長的時間里面客戶端沒有響應,則emqx斷開此鏈接
七、zone配置
emq支持基於zone的listener組,根據不同的zone配置不同的選項,多個listener隸屬於一個zone,當客戶端屬於某個zone的時候,客戶端匹配該zone中的選項。格式為zone.$name.configItem,具體配置參見https://docs.emqx.io/tutorial/v3/cn/config/zone.html
八、listener配置
listener是emq打開和監聽的用來支持相關協議(包括tcp|ssl|ws|wss)的端口,
listener.$protocol.$name = IP:Port 配置監聽的端口
listener.tcp.external.zone = zoneName 配置此端口隸屬於哪個zone
九、會話以及節點配置
默認就好
十、插件配置
emq基礎協議層之外的大多數功能都是通過插件的形式實現的,所有插件都要有一個同名的,以.conf結尾的配置文件
plugins.etc_dir = etc/plugins/ #配置插件配置文件目錄
plugins.loaded_file = data/loaded_plugins #配置啟動時加載的插件的名字
十一、流控
emq可以從連接以及發布層面進行速率限制,避免因為客戶端的頻繁上下線以及單個客戶端無限制發布消息造成服務器波動
1.字節流限制
每項配置的值為 rate,burst 組合,單位是 Bps,超限的連接將掛起,默認不啟用該配置:
rate: 每秒連接速率;
burst: 每秒連接報文大小;
listener.tcp.external.rate_limit = 1024,4096 :配置 external 域下 TCP 連接速率;
2.連接速率限制
每秒最大連接數,超限將掛起連接
listener.tcp.external.max_conn_rate = 1000 : 配置 external 域下 TCP 連接速率;
3.PUB 速率限制
配置項為 rate,timerange 組合,時間范圍支持s,m,h。
zone.external.publish_limit = 10,1m :配置 external 域下每個客戶端 PUB 速率限制。
這幾項看了文檔也不是很清楚,尤其是第三項本地設置之后完全沒有限制啊???
十二、共享訂閱
兩種主題方式
Topic Prefix | Examples
-----------------------------------------------------
$queue/:topic | sub $queue/up/data
$share/:group/:topic | sub $share/group/up/data
十三、代理訂閱功能
給客戶端代理訂閱一些主題,有代理訂閱模塊,rest api方式等實現手段
十四、橋接
可以用來銜接其他消息隊列服務,如Kafaka