做者 | 陳厚道 馮慶
來源 | 阿里巴巴雲原生公衆號java
導讀:本文將對 RocketMQ-Exporter 的設計實現作一個簡單的介紹,讀者可經過本文了解到 RocketMQ-Exporter 的實現過程,以及經過 RocketMQ-Exporter 來搭建本身的 RocketMQ 監控系統。RocketMQ 在線可交互教程現已登陸知行動手實驗室,PC 端登陸 start.aliyun.com 便可直達。linux
RocketMQ 雲原生系列文章:git
RocketMQ-Exporter 項目的 GitHub 地址:
https://github.com/apache/rocketmq-exportergithub
文章主要內容包含如下幾個方面:web
RocketMQ 是一個分佈式消息和流數據平臺,具備低延遲、高性能、高可靠性、萬億級容量和靈活的可擴展性。簡單的來講,它由 Broker 服務器和客戶端兩部分組成,其中客戶端一個是消息發佈者客戶端(Producer),它負責向 Broker 服務器發送消息;另一個是消息的消費者客戶端(Consumer),多個消費者能夠組成一個消費組,來訂閱和拉取消費 Broker 服務器上存儲的消息。spring
正因爲它具備高性能、高可靠性和高實時性的特色,與其餘協議組件在 MQTT 等各類消息場景中的結合也愈來愈多,應用愈來愈普遍。而對於這樣一個強大的消息中間件平臺,在實際使用的時候還缺乏一個監控管理平臺。數據庫
當前在開源界,使用最普遍監控解決方案的就是 Prometheus。與其它傳統監控系統相比較,Prometheus 具備易於管理,監控服務的內部運行狀態,強大的數據模型,強大的查詢語言 PromQL,高效的數據處理,可擴展,易於集成,可視化,開放性等優勢。而且藉助於 Prometheus 能夠很快速的構建出一個可以監控 RocketMQ 的監控平臺。apache
下圖展現了 Prometheus 的基本架構:瀏覽器
Prometheus Server 是 Prometheus 組件中的核心部分,負責實現對監控數據的獲取,存儲以及查詢。Prometheus Server 能夠經過靜態配置管理監控目標,也能夠配合使用 Service Discovery 的方式動態管理監控目標,並從這些監控目標中獲取數據。其次 Prometheus Server 須要對採集到的監控數據進行存儲,Prometheus Server 自己就是一個時序數據庫,將採集到的監控數據按照時間序列的方式存儲在本地磁盤當中。最後 Prometheus Server 對外提供了自定義的 PromQL 語言,實現對數據的查詢以及分析。服務器
Exporter 將監控數據採集的端點經過 HTTP 服務的形式暴露給 Prometheus Server,Prometheus Server 經過訪問該 Exporter 提供的 Endpoint 端點,便可獲取到須要採集的監控數據。RocketMQ-Exporter 就是這樣一個 Exporter,它首先從 RocketMQ 集羣採集數據,而後藉助 Prometheus 提供的第三方客戶端庫將採集的數據規範化成符合 Prometheus 系統要求的數據,Prometheus 定時去從 Exporter 拉取數據便可。
當前 RocketMQ Exporter 已被 Prometheus 官方收錄,其地址爲:https://github.com/apache/rocketmq-exporter。
當前在 Exporter 當中,實現原理以下圖所示:
整個系統基於 spring boot 框架來實現。因爲 MQ 內部自己提供了比較全面的數據統計信息,因此對於 Exporter 而言,只須要將 MQ 集羣提供的統計信息取出而後進行加工而已。因此 RocketMQ-Exporter 的基本邏輯是內部啓動多個定時任務週期性的從 MQ 集羣拉取數據,而後將數據規範化後經過端點暴露給 Prometheus 便可。其中主要包含以下主要的三個功能部分:
RocketMQ-Exporter 主要是配合 Prometheus 來作監控,下面來看看當前在 Expoter 中定義了哪些監控指標和告警指標。
rocketmq_message_accumulation 是一個聚合指標,須要根據其它上報指標聚合生成。
消費者堆積告警指標也是一個聚合指標,它根據消費堆積的聚合指標生成,value 這個閾值對每一個消費者是不固定的,當前是根據過去 5 分鐘生產者生產的消息數量來定,用戶也能夠根據實際狀況自行設定該閾值。告警指標設置的值只是個閾值只是象徵性的值,用戶可根據在實際使用 RocketMQ 的狀況下自行設定。這裏重點介紹一下消費者堆積告警指標,在以往的監控系統中,因爲沒有像 Prometheus 那樣有強大的 PromQL 語言,在處理消費者告警問題時勢必須要爲每一個消費者設置告警,那這樣就須要 RocketMQ 系統的維護人員爲每一個消費者添加,要麼在系統後臺檢測到有新的消費者建立時自動添加。在 Prometheus 中,這能夠經過一條以下的語句來實現:
(sum(rocketmq_producer_offset) by (topic) - on(topic) group_right sum(rocketmq_consumer_offset) by (group,topic)) - ignoring(group) group_left sum (avg_over_time(rocketmq_producer_tps[5m])) by (topic)*5*60 > 0
藉助 PromQL 這一條語句不只能夠實現爲任意一個消費者建立消費告警堆積告警,並且還可使消費堆積的閾值取一個跟生產者發送速度相關的閾值。這樣大大增長了消費堆積告警的準確性。
要驗證 RocketMQ 的 Spring-Boot 客戶端,首先要確保 RocketMQ 服務正確的下載並啓動。能夠參考 RocketMQ 主站的快速開始來進行操做。確保啓動 NameServer 和 Broker 已經正確啓動。
用戶當前使用,須要自行下載 git 源碼編譯:
git clone https://github.com/apache/rocketmq-exporter cd rocketmq-exporter mvn clean install
RocketMQ-Exporter 有以下的運行選項:
以上的運行選項既能夠在下載代碼後在配置文件中更改,也能夠經過命令行來設置。
編譯出來的 jar 包就叫 rocketmq-exporter-0.0.1-SNAPSHOT.jar,能夠經過以下的方式來運行。
java -jar rocketmq-exporter-0.0.1-SNAPSHOT.jar [--rocketmq.config.namesrvAddr="127.0.0.1:9876" ...]
首先到 Prometheus 官方下載地址去下載 Prometheus 安裝包,當前以 linux 系統安裝爲例,選擇的安裝包爲 prometheus-2.7.0-rc.1.linux-amd64.tar.gz,通過以下的操做步驟就能夠啓動 prometheus 進程。
tar -xzf prometheus-2.7.0-rc.1.linux-amd64.tar.gzcd prometheus-2.7.0-rc.1.linux-amd64/./prometheus --config.file=prometheus.yml --web.listen-address=:5555
Prometheus 默認監聽端口號爲 9090,爲了避免與系統上的其它進程監聽端口衝突,咱們在啓動參數裏面從新設置了監聽端口號爲 5555。而後經過瀏覽器訪問 http://<服務器 IP 地址>:5555,就能夠驗證 Prometheus 是否已成功安裝,顯示界面以下:
因爲 RocketMQ-Exporter 進程已啓動,這個時候能夠經過 Prometheus 來抓取 RocketMQ-Exporter 的數據,這個時候只須要更改 Prometheus 啓動的配置文件便可。
總體配置文件以下:
# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:5555'] - job_name: 'exporter' static_configs: - targets: ['localhost:5557']
更改配置文件後,重啓服務便可。重啓後就能夠在 Prometheus 界面查詢 RocketMQ-Exporter 上報的指標,例如查詢 rocketmq_broker_tps 指標,其結果以下:
在 Prometheus 能夠展現 RocketMQ-Exporter 的指標後,就能夠在 Prometheus 中配置 RocketMQ 的告警指標了。在 Prometheus 的配置文件中添加以下的告警配置項,*.rules 表示能夠匹配多個後綴爲 rules 的文件。
rule_files: # - "first_rules.yml" # - "second_rules.yml" - /home/prometheus/prometheus-2.7.0-rc.1.linux-amd64/rules/*.rules
當前設置的告警配置文件爲 warn.rules,其文件具體內容以下所示。其中的閾值只起一個示例的做用,具體的閾值還需用戶根據實際使用狀況來自行設定。
### # Sample prometheus rules/alerts for rocketmq. # ### # Galera Alerts groups: - name: GaleraAlerts rules: - alert: RocketMQClusterProduceHigh expr: sum(rocketmq_producer_tps) by (cluster) >= 10 for: 3m labels: severity: warning annotations: description: '{{$labels.cluster}} Sending tps too high.' summary: cluster send tps too high - alert: RocketMQClusterProduceLow expr: sum(rocketmq_producer_tps) by (cluster) < 1 for: 3m labels: severity: warning annotations: description: '{{$labels.cluster}} Sending tps too low.' summary: cluster send tps too low - alert: RocketMQClusterConsumeHigh expr: sum(rocketmq_consumer_tps) by (cluster) >= 10 for: 3m labels: severity: warning annotations: description: '{{$labels.cluster}} consuming tps too high.' summary: cluster consume tps too high - alert: RocketMQClusterConsumeLow expr: sum(rocketmq_consumer_tps) by (cluster) < 1 for: 3m labels: severity: warning annotations: description: '{{$labels.cluster}} consuming tps too low.' summary: cluster consume tps too low - alert: ConsumerFallingBehind expr: (sum(rocketmq_producer_offset) by (topic) - on(topic) group_right sum(rocketmq_consumer_offset) by (group,topic)) - ignoring(group) group_left sum (avg_over_time(rocketmq_producer_tps[5m])) by (topic)*5*60 > 0 for: 3m labels: severity: warning annotations: description: 'consumer {{$labels.group}} on {{$labels.topic}} lag behind and is falling behind (behind value {{$value}}).' summary: consumer lag behind - alert: GroupGetLatencyByStoretime expr: rocketmq_group_get_latency_by_storetime > 1000 for: 3m labels: severity: warning annotations: description: 'consumer {{$labels.group}} on {{$labels.broker}}, {{$labels.topic}} consume time lag behind message store time and (behind value is {{$value}}).' summary: message consumes time lag behind message store time too much
最終,能夠在 Prometheus 的看一下告警展現效果,紅色表示當前處於告警狀態的項,綠色表示正常狀態。
Prometheus 自身的指標展現平臺沒有當前流行的展現平臺 Grafana 好, 爲了更好的展現 RocketMQ 的指標,可使用 Grafana 來展現 Prometheus 獲取的指標。
首先到官網去下載:https://grafana.com/grafana/download,這裏仍以二進制文件安裝爲例進行介紹。
wget https://dl.grafana.com/oss/release/grafana-6.2.5.linux-amd64.tar.gz tar -zxvf grafana-6.2.5.linux-amd64.tar.gz cd grafana-5.4.3/
一樣爲了避免與其它進程的使用端口衝突,能夠修改 conf 目錄下的 defaults.ini 文件的監聽端口,當前將 grafana 的監聽端口改成 55555,而後使用以下的命令啓動便可:
./bin/grafana-server web
而後經過瀏覽器訪問 http://<服務器 IP 地址>:55555,就能夠驗證 grafana 是否已成功安裝。系統默認用戶名和密碼爲 admin/admin,第一次登錄系統會要求修改密碼,修改密碼後登錄,界面顯示以下:
點擊 Add data source 按鈕,會要求選擇數據源。
選擇數據源爲 Prometheus,設置數據源的地址爲前面步驟啓動的 Prometheus 的地址。
回到主界面會要求建立新的 Dashboard。
點擊建立 dashboard,建立 dashboard 能夠本身手動建立,也能夠以配置文件導入的方式建立,當前已將 RocketMQ 的 dashboard 配置文件上傳到 Grafana 的官網,這裏以配置文件導入的方式進行建立。
點擊 New dashboard 下拉按鈕。
選擇 import dashboard。
這個時候能夠到 Grafana 官網去下載當前已爲 RocketMQ 建立好的配置文件,地址爲:https://grafana.com/dashboards/10477/revisions,以下圖所示:
點擊 download 就能夠下載配置文件,下載配置文件而後,複製配置文件中的內容粘貼到上圖的粘貼內容處。
最後按上述方式就將配置文件導入到 Grafana 了。
最終的效果以下所示:
陳厚道,曾就任於騰訊、盛大、鬥魚等互聯網公司。目前就任於尚德機構,在尚德機構負責基礎架構方面的設計和開發工做。對分佈式消息隊列、微服務架構和落地、DevOps 和監控平臺有比較深刻的研究。
馮慶,曾就任於華爲。目前就任於尚德機構,在尚德機構基礎架構團隊負責基礎組件的開發工做。