基于Prometheus和Grafana搭建监控系统
修订
- 2022-07-12: 增加https配置
- 2022-09-16: 修改
mysqld_exporter
,增加postgres_exporter
- 2022-09-27: 补充grafana配置
需求
原来只有家里一台服务器的时候还好,现在加了几台N1做的服务器,加上还有一些VPS,是时候上一套监控系统了。
之前是因为主服务器用的FreeBSD系统,跑Docker还要通过虚拟机,J1900的性能又不行,所以一直没搞。最近把主服务器换成了一台AMD的小主机(可惜不是Ryzen的),性能比J1900好多了——而且没有8G内存的限制。耗电虽然大一点,但也不过是跟以前的D525差不多。加上因为ZoL(ZFS on Linux)已经比较成熟,我就可以不再那么依赖FreeBSD,换成Debian 10,这样跑Docker就方便多了。于是可以开始了。
大致了解了一下,主流的监控方案是Zabbix和Prometheus,考虑到Prometheus更新一些,就选它了。
原理
基于Prometheus的监控系统架构是这样的:
- 被监控主机上安装exporter(node_exporter监控系统,mysql_exporter监控mysql数据库,postgres_exporter监控pgsql数据库……),把需要监控的数据通过http暴露出来
- Prometheus上配置任务从各个exporter源抓数据,存到内置的时序数据库里
- Grafana(也可以用其它的)作为数据分析终端从Prometheus里抓数据生成监控仪表盘
安装Prometheus
首先是通过docker安装Prometheus。
docker pull prom/prometheus:master
准备一个存放时序数据库的路径:
mkdir -p /var/data/prometheus
chown nobody:nogroup /var/data/prometheus
配置Prometheus(比如~/prometheus.yml):
global:
scrape_interval: 60s
scrape_timeout: 60s
evaluation_interval: 60s
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ["localhost:9090"]
labels:
instance: prometheus
- job_name: n1svr1
static_configs:
- targets: ["192.168.0.xx:9100"]
labels:
instance: n1svr1
暂时只配置了两个监控源,一个是Prometheus本身,一个是一台N1服务器。9090是Prometheus的端口,9100是node_exporter的端口。
如果有多个监控源配置在同一服务器上(比如node和mysql),需要指定不同的路径:
- job_name: n1svr1mysql
metrics_path: mysqlmetrics
static_configs:
- targets: ["192.168.0.xx:9104"]
labels:
instance: n1svr1mysql
注意,默认是走http,如果用https,需要指定一下:
- job_name: vps1
scheme: https
static_configs:
- targets: ["vps.domain.com:443"]
labels:
instance: vps1
如果使用自签名证书,还需要忽略证书校验:
- job_name: vps1
scheme: https
static_configs:
- targets: ["vpsip:443"]
labels:
instance: vps1
tls_config:
insecure_skip_verify: true
现在可以把Prometheus跑起来了,为方便起见,用docker-compose。
docker-compose.yml文件:
version: '2'
services:
prometheus:
image: prom/prometheus:master
container_name: prometheus
volumes:
- /var/data/prometheus:/prometheus
- /home/yourname/prometheus.yml:/etc/prometheus/prometheus.yml
启动
docker-compose up -d prometheus
当然现在Prometheus只能收集自己的监控数据,N1那台还没通,而且数据查看也不方便,所以接下来先装Grafana。
安装Grafana
这是一个数据分析展现工具,功能强大——比Kibana强多了。
首先也是docker安装:
docker pull grafana/grafana:master
配置数据存放路径:
mkdir -p /var/data/grafana
chown 472:472 /var/data/grafana
472是容器里的grafana用户ID。不需要其它配置,直接配置启动——在docker-compose里加入:
grafana:
image: grafana/grafana:master
container_name: grafana
depends_on:
- prometheus
ports:
- 3000:3000
volumes:
- /var/data/grafana:/var/lib/grafana
启动
docker-compose up -d grafana
现在可以用浏览器访问服务器的3000端口:http://your_ip:3000
打开grafana的启动页面。
如果需要指定路径,则需要使用grafana的配置文件,创建一个grafana.ini
:
[server]
domain = yourdomain.com
root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana/
serve_from_sub_path = true
然后把这个文件挂载到镜像里的/etc/grafana/grafana.ini
启动即可。
默认的登录用户名和密码都是admin
,登录后修改一下。
成功登录后就可以在首页添加数据源,这里是添加Prometheus。指定路径为:http://prometheus:9090
即可。
下一步是配置仪表盘,这事比较麻烦,就不自己做了,直接上网找现成的……
选择数据源为Prometheus的,可以找到一堆,把需要的仪表盘ID复制起来(每个仪表盘页面上有一个按钮),然后到Grafana里找到:Dashboard-manage-import
,然后把ID粘贴上去,即可自动下载这个仪表盘。
根据需要配置一下数据源什么的,即可导入并打开相应的仪表盘。
- node监控我用这个中文版的,ID:11174
- mysql监控我用了下载人数最多的,ID:7362
还有就是Grafana自带的Prometheus了。当然现在还只能看Prometheus的监控,其它的exporter源还没有。
安装node_exporter
到官方的node_exporter的release页面选择你要的平台版本下载。比如N1用的就是linux-arm64
版,注意不要搞错成linux-amd64
版了。
最简单的方法就是用root用户身份运行,即可通过http://localhost:9100/metrics
路径获取相关的监控数据,因为在内网,而且是个只读的链接,也没有什么敏感数据,就不作安全性的考虑了,直接用即可。
稍等即可在node的仪表盘看到相应的CPU,内存,硬盘使用情况了。
如果是外网的话,建议加一层https代理,当然还有更安全的配置方式就是双向证书,只是个人觉得必要性不大。
启动exporter建议使用supervisor或systemd,可以确保异常退出后能自动重启。
如需要绑定非默认端口或指定IP,可以使用命令参数:
node_exporter --web.listen-address="127.0.0.1:19100"
安装mysqld_exporter
同样是官方的mysqld_exporter的release页面,选择需要的版本。
在mysql里配置监控账号:
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
其中WITH MAX_USER_CONNECTION选项在部分版本mysql中不支持,可去掉。
然后把账号信息配置给exporter,创建~/.my.cnf:
[client]
user=exporter
password=XXXXXXXX
现在就可以启动exporter了:
mysqld_exporter --web.listen-address="127.0.0.1:9104" --web.telemetry-path=/mysqlmetrics --config.my-cnf=/root/.my.cnf
这里指定了绑定地址和端口、URL路径和配置文件路径(默认为.my.cnf可以不指定,.my.cnf也会被mysql命令行客户端默认使用,建议还是用不同的文件名指定)。
即可以通过http://localhost:9104/mysqlmetrics
路径访问监控数据了。
安装postgres_exporter
还是官方的postgres_exporter的release页面,选择需要的版本。
postgres_expoter
监控用的是默认账号postgres
,如果是本机登录的话,默认是不需要密码的,但是如果是用docker跑的话,即使绑定了127.0.0.1
,也是通过docker的网桥IP走的所以必须通过密码登录。因此,如果你不知道密码是啥的话,先到容器里通过本机登录后修改一下密码:
docker exec -it postgresql bash
> psql -Upostgres
psql> alter user postgres with password 'your_password';
psql> \q
> exit
当然你也可以修改pg_hba.conf
允许docker host不用密码登录。
host all postgres 172.17.0.1/32 trust
172.17.0.1是docker host在网桥里的IP,如果用了自定义的网桥或docker-compose自动生成的网桥,则需要自己查看一下实际的地址。
现在就可以启动exporter了:
env DATA_SOURCE_URI="postgresql://postgres:your_password@localhost:5432/postgres?sslmode=disable" postgres_exporter --web.listen-address="127.0.0.1:9187" --web.telemetry-path=/pgsqlmetrics
这里指定了绑定地址和端口、URL路径。
即可以通过http://localhost:9187/pgsqlmetrics
路径访问监控数据了。
推送到[go4pro.org]