kafka監控框架預研


本文討論了五種實現方案:

  • jmxtrans+influxdb +grafana

  • jmx_exporter +ps + grafana

  • kafka_exporter + ps + grafana

  • cmak

  • logi_kafkamanager

JMXTrans + InfluxDB + Grafana

個人覺得是一種通用的監控框架
數據來源:
kafka提供了大量的監控指標,這些監控指標可以通過jmx獲取。jmxtrans為開源工具,通過配置json文件將,采集到的數據存儲至influxdb。
jconsole的監控圖:

提供的監控指標包含:kafka.log 、kafka.server,kafka.log、kafka.network;具體的有:BytesInPerSec、BytesOutPerSec、MessagesInPerSec、RequestsPerSec、Threading
使用上比較簡單,配置JMXTrans所需要的json文件。
需要配置jmx端口:"port" : "9760", 監控的brokerip"host" : "168.38.103.155",要監控一個集權的各個機器只需要配置多個ip即可。

  {
  "servers" : [ {
    "port" : "9760",
    "host" : "100.10.100.100",
    "queries" : [ {
      "obj" : "kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic=access_cdn_big",
      "attr" : [ "Count" ],
      "resultAlias":"MessagesInPerSec",
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.InfluxDbWriterFactory",
        "url" : "http://110.20.110.110:8086/",
        "username" : "admin",
        "password" : "123456",
        "database" : "jmxDB",
        "tags"     : {"application" : "MessagesInPerSec"}
      } ]
    } ]
 }]}

數據存儲:
使用時序數據庫InfluxDB,根據jmxtrans的配置自動創建表,並存儲數據。

數據展示與告警:
通過grafana實現監控與告警,配置相應的查詢sql語句。

(JMX_exporter|kafka_exporter)+Prometheus+Grafana
與JMXTrans + InfluxDB + Grafana 的方式大同小異,都是通過jmx暴露的指標獲取數據,寫入時序數據庫中,以時序數據庫為數據源,通過grafana進行監控與告警。

數據采集:

  • jmx_exporter:
    ps生態下的一個組件,通過jmx獲取監控數據,理論上任何使用jmx暴露metric的應用都可以使用。jmx_exporter有兩種啟動方式,一種是以httpserver的方式啟動,一種是java agent的方式與java應用一起啟動。因此jmx_exporter分成兩個jar包,分別是jmx_prometheus_javaagent.jar 、jmx_prometheus_httpserver.jar

    jmx_prometheus_javaagent.jar 可以通過java_agent獲得更全面的數據,官網強烈推薦此方式,只需要維護一個進程。但是若修改配置,則需要重啟kafka。

修改啟動腳本:
export KAFKA_OPTS="-javaagent:/opt/kafka/kafka_2.11-1.0.0/jmx_prometheus_javaagent-0.9.jar=9997:/opt/kafka/kafka_2.11-1.0.0/kafka-agent.yaml";
jmx_prometheus_httpserver.jar 該方式可以獨立部署,通過配置文件讀取指定的jmx,相比於上一種需要多維護一個獨立進程。

java -Dcom.sun.management.jmxremote.ssl=false
-cp /home/setup/kafka_exporter_ps_grafana/jmx_exporter/jmx_prometheus_httpserver-0.12.0-jar-with-dependencies.jar io.prometheus.jmx.WebServer 9997
/home/setup/kafka_exporter_ps_grafana/jmx_exporter/config.yaml
端口9997為jmx_exporter暴露出來的數據端口,供ps采集使用。主要工作量在jmx_exporter配置上,內容就是配置的kafka metrics。

jmx_exporter配置:

hostPort: 127.0.0.1:9999
lowercaseOutputName: true
whitelistObjectNames: 
  - "kafka.controller:type=KafkaController,name=OfflinePartitionsCount"
  - "kafka.controller:type=KafkaController,name=ActiveControllerCount"
  - "kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec"
  - "kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec"
  - "kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions"
  - "kafka.server:type=ReplicaFetcherManager,name=MaxLag,clientId=Replica"

官方提供配置模板事例:

  • kafka_exporter:
    Kafka exporter for Prometheus. For other metrics from Kafka, have a look at the JMX exporter.
    通過Kafka Protocol Specification 收集 Brokers, Topics 以及 Consumer Groups的相關指標,使用簡單,運行高效,相比於以往通過kafka內置的腳本進行收集,由於沒有了JVM的運行開銷,指標收集時間從分鍾級別降到秒級別,便於大規模集群的監控。kafka_exporter不需要進行配置,后台啟動即可。

