写在前面
公司有一套自建的MongoDB分片集群,因为都部署在服务器中监控起来不是很方便,而且没有报警功能,所以就想弄一套可以对MongoDB实现监控报警的平台,本次使用的方案均参考CSDN中的文章
环境说明
服务器:Centos 7.6
Docker :20.10.12
Prometheus : 最新镜像
Grafana :最新镜像
mongodb_exporter :0.11.2 (最新镜像无法获取数据,原因不知)
部署Prometheus
首先拉取Prometheus镜像,也可以启动容器时候再去拉取
docker pull prom/prometheus
因为我们现在没有Prometheus的yaml文件,可以自己写一套,不过我闲麻烦就先构建一个容器,复制出来一份修改后再挂到容器中
docker run -itd --name prometheus -p 9090:9090 prom/prometheus
#创建文件存放目录
mkdir /opt/yaml && cd /opt/yaml
#拷贝文件出来,然后这个容器就可以删了
docker cp prometheus:/etc/prometheus/prometheus.yml ./
docker rm -f prometheus
#修改配置文件
vim prometheus.yml
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["172.18.66.178:9090"] ##这里地址要改为本机IP
然后就可以启动容器了
docker run -itd --name prometheus -p 9090:9090 -v \
/opt/yaml/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /etc/localtime:/etc/localtime:ro prom/prometheus
#我把yaml文件挂载进容器中,在本机就可以更改,后续修改方便
启动后访问 IP:9090 如果没有异常就能看到Prometheus的界面了,接下来我们部署 Grafana
部署Grafana
拉取镜像
docker pull grafana/grafana
运行容器
docker run -d -p 3200:3000 --restart=always --name grafana grafana/grafana
#端口可以根据实际情况修改
访问 IP:3200就可以看到Grafana 页面了,默认用户名密码都是admin,第一次登陆会让你修改默认密码,注意保留,如果忘记密码可以通过命令重置
#进入容器
docker exec -it grafana /bin/bash
#切换目录
cd /usr/share/grafana/bin
#重置
./grafana-cli admin reset-admin-password admin

配置数据源来自Prometheus




填写完测试并保存

这样数据源就配置完成了,但是我们现在没有任何数据,因为没有添加任何节点数据到Prometheus,接下来添加MongDB数据源插件
部署Mongo-exporter
拉取镜像并指定版本
docker pull noenv/mongo-exporter:0.11.2
启动容器并填写MongoDB连接地址
docker run -d --name mongo-explorer -p 9800:9216 noenv/mongo-exporter:0.11.2 --mongodb.uri=mongodb://root:****@IP:28017,IP:28017,IP:28017
#根据实际连接地址填写,mongo-exporter的端口为 9800 一会要添加到Prometheus
容器启动后查看运行日志是否有异常
docker logs -f mongo-explorer-11 --tail 30


接下来就要修改Prometheus配置文件,添加mongo-exporter扩展,在Prometheus配置文件中加入下面的配置
- job_name: "mongodb_exporter"
scrape_interval: 5s
static_configs:
- targets: ['172.18.66.178:9800'] #注意端口
labels:
instance: mongodb_exporter
#注意与上面的job平齐,不然启动会报错,可以了解一下yaml文件规则
然后重启Prometheus容器
docker restart prometheus
如果正常启动就可以访问 IP:9090 查看插件是否加载


接下来我们去Grafana 添加数据模版

输入ID : 2583 然后加载

接下来我们就可以看到数据了

这样数据监控就已经搭建完成了,接下来我们需要配置报警功能,因为Prometheus分为2个部分,一部分是Prometheus用了收集数据,其本身没有报警功能,需要配合Alertmanager实现
部署Alertmanager
拉取镜像
docker pull prom/alertmanager
和Prometheus的套路一样,先创建一个容器复制yaml文件出来,再通过自己修改的yaml文件重新构建一个容器
docker run -d -p 9093:9093 --name alertmanager prom/alertmanager
#复制文件出来
docker cp alertemanager:/etc/alertmanager/config.yml /opt/yaml/alertmanager.yml
#删除容器
docker rm -f alertmanager
修改配置文件
global:
smtp_smarthost: '服务器地址:465' #发送相关配置,根据实际情况填写
smtp_from: '****@****.com'
smtp_auth_username: 'user@****.com'
smtp_auth_password: 'password'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '接收邮件的地址,第二个接收地址' #多个邮件地址可以用逗号隔开
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
接下来启动容器
docker run -d --name alertmanager -p 9093:9093 \
-v /opt/yaml/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager
容器启动后,在Prometheus配置文件中添加或修改Alertmanager相关信息
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets: ["172.18.66.178:9093"] #添加地址和端口
# - 172.18.66.178:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "/usr/local/prometheus/rules/*.rules" #这里是容器中的路径
##默认配置文件中是有这些信息的,修改后就可以使用了
编写报警规则
#创建规则存放目录,容器启动时会挂载到容器中,方便后续修改
mkdir -p /opt/rules && cd /opt/rules
#创建规则文件
vim mongo.rules
groups:
- name: mongo
rules:
- alert: MongodbNumberCursorsOpen
expr: mongodb_metrics_cursor_open{state="total_open"} > 10000
for: 15s
annotations:
summary: "MongoDB 当前打开数字光标数量数大于 10000!"
- alert: MongodbReplicationLag
expr: avg(mongodb_replset_member_optime_date{state="PRIMARY"}) - avg(mongodb_replset_member_optime_date{state="SECONDARY"}) > 10
for: 15s
annotations:
summary: "MongoDB 当前复制延迟过长!"
- alert: InstanceDown
expr: up == 0
for: 15s
labels:
team: node
annotations:
summary: "{{$labels.instance}}: job {{$labels.job}} 普罗米休斯宕机"
- alert: MongodbTooManyConnections
expr: mongodb_connections{state="current"} > 5000
for: 15s
annotations:
summary: "MongoDB集群当前连接数大于 5000"
#我现在只添加了这些规则,可以去搜有哪些规则可以添加
删除之前的Prometheus 容器,并重新创建一个
docker rm -f prometheus
#创建新容器
docker run --name prometheus-one -d -p 9090:9090 -v \
/opt/yaml/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /etc/localtime:/etc/localtime:ro -v /opt/rules/:/usr/local/prometheus/rules/ prom/prometheus
如果规则文件没有填写错误容器就已经启动了,访问 IP:9090 查看规则是否添加成功


到此为止我们就可以通过Prometheus + Grafana 实现对MongoDB分片集群监控报警功能