在之前公司搭建测试环境过程中会安装mysql、redis、kafak等数据库,在测试环境使用过程中经常会遇到服务挂了等问题,经过分析是因为数据库无法连接成功或者数据打满等异常问题。
所以我们将测试环境监控纳入了测试环境搭建体系的一环,我们期望通过监控大盘来看各种数据库中间件,并且提供异常报警能力。
如下是Prometheus + Grafana + exporter的监控架构体系:
Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们便将它独立成开源项目,并且有公司来运作。Google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。
Prometheus基本原理是通过HTTP协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。这样做非常适合虚拟化环境比如VM或者Docker 。
Prometheus应该是为数不多的适合Docker、Mesos、Kubernetes环境的监控系统之一。
输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux 系统信息 (包括磁盘、内存、CPU、网络等等),具体支持的源看:https://github.com/prometheus。
与其他监控系统相比,Prometheus的主要特点是:
Grafana 是一个开源的监控数据分析和可视化套件。最常用于对基础设施和应用数据分析的时间序列数据进行可视化分析,也可以用于其他需要数据可视化分析的领域。Grafana 可以帮助你查询、可视化、告警、分析你所在意的指标和数据。可以与整个团队共享,有助于培养团队的数据驱动文化。
Grafana的主要特点是:
docker run -d -p 3000:3000 grafana
grafana地址: http://127.0.0.1:3000,登录账号密码:admin/admin。
在grafana中配置Prometheus数据源,需要输入Prometheus参数。
广义上讲所有可以向Prometheus提供监控样本数据的程序都可以被称为一个Exporter。而Exporter的一个实例称为target,如下所示,Prometheus通过轮询的方式定期从这些target中获取样本数据:
以我们已经使用过的Node Exporter为例,由于操作系统本身并不直接支持Prometheus,同时用户也无法通过直接从操作系统层面上提供对Prometheus的支持。因此,用户只能通过独立运行一个程序的方式,通过操作系统提供的相关接口,将系统的运行状态数据转换为可供Prometheus读取的监控数据。除了Node Exporter以外,比如MySQL Exporter、Redis Exporter等都是通过这种方式实现的。这些Exporter程序扮演了一个中间代理人的角色。
下载镜像,使用aliyuncs镜像可以提高下载速度。
下载命令:
docker pull f1z25q5p.mirror.aliyuncs.com/elarasu/mongodb_exporte
部署命令如下,需要mongo的账号、密码等链接参数。
docker run -d --name mongo-explorer -p 9106:9104 f1z25q5p.mirror.aliyuncs.com/elarasu/mongodb_exporter --mongodb.uri=mongodb://帐号:密码@IP:端口/db名字
部署成功后,mongodb_exporter就开始采集mongo的数据了。
可以选择grafana面板展示mongodb数据
https://grafana.com/dashboards/2583
展示效果如下图:
可以使用kafka_exporter监控kafka数据,配置方法如下:
首先,在kafka_exporter到服务器上并且解压安装包。
wget https://github.com/danielqsj/kafka_exporter/releases/download/v1.2.0/kafka_exporter-1.2.0.linux-amd64.tar.gz
tar -zxvf kafka_exporter-1.2.0.linux-amd64.tar.gz
启动kafka_exporter
cd kafka_exporter-1.2.0.linux-amd64
./kafka_exporter --kafka.server=kafkaIP或者域名:9092 &
ss -tunl
或者后台启动
nohup ./kafka_exporter --kafka.server=10.30.130.96:9092 &
可以使用命令查看kafka_exporter进程已经存在。
ps -ef | grep kafka_exporter
netstat -ntlp | grep 28849
在Prometheus.yml文件配置kafka数据源地址,然后重启Prometheus。
- job_name: 'kafka'
static_configs:
- targets: ['kafkaIP或者域名:9308']
labels:
instance: kafka@kafkaIP或者域名
配置完成后,再选择kafka_exporter的grafana面板。
https://grafana.com/dashboards/7589
下图是grafana的监控效果,会展示各个topic的情况。
使用mysqld-exporter监控mysql
数据库信息收集exporter,DATA_SOURCE_NAME的格式
DATA_SOURCE_NAME="用户名:密码@(mysqlip:port)"
启动命令配置如下:
docker run -d -p 9105:9104 -e DATA_SOURCE_NAME="用户名:密码@(mysqlip:port)/" prom/mysqld-exporte
grafana的监控面板选择如下:
https://grafana.com/dashboards/7362
使用redis_exporter监控redis
下载镜像
docker pull oliver006/redis_exporter
启动命令
docker run -d \
--name redis_exporter \
-p 9121:9121 \
oliver006/redis_exporter --redis.addr redis://192.168.1.237:8899
grafana的监控面板选择如下:
https://grafana.com/dashboards/2751
使用Prometheus + Grafana + exporter三剑客就可以完成测试环境的数据库监控,但是如果是监控生产环境还是需要专业的运维同学来搭建,大概的架构是差不多的,只不过生产环境的配置更加复杂一些。