啟動方式:kafka_exporter --kafka.server=kafka:9092 [--kafka.server=another-server ...]

監控指標:

指標 輸出 含義
kafka_brokers kafka_brokers3 broker數量
kafka_consumergroup_current_offset kafka_consumergroup_current_offset{consumergroup="crsstreamingsort",partition="0",topic="access_cdn_big"} 2.726367e+06 每個消費者組再各個topic的各個partiton消費到的當前offset
kafka_consumergroup_current_offset_sum kafka_consumergroup_current_offset_sum{consumergroup="crsstreamingsort",topic="access_cdn_big"} 5.452707e+06 每個消費者組再各個topic的消費到的當前offset
kafka_consumergroup_lag kafka_consumergroup_lag{consumergroup="KMOffsetCache-kafka-manager-3806276532-ml44w",partition="0",topic="__consumer_offsets"} 1 每個consumergroup對於patrtion/topic消費滯后的值
kafka_consumergroup_lag_sum 每個consumergroup對於topic消費滯后的值
kafka_consumer_lag_millis kafka_consumer_lag_millis{consumergroup="perf-consumer 74084",partition="0",topic="test"} 3.4457231197552e+10
kafka_consumergroup_members kafka_consumergroup_members{consumergroup="zycdn_streamingstat"} 11 展示各個消費者組和每個消費者組的連接數量
kafka_consumergroup_uncommitted_offsets kafka_consumergroup_uncommitted_offsets{consumergroup="crsstreamingsort",partition="0",topic="access_cdn_big"} 0 每個消費者組再各個topic的各個partiton未提交的offset
kafka_consumergroup_uncommitted_offsets_sum kafka_consumergroup_uncommitted_offsets_sum{consumergroup="crsstreamingsort",topic="access_cdn_big"} 0 每個消費者組再各個topic的還未提交的offset
kafka_topic_partition_current_offset kafka_topic_partition_current_offset{partition="0",topic="hellokafka"} 600000 各個分區當前的offset
kafka_topic_partition_in_sync_replica kafka_topic_partition_in_sync_replica{partition="0",topic="crs-kafka-topic"} 3 當前分區已經同步的副本
kafka_topic_partition_leader kafka_topic_partition_leader{partition="0",topic="access_cdn_big"} 10002 分區leader
kafka_topic_partition_leader_is_preferred kafka_topic_partition_leader_is_preferred{partition="0",topic="access_cdn_small"} 1 是否為優選leader
kafka_topic_partition_oldest_offset kafka_topic_partition_oldest_offset{partition="0",topic="access_cdn_small"} 874864 每個分區最老的offset
kafka_topic_partition_replicas kafka_topic_partition_replicas{partition="0",topic="statuscode_details"} 3 每個分區的副本個數
kafka_topic_partition_under_replicated_partition kafka_topic_partition_under_replicated_partition{partition="0",topic="hellokafka"} 0 副本丟失數量
kafka_topic_partitions kafka_topic_partitions{topic="__consumer_offsets"} 50 分區數量

數據存儲:
通過ps主動拉取數據進行存儲。Prometheus采取的是pull的方式,influxdb采取的是push方式,ps只需要配置數據源即可:

    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'vpc_md_kafka'
    static_configs:
    - targets: ['localhost:9308']

數據展示與告警:
通過grafana接入ps的數據,進行展示;主要工作就是在進行dashbord的配置。

