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