方案)
后端消息隊列運維可觀測性【免費下載鏈接】KnowStreaming一站式云原生實時流數(shù)據(jù)平臺通過0侵入、插件化構(gòu)建企業(yè)級Kafka服務(wù)極大降低操作、存儲和管理實時流數(shù)據(jù)門檻項目地址https://gitcode.com/gh_mirrors/kn/KnowStreaming點擊查看免費下載Kafka 通過 JMXJava Management Extensions暴露運行指標KnowStreaming 作為實時流數(shù)據(jù)平臺需要主動連接 Broker 的 JMX 服務(wù)來完成指標采集。本指南基于開源倉庫中的官方排查文檔系統(tǒng)梳理「JMX 未開啟、JMX 配置錯誤、JMX 開啟 SSL、連接了錯誤 IP、連接了錯誤端口」五類典型異常現(xiàn)象與對應(yīng)修復(fù)方案并結(jié)合倉庫源碼講解 KnowStreaming 底層 JMX 連接機制幫助讀者快速定位并解決頁面指標缺失問題。1、背景KnowStreaming 為什么依賴 JMXKafka Broker 的運行時指標如消息吞吐、分區(qū)負載、請求時延等通過 JMX 服務(wù)暴露因此KnowStreaming會主動連接 Kafka 的 JMX 服務(wù)進行指標采集。如果我們發(fā)現(xiàn)頁面缺少指標那么可能原因之一是 Kafka 的 JMX 端口配置的有問題導(dǎo)致指標獲取失敗進而頁面沒有數(shù)據(jù)。從源碼結(jié)構(gòu)看KnowStreaming 的 JMX 連接能力由多個模塊協(xié)同完成連接封裝層km-common 的 JmxConnectorWrap 負責(zé)真正建立service:jmx:rmi:///jndi/rmi://{host}:{port}/jmxrmi連接并支持用戶名/Token 認證與 SSL 加密客戶端管理層KafkaJMXClient 以clusterPhyId brokerId為維度緩存JmxConnectorWrap實例并在集群信息含jmxProperties變化時自動重建連接端口決策層JmxConfig 負責(zé)根據(jù)元信息、頁面配置與自定義配置最終確定連接哪一個 JMX 端口與 IP。KnowStreaming 還定義了 JmxEnum-1表示「未開啟 JMX 端口」-2表示「JMX 端口未知」這兩個哨兵值在后續(xù)排查中會反復(fù)出現(xiàn)。2、異常與正常現(xiàn)象判定2.1、異?,F(xiàn)象Broker 列表的JMX PORT列出現(xiàn)紅色感嘆號則表示 JMX 連接存在異常。2.2、正?,F(xiàn)象Broker 列表的JMX PORT列出現(xiàn)綠色則表示 JMX 連接正常。判定邏輯對應(yīng)到源碼JmxConnectorWrap.checkJmxConnectionAndInitIfNeed()會先檢查jmxPort若端口為null或-1即 JmxEnum.NOT_OPEN則直接判定不可用并返回false否則嘗試創(chuàng)建連接器。連接成功即視為正常失敗則記錄methodcreateJmxConnector||...||msgjmx connect exception.類錯誤日志并返回false。創(chuàng)建連接失敗的異常日志由JmxConnectorWrap統(tǒng)一輸出形如2021-01-27 10:06:20.730 ERROR 50901 --- [ics-Thread-1-62] c.x.k.m.c.utils.jmx.JmxConnectorWrap : JMX connect exception, host:192.168.0.1 port:9999. java.rmi.ConnectException: Connection refused to host: 192.168.0.1; nested exception is:3、異因一JMX 未開啟3.1、異?,F(xiàn)象Broker 列表的JMX Port值為-1對應(yīng) Broker 的 JMX 未開啟。這正是JmxEnum.NOT_OPEN(-1)的語義當 Kafka 元信息中jmx_port為-1時KnowStreaming 判定該 Broker 未開啟 JMX不會發(fā)起連接。3.2、解決方案開啟 JMX開啟流程如下步驟 1修改 Kafka 的 bin 目錄下的kafka-server-start.sh文件# 在這個下面增加JMX端口的配置 if [ x$KAFKA_HEAP_OPTS x ]; then export KAFKA_HEAP_OPTS-Xmx1G -Xms1G export JMX_PORT9999 # 增加這個配置, 這里的數(shù)值并不一定是要9999 fiJMX_PORT的值可按實際規(guī)劃填寫例如 8099、9999 等關(guān)鍵是保持與 KnowStreaming 頁面接入集群時填寫的 JMX 端口一致。步驟 2修改 Kafka 的 bin 目錄下的kafka-run-class.sh文件# JMX settings if [ -z $KAFKA_JMX_OPTS ]; then KAFKA_JMX_OPTS-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse -Djava.rmi.server.hostname當前機器的IP fi # JMX port to use if [ $JMX_PORT ]; then KAFKA_JMX_OPTS$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port$JMX_PORT fi注意-Djava.rmi.server.hostname當前機器的IP必須替換為 KnowStreaming 實際能夠訪問到的機器 IP。若配置成127.0.0.1或錯誤的內(nèi)網(wǎng)/外網(wǎng) IP則屬于下文「異因二/異因四」的場景。步驟 3重啟 Kafka-Broker使上述配置生效。重啟后回到 KnowStreaming Broker 列表若 JMX PORT 列由-1變?yōu)榫G色則說明開啟成功。4、異因二JMX 配置錯誤4.1、異?,F(xiàn)象錯誤日志通常呈現(xiàn)兩種形態(tài)可用于區(qū)分問題歸屬# 錯誤一錯誤提示的是真實的IP這樣的話基本就是JMX配置的有問題了。 2021-01-27 10:06:20.730 ERROR 50901 --- [ics-Thread-1-62] c.x.k.m.c.utils.jmx.JmxConnectorWrap : JMX connect exception, host:192.168.0.1 port:9999. java.rmi.ConnectException: Connection refused to host: 192.168.0.1; nested exception is: # 錯誤二錯誤提示的是127.0.0.1這個IP這個是機器的hostname配置的可能有問題。 2021-01-27 10:06:20.730 ERROR 50901 --- [ics-Thread-1-62] c.x.k.m.c.utils.jmx.JmxConnectorWrap : JMX connect exception, host:127.0.0.1 port:9999. java.rmi.ConnectException: Connection refused to host: 127.0.0.1;; nested exception is:日志中報出真實 IP且連接被拒Connection refused說明 JMX 本身配置存在問題例如-Djava.rmi.server.hostname未設(shè)置、端口未真正監(jiān)聽或防火墻攔截了該端口日志中報出127.0.0.1則說明機器的 hostname 配置可能有問題——Kafka 啟動時解析出的主機名指向了本機回環(huán)地址導(dǎo)致 KnowStreaming 拿到127.0.0.1后無法跨機器訪問。4.2、解決方案開啟 JMX 并修正配置流程如下步驟 1修改 Kafka 的 bin 目錄下的kafka-server-start.sh文件# 在這個下面增加JMX端口的配置 if [ x$KAFKA_HEAP_OPTS x ]; then export KAFKA_HEAP_OPTS-Xmx1G -Xms1G export JMX_PORT9999 # 增加這個配置, 這里的數(shù)值并不一定是要9999 fi步驟 2修改 Kafka 的 bin 目錄下的kafka-run-class.sh文件# JMX settings if [ -z $KAFKA_JMX_OPTS ]; then KAFKA_JMX_OPTS-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse -Djava.rmi.server.hostname當前機器的IP fi # JMX port to use if [ $JMX_PORT ]; then KAFKA_JMX_OPTS$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port$JMX_PORT fi關(guān)鍵點在于-Djava.rmi.server.hostname必須設(shè)置為當前機器的真實 IPKnowStreaming 可訪問的地址且jmxremote.port與jmxremote.rmi.port保持一致均取自JMX_PORT避免 RMI 端口與注冊端口不一致導(dǎo)致連接被拒。步驟 3重啟 Kafka-Broker使配置生效后重新觀察 KnowStreaming 的 Broker 列表狀態(tài)與日志。5、異因三JMX 開啟 SSL5.1、異常現(xiàn)象在連接 JMX 的日志中出現(xiàn) SSL 認證失敗的相關(guān)日志例如握手失敗、證書校驗失敗等 SSL 相關(guān)異常原文檔中該場景的具體日志案例以 TODO 標記待補充讀者可在實際運行中收集methodcreateJmxConnector||...||msgjmx connect exception.附近的堆棧進行比對。5.2、解決方案在 Broker 端關(guān)閉 JMX 的 SSL 配置即將kafka-run-class.sh中的-Dcom.sun.management.jmxremote.sslfalse保持為false或顯式設(shè)置為 false隨后重啟 Kafka-Broker。從 KnowStreaming 側(cè)看若 Broker 端確實開啟了 SSL也可以在集群的jmx_properties中配置openSSL為true并配套username、password使 KnowStreaming 使用SslRMIClientSocketFactory建立加密連接。對應(yīng)源碼位于 JmxConnectorWrap.createJmxConnector當openSSL為 true 時會向連接環(huán)境注入Context.SECURITY_PROTOCOLssl與SslRMIClientSocketFactory。注意當openSSLtrue時KnowStreaming 要求username與token即 password均非空否則無法完成帶認證的 SSL 握手具體約束見 JmxAuthConfig。6、異因四連接了錯誤 IP6.1、異?,F(xiàn)象Broker 配置了內(nèi)外網(wǎng)而 JMX 在配置時可能配置了內(nèi)網(wǎng) IP 或者外網(wǎng) IP此時KnowStreaming需要連接到特定網(wǎng)絡(luò)的 IP 才可以進行訪問。比如Broker 在 ZK 的存儲結(jié)構(gòu)如下所示我們期望連接到endpoints中標記為INTERNAL的地址但是KnowStreaming卻連接了EXTERNAL的地址{ listener_security_protocol_map: { EXTERNAL: SASL_PLAINTEXT, INTERNAL: SASL_PLAINTEXT }, endpoints: [ EXTERNAL://192.168.0.1:7092, INTERNAL://192.168.0.2:7093 ], jmx_port: 8099, host: 192.168.0.1, timestamp: 1627289710439, port: -1, version: 4 }此時host字段指向的是192.168.0.1EXTERNAL 地址而 KnowStreaming 部署在 INTERNAL 網(wǎng)絡(luò)內(nèi)無法直連外部地址導(dǎo)致 JMX 連接失敗、指標缺失。6.2、解決方案可以手動往ks_km_physical_cluster表的jmx_properties字段增加一個useWhichEndpoint字段從而控制KnowStreaming連接到特定的 JMX IP 及 PORT。jmx_properties格式{ maxConn: 100, // KM對單臺Broker的最大JMX連接數(shù) username: xxxxx, //用戶名可以不填寫 password: xxxx, // 密碼可以不填寫 openSSL: true, //開啟SSL, true表示開啟ssl, false表示關(guān)閉 useWhichEndpoint: EXTERNAL //指定要連接的網(wǎng)絡(luò)名稱填寫EXTERNAL就是連接endpoints里面的EXTERNAL地址 }SQL 例子UPDATE ks_km_physical_cluster SET jmx_properties{ maxConn: 10, username: xxxxx, password: xxxx, openSSL: false , useWhichEndpoint: xxx} where id{xxx};useWhichEndpoint的值應(yīng)填寫endpoints中某個具體的 listener 名稱如EXTERNAL或INTERNAL。從源碼看Broker.getJmxHost(String endPoint) 會根據(jù)該值從 Broker 的endpointMap中取出對應(yīng)的IpPortData作為 JMX 連接 IP若未配置或找不到對應(yīng)端點則回退使用元信息中的host字段。而 JmxConfig.getFinallyJmxPort 再結(jié)合端口配置決定最終端口二者共同決定「連接哪個 IP 的哪個端口」。7、異因五連接了錯誤端口該能力僅 3.3.0 以上版本或 master 分支最新代碼才具備。7.1、異?,F(xiàn)象在 AWS 或者是容器上的 Kafka-Broker使用同一個 IP但是外部服務(wù)想要去連接 JMX 端口時需要進行端口映射。因此 KnowStreaming 如果直接連接 ZK 上獲取到的 JMX 端口會連接失敗因此需要具備連接端口可配置的能力。該場景的具體日志在官方文檔中以 TODO 標記待補充。典型的場景是容器內(nèi) Broker 監(jiān)聽的 JMX 端口為1234但宿主機通過 NAT 映射暴露為2234KnowStreaming 從 ZK 元信息拿到的是容器內(nèi)端口1234直連必然失敗必須通過配置將端口糾正為映射后的2234。7.2、解決方案可以手動往ks_km_physical_cluster表的jmx_properties字段增加一個specifiedJmxPortList字段從而控制KnowStreaming連接到特定的 JMX PORT。jmx_properties格式{ jmxPort: 2445, // 最低優(yōu)先級使用的jmx端口 maxConn: 100, // KM對單臺Broker的最大JMX連接數(shù) username: xxxxx, //用戶名可以不填寫 password: xxxx, // 密碼可以不填寫 openSSL: true, //開啟SSL, true表示開啟ssl, false表示關(guān)閉 useWhichEndpoint: EXTERNAL, //指定要連接的網(wǎng)絡(luò)名稱填寫EXTERNAL就是連接endpoints里面的EXTERNAL地址 specifiedJmxPortList: [ // 配置最高優(yōu)先使用的jmx端口 { serverId: 1, // kafka-broker的brokerId, 注意這個是字符串類型字符串類型的原因是要兼容connect的jmx端口的連接 jmxPort: 1234 // 該 broker 所連接的jmx端口 }, { serverId: 2, jmxPort: 1234 }, ] }SQL 例子UPDATE ks_km_physical_cluster SET jmx_properties{ maxConn: 10, username: xxxxx, password: xxxx, openSSL: false , specifiedJmxPortList: [{serverId: 1, jmxPort: 1234}] } where id{xxx};關(guān)于端口優(yōu)先級源碼 JmxConfig.getFinallyJmxPort 給出了明確決策順序可按「最高 → 最低」理解specifiedJmxPortList最高優(yōu)先級若當前serverId在列表中命中了具體jmxPort則直接使用該端口ZK 元信息中的jmx_port未命中特殊指定時若元信息端口不是-1未開啟或-2未知則使用元信息端口jmxPort字段最低優(yōu)先級元信息端口為空/未知時回退使用jmx_properties中配置的jmxPort若以上均不可得最終返回-1未開啟。serverId特意設(shè)計為字符串類型原因是要兼容 Kafka Connect 的 JMX 端口連接場景——連接類組件同樣通過該機制指定端口見 JmxConfig 中ListServerIdJmxPort specifiedJmxPortList的定義。8、總結(jié)與排查建議當 KnowStreaming 頁面指標缺失時可按下述順序快速排查序號排查項觀察點處置1JMX 是否開啟Broker 列表 JMX PORT 為-1按異因一開啟 JMX2JMX 配置是否正確日志中 Connection refused 且指向真實 IP 或 127.0.0.1按異因二修正kafka-run-class.sh并重啟3是否開啟 SSL日志出現(xiàn) SSL 認證失敗按異因三關(guān)閉 SSL 或配置openSSL/username/password4是否連接了錯誤 IP內(nèi)外網(wǎng)并存時連接了不可達地址按異因四配置useWhichEndpoint5是否連接了錯誤端口AWS/容器場景下端口映射導(dǎo)致直連失敗3.3.0按異因五配置specifiedJmxPortList修改jmx_properties后KafkaJMXClient.modify()會檢測jmxProperties是否變化一旦發(fā)現(xiàn)集群 JMX 配置變更即會移除舊連接并重建見 KafkaJMXClient因此配置生效無需重啟 KnowStreaming 服務(wù)只需等待其重新建立 JMX 連接即可。最后建議所有 JMX 相關(guān)改動均應(yīng)在 Kafka Broker 側(cè)與 KnowStreaming 集群接入配置ks_km_physical_cluster.jmx_properties兩側(cè)核對一致并結(jié)合JmxConnectorWrap輸出的methodcreateJmxConnector||...||msgjmx connect exception.日志定位真實失敗原因避免盲目修改配置。贊分享后端消息隊列運維可觀測性【免費下載鏈接】KnowStreaming一站式云原生實時流數(shù)據(jù)平臺通過0侵入、插件化構(gòu)建企業(yè)級Kafka服務(wù)極大降低操作、存儲和管理實時流數(shù)據(jù)門檻項目地址https://gitcode.com/gh_mirrors/kn/KnowStreaming點擊查看免費下載相關(guān)推薦JMeter-Rabbit-AMQP插件完整實踐教程JMeter Rabbit AMQP插件完整實踐教程 項目定位與核心價值 JMeter Rabbit AMQP是一款專為Apache JMeter設(shè)計的消息隊列SimpleWebRTC故障排除ICE連接失敗的常見原因及修復(fù)方法SimpleWebRTC故障排除ICE連接失敗的常見原因及修復(fù)方法 WebRTC實時通信技術(shù)讓音視頻通話變得簡單便捷但在實際應(yīng)用中ICE連接失敗是開發(fā)者最音視頻即時通訊終極解決方案Blueman游戲手柄連接失敗深度排查與修復(fù)指南終極解決方案Blueman游戲手柄連接失敗深度排查與修復(fù)指南 問題現(xiàn)象與痛點分析 你是否遇到過這樣的情況新買的藍牙游戲手柄Gamepad在Linux系統(tǒng)桌面應(yīng)用通信上一篇開源項目管理終極指南OpenProject社區(qū)版完整免費使用教程下一篇3步掌握Python期權(quán)量化分析的終極指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考