{
  ...........
  "panels": [
    {
      "styles": [
        {
          "alias": "缺失副本個數",
          "align": "auto",
          "colorMode": null,
          "colors": [
            "rgba(245, 54, 54, 0.9)",
            "rgba(237, 129, 40, 0.89)",
   .............
}

CMAK (KAFKA-MANAGER)

測試環境:http://10...**:9001

該項目為web工程,使用scala語言編寫;同時具有監控與運維的功能,沒有數據數據庫存儲,只是實時的展示出來,沒有告警功能,框架比較簡潔。

數據獲取方式:通過kakfa的協議獲取整個集群的指標,還通過jmx獲得broker和topic的指標。

運行環境: 從3.0.0.2版本起需要jdk11運行環境,zk版本也要求在3.5+以上,但是實測在看法環境上沒啥問題。

cmak能夠提供以下的功能:

  • 多集群的管理

  • 獲得集群的狀態:topics, consumers, offsets, brokers, replica distribution, partition distribution

  • 進行副本的優選

  • 創建刪除topic

  • 增加刪除分區,分區重新分配

  • 更新topic的配置

從jmx種獲得broker和topic級別的監控指標

topic整體概況:

分區重置策略:

Logi-KafkaManager

滴滴開源的一站式集群指標監控與運維管控平台,定位是kafka集群全方位管控系統,它以kafka集群為主體,封裝和集成了kafka對外提供給的api,以kafka集群和topic資源為運營對象,面向應用系統用戶、kafka管控平台開發者、kafka管控平台運維者提供便捷的資源管理能力。體驗網站:http://117.51.150.133:8080/kafka/admin。

數獲取方式:jmx的監控指標、kafka開放的協議。

開發環境: 該項目為前后端分離的web架構(sprintboot+reactJS+Typescript),使用java語言編寫,開發環境jdk8+,MySQL5.7+。

整體架構:

主要功能:

  • topic管理:

  • topic讀寫申請、topic創建/擴容、 topic指標監控、topic 性能指標、限流

  • 集群管理:

  • 集群部署、集群升級、集群擴縮容、topic管控/遷移、集群的性能指標

監控管理:

  • 集群監控、broker監控、 region監控、controller監控

總結:

五種實現方案的對比:

實現方式 安裝部署 監控指標采集 擴展性(監控指標) 通用性(監控其他組件的能力) 運維功能 改造開發
jmxtrans+infludb+grafana 省份部署一套即可,通過增加ip即可完成整個集群的監控 省份部署一套即可,通過增加ip即可完成整個集群的監控。
jmx_exporter+Prometheus+Grafana jmx_exporter一次只能監控一個進程jmx的指標,每台kafka都要部署一個。(目前找到有人修改的jmx_exporter_multi,可以監控多個jvm) 所有能獲取的監控指標都進行采集。
kafka_exporter+Prometheus+Grafana 省份部署一套即可,指定kafka端口即可監控整個集群 所有能獲取的監控指標都進行采集
cmak 只需要在集團部署即可監控各個省份集群 自定義監控指標,代碼實現 需要增加數據存儲與告警功能
Logi-KafkaManager 只需要在集團部署即可監控各個省份集群 只需要在集團部署即可監控各個省份集群 需要去除一些不必要的功能

  前三種實現方案與后兩種相比,實現方便,不需要進行代碼的開發,只需采集jmx指標即可,有告警功能,但是沒有運維功能,可以直接接入目前的監控框架,極大地節省運維成本;后兩種具有一定的運維功能,但是都需要進行改造,改造和維護的成本較高;改造便可以實現自定義的一些功能,擴展性較強。

  • JMXTrans + InfluxDB + Grafana 使用開發上比較方便,框架搭好后,只需要后續增加jxmtrans采集的json文件,同時增加grafana展示的sql語句即可;但是由於采集指標是從jmx中獲取,監控指標不能自定義,取決於jmx提供的數據,官方說是500多種應該是夠用了,但實際采集的也就幾十種;這套方案只能作為監控系統,不能提供管理的能力。由於jmxTrans可以采集所有的jmx的消息,因此這套系統可以監控hdfs等其他java程序,可以接入易監測的grafana,通用性較強。

  • jmx_exporter+Prometheus+Grafana 同上

  • kafka_exporter+Prometheus+Grafana 部署簡單,但只能監控kafka的數據,采集的指標由版本決定,當前版本只有16種監控指標,要想獲取更多的指標只能等版本更新或者自己開發;不過好在他是基於ps的組件,可以聯合ps的其他組件一起使用。提供了consumergroup維度的指標,這個維度對於我們來說是比較有用的。

  • cmak 由scala編寫的web,沒有數據存儲系統和告警系統,需要進行改造,改造成本有些高。

  • Logi-KafkaManager 功能比較強大,但是很多功能用不到,監控指標可能不滿足需求需要進行二次開發;整個系統比較復雜,需要去除一些不需要的功能,再開發一些監控指標;但是與現有的監控框架無法融合,單獨搞一套的成本比較高。使用java,開發難度比cmak小一些。

凡是采用jmx獲取數據的方式理論上也可以監控hdfs、zk等運行在jvm上的程序。

參考資料:

kakfa 度量指標: https://kafka.apache.org/documentation/#consumer_fetch_monitoring

滴滴開源地址:https://github.com/didi/LogiKM

cmak開源地址:https://github.com/yahoo/CMAK

jmx_exporter開源地址: https://github.com/prometheus/jmx_exporter

jmx_exporter_multi改編:https://github.com/gentlezuo/jmx_exporter_multi(一種抓取多個jmx的采集器)

kafka_exporter:https://github.com/danielqsj/kafka_exporter

jmx_trans:https://github.com/jmxtrans/jmxtrans

jmx_trans+influxdb+grafana環境的搭建:https://www.cnblogs.com/bluesky-yuan/p/14842518.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM