備份轉(zhuǎn)載金總的Note
概述
本文描述了在 Linux 服務器上部署 example broker 上的相關過程及步驟, 為運維及開發(fā)人員提供參考濒募。
example broker
example broker 是一款使用 Java 編寫的 Mqtt 服務器。能夠為符合 Mqtt 規(guī)范的客戶端提供基于 Mqtt 的消息訂閱, 發(fā)送服務颁督。example broker 對于 Java 版本有著嚴格的要求单雾,只能運行在 Java 8 或是以上版本, 不提供向下兼容赚哗。
操作系統(tǒng)
example broker 并未在 Windows 平臺上進行過測試,因此建議生產(chǎn)環(huán)境部署在 Linux硅堆。以下相關的命令都是基于 Cent OS X86_64 版本, 部分命令可能需要 root 權限屿储。
內(nèi)核參數(shù)
為了保證 example broker 能夠達到要求的連接數(shù), 因此需要對內(nèi)核參數(shù)進行如下的修改, 來支撐大量的 tcp/ip 連接(大于等于 500,000)。
系統(tǒng)文件數(shù)
運行 cat /etc/security/limits.conf
查看操作系統(tǒng)當前允許打開的最大文件數(shù)硬萍,確認運行 example broker 的用戶能夠打開 500,000 以上的文件, (建議修改為 1,000,000) 以下的配置示例是允許所有用戶修改文件數(shù)的值為 1,048,576:
* soft nofile 1048576
* hard nofile 1048576
其中的 *
代表影響系統(tǒng)所有用戶, 可以根據(jù)實際需要修改為運行 example broker 的用戶扩所。soft
對應的為警告值, 而 hard
則是真正起作用的限制值。
運行 sysctl -a | grep file
查看 fs.file-max
的值應符合 1,000,000 左右的數(shù)值, 并小于上面提及的允許修改數(shù), 這個數(shù)字將會影響整個操作系統(tǒng)能夠打開的最大文件數(shù)朴乖。
啟動 example broker 之前, 在當前 shell 中執(zhí)行 ulimit -n 1000000
使當前會話中允許打開的最大文件數(shù)設置生效。具體會在啟動 example broker 部分進行介紹助赞。
TCP/IP 及網(wǎng)絡相關參數(shù)
執(zhí)行 lsmod | grep nf_conntrack_ipv4
查看系統(tǒng)是否啟用 firewalld service买羞。
由于 tcp/ip 連接數(shù)上升后會造成 防火墻的相關功能及日志寫入的工作量上升, 從而影響 tcp/ip 請求的正常連接, 因此現(xiàn)階段的臨時解決方案使關閉防火墻 服務。在實際生產(chǎn)環(huán)境的解決措施仍待考慮雹食。執(zhí)行 systemctl stop firewalld
, 然后再次執(zhí)行 lsmod | grep nf_conntrack_ipv4
查看服務是否已經(jīng)關閉畜普。
tcp/ip 的 backlog 參數(shù)也會影響 tcp/ip 的連接速度及穩(wěn)定性, 因此可以執(zhí)行以下命令, 將參數(shù)設置為 4096(參考值)。
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
所需軟件
在部署和使用 example broker 前群叶,請按照如下步驟安裝所需的軟件吃挑,并確認軟件安裝正確。
Java
請執(zhí)行 java -version
確認服務器上是否安裝 Java, 或是已經(jīng)安裝的 Java 版本街立。如前文所述, example broker 依賴 Java 8 或是以上版本, 如果服務器現(xiàn)有 Java 的版本較低舶衬,請更新至所需的高版本。
在同一個操作系統(tǒng)上存在多個版本 Java 時容易引起一些不必要的麻煩赎离,或是由于環(huán)境變量等因素額外增加不必要的工作, 因此我們推薦安裝 jEnv 來管理不同版本的 Java逛犹。具體的安裝過程請參考官方網(wǎng)站, 本文不再贅述。
Kafka
example broker 依賴 Kafka 消息中間件來完成 mqtt 消息的訂閱-發(fā)布功能, 因此請確認 kafka 服務器的聯(lián)通性和可用性正常。
Redis
Redis 負責 mqtt 相關消息的存儲功能, 因此在運行 example broker 時確認連接的 redis 能夠正常工作虽画。
安裝 example broker
example broker 本身為 jar 包, 且包含了運行所需的所有依賴類庫舞蔽。因此只需要上傳至用戶安裝所需的目錄即可,無需額外的特殊操作码撰。
運行
使用原生的 java
命令即可運行 example broker 服務渗柿。但是為了便捷, 我們建議編寫一個獨立的 shell 腳本來完成該項工作。以下是一個運行 example broker 的示例腳本脖岛。
#!/bin/bash
ulimit -n 1000000
JAVA_OPTS="-server -Xms4048M -Xmx4048M -Xmn400M -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote.port=9988 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.1"
nohup java $JAVA_OPTS -jar example-broker-0.0.1-SNAPSHOT-uber.jar server config.yaml&
首先腳本使用 ulimit -n 1000000
來設置本次 shell session 運行的進程允許最多打開 1,000,000 個文件句柄做祝。
腳本中的 JAVA_OPTS
參數(shù)定義了啟動 Java 虛擬機所需的相關參數(shù)。在示例中我們定義了以 server
模式啟動 JVM, 同時定義了Java Heap 部分的最大, 最小內(nèi)存都為 4048MB, 且最小內(nèi)存為 400MB鸡岗。其余的 JVM 參數(shù)請參考對應的用戶手冊, 并根據(jù)實際要求要添加或是修改混槐。
其中需要特別指出的是 JMX 相關的參數(shù)設置, 啟用了 JMX 的監(jiān)測服務, 允許用戶在系統(tǒng)運行階段使用 JMX 客戶端進行連接, 從而實時監(jiān)控系統(tǒng)的運行參數(shù)。
腳本中的剩余部分即為使用后臺運行模式來運行 example broker 程序轩性。
驗證
在運行 example broker 后, 請使用以下的方式來驗證 example broker 是否正常運行声登。
使用 tail
命令查看 example broker 的日志輸出, 查看是否正常啟動, 或在啟動過程中是否出現(xiàn)異常信息。
使用 jps
命令查看是否存在 example broker 對應的進程揣苏。
在條件允許的情況下, 可以使用第三方的 mqtt 客戶端對 example broker 進行簡單的功能性測試悯嗓。
Trouble Shooting
按照本文的上述配置, 在內(nèi)網(wǎng)環(huán)境的同一個網(wǎng)段上, 部署單個 example broker 在雙核 8G 內(nèi)存的服務器, 可以輕松的達到 500,000 的長連接數(shù)。如果在部署過程中遇到問題, 或是無法達到預期的性能請參考以下的流程進行排查卸察。
- 確認操作系統(tǒng)的文件句柄數(shù)已經(jīng)調(diào)整, 且大于需要承載的連接數(shù)脯厨。
- 確認 Linux 的 iptables 服務已經(jīng)關閉。
- example broker 依賴的 Kafka 和 Redis 服務能夠正常工作坑质。
- Linux 上安裝的 Java 版本正確合武。
- 啟動 example broker 的命令正確。