文章目录
一、介绍Prometheus
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的主要特点是:
- 一个多维数据模型(时间序列由指标名称定义和设置键/值尺寸)
- 非常高效的存储,平均一个采样数据占~3.5bytes左右,320万的时间序列,每30秒采样,保持60天,消耗磁盘大概228G。
- 一种灵活的查询语言。
- 不依赖分布式存储,单个服务器节点。
- 时间集合通过HTTP上的PULL模型进行。
- 通过中间网关支持推送时间。
- 通过服务发现或静态配置发现目标。
- 多种模式的图形和仪表板支持。
二、安装运行Prometheus(docker版)
下面介绍如何使用Prometheus、Grafana、CAdvisor、node-exporter、mysqld-exporter对本机服务器性能、Docker容器、MySQL数据库进行监控。
监控本机,只需要一个exporter
- node_exporter – 用于机器系统数据收集
- mysqld-exporter 用于MySQL数据库数据收集
- Cadvisor 用于收集宿主机上的docker容器数据
- Grafana是一个开源的功能丰富的数据可视化平台,通常用于时序数据的可视化。它内置了以下数据源的支持:
下面是我们安装时用到的架构图:
注意:本文使用的是CentOS 7 x64,只需要一台服务器即可!
2.1 安装docker
安装方法可以看之前的文章【云原生 • Docker】Docker入门
出现如下效果则成功
[root@iZbp16vhn64fpaj6qmsum0Z ~]# docker --version
Docker version 24.0.2, build cb74dfc
2.2 下载镜像包
docker pull prom/node-exporter
docker pull prom/mysqld-exporter
docker pull oliver006/redis_exporter
docker pull prom/prometheus
docker pull grafana/grafana
prom/node-exporter
:用于收集主机系统信息和指标的prom/mysqld-exporter
:用于收集数据库系统信息和指标的oliver006/redis_exporter
:用于收集redis信息和指标的grafana/grafana
:是一个用于可视化和分析监控指标的开源平台。prom/prometheus
:是一个开源的监控系统,用于收集和存储时间序列数据,并提供基于数据的查询、报警和可视化功能。
2.3 容器启动
启动node-exporter
docker run -d --name node-exporter \
--restart=always -p 9100:9100 \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-v /:/rootfs:ro prom/node-exporter
查看访问
http://192.168.1.31:9100/metrics
效果如下
这些都是收集到数据,有了它就可以做宿主机Linux数据展示了
启动mysqld-exporter
docker run -d --name mysqld_exporter \
--restart=always -p 9104:9104 \
-e DATA_SOURCE_NAME="root:Password123@(172.17.0.2:3306)/" \
prom/mysqld-exporter
查看访问
http://192.168.1.31:9104/metrics
效果如下
这些都是收集到数据,有了它就可以做MySQL数据库数据展示了
安装redis_exporter
#不带密码
docker run -d --name redis_exporter -p 9121:9121 oliver006/redis_exporter --redis.addr redis://192.168.0.1:6379
# 绑定集群中一个redis实例就可以了
# 带密码
docker run -d --name redis_exporter -p 9121:9121 oliver006/redis_exporter --redis.addr redis://192.168.0.1:6379 --redis.password 'mypassword'
查看访问
http://192.168.1.31:9121/metrics
效果如下
启动prometheus
新建目录prometheus,编辑配置文件prometheus.yml
mkdir /opt/prometheus
cd /opt/prometheus/
vim prometheus.yml
内容如下:
global:
scrape_interval: 60s
evaluation_interval: 60s
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
labels:
instance: prometheus
- job_name: linux
static_configs:
- targets: ['172.17.0.2:9100']
labels:
instance: localhost
# - targets: ['192.168.1.22:9100']
#这里添加targets,可以使用Prometheus监控其他装有node_exporter的节点,单节点则不需要
# labels:
# instance: 192.168.1.22
- job_name: cadvisor
static_configs:
- targets: ['172.17.0.4:8080']
labels:
instance: cAdvisor
- job_name: mysqld
static_configs:
- targets: ['172.17.0.3:9104']
labels:
instance: mysql-exporter
注意:修改IP地址,这里的172.17.0. xx就是docker容器内的私网,需要自行查询。可以直接通过url查询信息得那个IP。
如果想加上redis监控
- job_name: 'redis_exporter_cluster_targets'
# redis 集群的ip:端口号,我用的在阿里云搭的redis集群
static_configs:
- targets:
- redis://ip:6381
- redis://ip:6382
- redis://ip:6383
params:
check-keys: ["metrics:*"]
metrics_path: /scrape
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 172.19.0.11:9121
- job_name: "redis_exporter_cluster"
static_configs:
# 注意这里是容器间访问的端口,不是暴露给宿主机的
# 这里是redis_export的容器ip和容器间相互使用的端口(不是暴露给主机的)
- targets: ['172.19.0.11:9121']
labels:
instance: '集群'
启动prometheus
docker run -d --name prometheus --restart=always -p 9090:9090 -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
注意:宿主机的路径必须是绝对路径:/opt/prometheus/prometheus.yml
,否者报错
访问url:
http://192.168.1.31:9090/graph
效果如下:
访问targets,url如下:
http://192.168.1.31:9090/targets
效果如下:
三、启动grafana
新建空文件夹grafana-storage,用来存储数据
mkdir /opt/grafana-storage
添加权限
chmod 777 -R /opt/grafana-storage
因为grafana用户会在这个目录写入文件,直接设置777,比较简单粗暴!
启动grafana
docker run -d --name grafana --restart=always \
-p 3000:3000 --name=grafana \
-v /opt/grafana-storage:/var/lib/grafana grafana/grafana
访问url:
http://192.168.1.31:3000/
默认会先跳转到登录页面,默认的用户名和密码都是admin
登录之后,它会要求你重置密码。你还可以再输次admin密码
密码设置完成之后,就会跳转到首页
点击Setting——Add data source,由于使用的是镜像方式,所以版本比较新。和网络上的文章展示的图片不一样
选择Prometheus
name名字写Prometheus
type 选择Prometheus,因为数据都从它那里获取
url 输入Prometheus的ip(docker容器私网ip)+端口
点击下面的Save & Test,如果出现绿色的,说明ok了
监控mysql
回到首页,导入grafana监控模板,mysql监控模板id为7362,填入如下输入框内
保存就可以进行数据可视化展示
监控主机
导入主机的监控模板,模板id为8919,以相同方式导入即可
监控容器
导入容器的监控模板,模板id为179,以相同方式导入即可
监控redis
导入容器的监控模板,模板id为 763,以相同方式导入即可