備份轉(zhuǎn)載金總的Note
概述
本文描述了在 Linux 服務(wù)器上部署 example broker 上的相關(guān)過(guò)程及步驟, 為運(yùn)維及開(kāi)發(fā)人員提供參考。
example broker
example broker 是一款使用 Java 編寫(xiě)的 Mqtt 服務(wù)器。能夠?yàn)榉?Mqtt 規(guī)范的客戶端提供基于 Mqtt 的消息訂閱, 發(fā)送服務(wù)。example broker 對(duì)于 Java 版本有著嚴(yán)格的要求,只能運(yùn)行在 Java 8 或是以上版本, 不提供向下兼容。
操作系統(tǒng)
example broker 并未在 Windows 平臺(tái)上進(jìn)行過(guò)測(cè)試,因此建議生產(chǎn)環(huán)境部署在 Linux。以下相關(guān)的命令都是基于 Cent OS X86_64 版本, 部分命令可能需要 root 權(quán)限。
內(nèi)核參數(shù)
為了保證 example broker 能夠達(dá)到要求的連接數(shù), 因此需要對(duì)內(nèi)核參數(shù)進(jìn)行如下的修改, 來(lái)支撐大量的 tcp/ip 連接(大于等于 500,000)。
系統(tǒng)文件數(shù)
運(yùn)行 cat /etc/security/limits.conf 查看操作系統(tǒng)當(dāng)前允許打開(kāi)的最大文件數(shù),確認(rèn)運(yùn)行 example broker 的用戶能夠打開(kāi) 500,000 以上的文件, (建議修改為 1,000,000) 以下的配置示例是允許所有用戶修改文件數(shù)的值為 1,048,576:
* soft nofile 1048576
* hard nofile 1048576
其中的 * 代表影響系統(tǒng)所有用戶, 可以根據(jù)實(shí)際需要修改為運(yùn)行 example broker 的用戶。soft 對(duì)應(yīng)的為警告值, 而 hard 則是真正起作用的限制值。
運(yùn)行 sysctl -a | grep file 查看 fs.file-max 的值應(yīng)符合 1,000,000 左右的數(shù)值, 并小于上面提及的允許修改數(shù), 這個(gè)數(shù)字將會(huì)影響整個(gè)操作系統(tǒng)能夠打開(kāi)的最大文件數(shù)。
啟動(dòng) example broker 之前, 在當(dāng)前 shell 中執(zhí)行 ulimit -n 1000000 使當(dāng)前會(huì)話中允許打開(kāi)的最大文件數(shù)設(shè)置生效。具體會(huì)在啟動(dòng) example broker 部分進(jìn)行介紹。
TCP/IP 及網(wǎng)絡(luò)相關(guān)參數(shù)
執(zhí)行 lsmod | grep nf_conntrack_ipv4 查看系統(tǒng)是否啟用 firewalld service。
由于 tcp/ip 連接數(shù)上升后會(huì)造成 防火墻的相關(guān)功能及日志寫(xiě)入的工作量上升, 從而影響 tcp/ip 請(qǐng)求的正常連接, 因此現(xiàn)階段的臨時(shí)解決方案使關(guān)閉防火墻 服務(wù)。在實(shí)際生產(chǎn)環(huán)境的解決措施仍待考慮。執(zhí)行 systemctl stop firewalld, 然后再次執(zhí)行 lsmod | grep nf_conntrack_ipv4 查看服務(wù)是否已經(jīng)關(guān)閉。
tcp/ip 的 backlog 參數(shù)也會(huì)影響 tcp/ip 的連接速度及穩(wěn)定性, 因此可以執(zhí)行以下命令, 將參數(shù)設(shè)置為 4096(參考值)。
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
所需軟件
在部署和使用 example broker 前,請(qǐng)按照如下步驟安裝所需的軟件,并確認(rèn)軟件安裝正確。
Java
請(qǐng)執(zhí)行 java -version 確認(rèn)服務(wù)器上是否安裝 Java, 或是已經(jīng)安裝的 Java 版本。如前文所述, example broker 依賴 Java 8 或是以上版本, 如果服務(wù)器現(xiàn)有 Java 的版本較低,請(qǐng)更新至所需的高版本。
在同一個(gè)操作系統(tǒng)上存在多個(gè)版本 Java 時(shí)容易引起一些不必要的麻煩,或是由于環(huán)境變量等因素額外增加不必要的工作, 因此我們推薦安裝 jEnv 來(lái)管理不同版本的 Java。具體的安裝過(guò)程請(qǐng)參考官方網(wǎng)站, 本文不再贅述。
Kafka
example broker 依賴 Kafka 消息中間件來(lái)完成 mqtt 消息的訂閱-發(fā)布功能, 因此請(qǐng)確認(rèn) kafka 服務(wù)器的聯(lián)通性和可用性正常。
Redis
Redis 負(fù)責(zé) mqtt 相關(guān)消息的存儲(chǔ)功能, 因此在運(yùn)行 example broker 時(shí)確認(rèn)連接的 redis 能夠正常工作。
安裝 example broker
example broker 本身為 jar 包, 且包含了運(yùn)行所需的所有依賴類庫(kù)。因此只需要上傳至用戶安裝所需的目錄即可,無(wú)需額外的特殊操作。
運(yùn)行
使用原生的 java 命令即可運(yùn)行 example broker 服務(wù)。但是為了便捷, 我們建議編寫(xiě)一個(gè)獨(dú)立的 shell 腳本來(lái)完成該項(xiàng)工作。以下是一個(gè)運(yùn)行 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 來(lái)設(shè)置本次 shell session 運(yùn)行的進(jìn)程允許最多打開(kāi) 1,000,000 個(gè)文件句柄。
腳本中的 JAVA_OPTS 參數(shù)定義了啟動(dòng) Java 虛擬機(jī)所需的相關(guān)參數(shù)。在示例中我們定義了以 server 模式啟動(dòng) JVM, 同時(shí)定義了Java Heap 部分的最大, 最小內(nèi)存都為 4048MB, 且最小內(nèi)存為 400MB。其余的 JVM 參數(shù)請(qǐng)參考對(duì)應(yīng)的用戶手冊(cè), 并根據(jù)實(shí)際要求要添加或是修改。
其中需要特別指出的是 JMX 相關(guān)的參數(shù)設(shè)置, 啟用了 JMX 的監(jiān)測(cè)服務(wù), 允許用戶在系統(tǒng)運(yùn)行階段使用 JMX 客戶端進(jìn)行連接, 從而實(shí)時(shí)監(jiān)控系統(tǒng)的運(yùn)行參數(shù)。
腳本中的剩余部分即為使用后臺(tái)運(yùn)行模式來(lái)運(yùn)行 example broker 程序。
驗(yàn)證
在運(yùn)行 example broker 后, 請(qǐng)使用以下的方式來(lái)驗(yàn)證 example broker 是否正常運(yùn)行。
使用 tail 命令查看 example broker 的日志輸出, 查看是否正常啟動(dòng), 或在啟動(dòng)過(guò)程中是否出現(xiàn)異常信息。
使用 jps 命令查看是否存在 example broker 對(duì)應(yīng)的進(jìn)程。
在條件允許的情況下, 可以使用第三方的 mqtt 客戶端對(duì) example broker 進(jìn)行簡(jiǎn)單的功能性測(cè)試。
Trouble Shooting
按照本文的上述配置, 在內(nèi)網(wǎng)環(huán)境的同一個(gè)網(wǎng)段上, 部署單個(gè) example broker 在雙核 8G 內(nèi)存的服務(wù)器, 可以輕松的達(dá)到 500,000 的長(zhǎng)連接數(shù)。如果在部署過(guò)程中遇到問(wèn)題, 或是無(wú)法達(dá)到預(yù)期的性能請(qǐng)參考以下的流程進(jìn)行排查。
- 確認(rèn)操作系統(tǒng)的文件句柄數(shù)已經(jīng)調(diào)整, 且大于需要承載的連接數(shù)。
- 確認(rèn) Linux 的 iptables 服務(wù)已經(jīng)關(guān)閉。
- example broker 依賴的 Kafka 和 Redis 服務(wù)能夠正常工作。
- Linux 上安裝的 Java 版本正確。
- 啟動(dòng) example broker 的命令正確。