kafka集群越来越多,每次问题出来了很挠头,并不能第一时间定位到问题,也没有多少有效数据,所以对整个集群状态做个有效的记录是十分必要的。
所以选择用jmxtrans+influxdb+grafana这三个开源组件做个监控。jmxtrans通过JMX(Java Management Extensions)收集每个kafka实例监控数据,把数据导入到influxDB,然后再grafana集中展示,展示的时候可以按照broker或者集群。
influxdb安装
截止到2017-09-26 16:17:35 influxdb已经更新到V1.3.5,但是新的版本改动很大把
Web Admin Interface取消了。都融合到了Chronograf,功能似乎是增强了,但是,,Chronograf需要独立安装,而且,,Chronograf安装时似乎还要依赖Kapacitor,Telegraf,我不知道这是不是捆绑经营,所以我选择装之前版本,本来还想拥抱最新版的,看起来现在不是时候。
V1.2.0安装过程
wget http://dl.influxdata.com/influxdb/releases/influxdb-1.2.0.x86_64.rpm
yum install influxdb-1.2.0.x86_64.rpm
service influxdb start修改 /etc/influxdb/influxdb.conf
1 | [admin] |
influx 用户root 默认密码 root
修改密码
SET PASSWORD FOR root = ‘root’
后面的初始化我们可以到http://localhost:8083完成。还可以借助旁边Query Template
比如创建用户
CREATE USER “root” WITH PASSWORD ‘123456’ WITH ALL PRIVILEGES
新建库
CREATE DATABASE “db_name”
grafana安装
grafana必须最新版
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.5.2-1.x86_64.rpm
yum install grafana-4.5.2-1.x86_64.rpm
service grafana start配置DataSource
记得把admin用户禁用或者改密码,依稀还记得之前公司请了个白帽子扫公司环境,就是因为grafana默认端口,admin用户还是用的默认密码,我们小米监控数据图都在grafana上,这令我一度十分尴尬。所以,禁用admin吧。。
jmxtrans安装
wget http://central.maven.org/maven2/org/jmxtrans/jmxtrans/266/jmxtrans-266.rpm
yum install jmxtrans-266.rpm
/etc/init.d/jmxtrans start 下面我们需要在/var/lib/jmxtrans/文件下增加json格式的配置文件,因为jmxtrans每次都是从这个目录读取json文件的。
参考influxDBwriter
格式类似
1 | { |
对其中重要项目做一下解读:
- obj - 对应jmx的ObjectName,监控指标后面加上
topic=*之后可以按照每个topic收集,否则不会 - resultAlias - This is used as the
measurementcontainer in the database(influxdb)相当于表名 - tags - 对应InfluxDb的tag功能,对与存储在同一个MEASUREMENTS里面的不同监控指标可以做区分,相当于带索引的字段
关于kafka jmx metrics 请移步官网传送门
metrics采集参考
https://blog.serverdensity.com/how-to-monitor-kafka/
问题处理参考
https://www.cloudera.com/documentation/kafka/latest/topics/kafka_metrics.html
metric
集群状态相关
- kafka.server:type=ReplicaFetcherManager,name=MaxLag,clientId=Replica,topic=* 副本最大延时(message个数)
- kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions 不可用分区数
- kafka.controller:type=KafkaController,name=ActiveControllerCount leader of broker
- kafka.network: type=SocketServer, name=RequestHandlerAvgIdlePercent 请求平均处理率
- kafka.server:type=ReplicaManager,name=PartitionCount partition数量
- java.lang:type=Threading java线程数
- java.lang:type=GarbageCollector,name=* javaGC频率
- java.lang:type=Memory Java内存使用情况
网络流量相关
- kafka.network:type=RequestMetrics,name=RequestsPerSec,request=*
- kafka.network:type=RequestMetrics,name=TotalTimeMs,request=*
- kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec,topic=* 流入流量
- kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec,topic=* 流出流量
- kafka.server:type=BrokerTopicMetrics,name=BytesRejectedPerSec,topic=* 拒绝流量
- kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic=* 流入消息量
最终效果图
可以加一些template变量,更方便查看


也可以自己制作一些报表
问题发现及处理
grafana绘图不完全的问题
问题描述:
当我绘制每个集群中所有Topic的流量图的时候,到一个比较大的集群的时候,会出现某个Topic显示不全这种情况。比如说集群中有300个Topic,当你group by的时候,只会显示几十个,但是当你在自己设置的变量中去特意选没有出现的Topic的时候,该Topic曲线也能被绘制出来。
问题分析:
我一度以为并深信这是grafana的问题,并试图去给grafana增加系统资源,到处搜索”grafana graph query limit”然而并没有什么结果,终于,几天之后当我展示最近30分钟的数据的时候,所有的Topic都被展示出来了,我才意识到这锅并不是grafana的,应该是influx的。然后去看了一下influxdb的配置文档,终于有所发现..
在influxdb.conf中的[http]模块有个默认的配置
max-row-limit = 10000
这条配置的意思是每次查询,最大返回一万条数据,我们每分钟一个点,一天的数据,几百个Topic,很容易就达到了也就是说七个Topic就回达到这个阈值,所以要把这个值改的大一点。如果改的特别大之后别忘了给influxdb增加一些系统资源,省的出问题。