本文討論了五種實現方案:
-
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.jarjmx_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