写在前面

公司有一套自建的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

配置数据源
URL填写成你的IP地址和端口

填写完测试并保存

这样数据源就配置完成了,但是我们现在没有任何数据,因为没有添加任何节点数据到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
没有报错表示连接正确,容器已经运行起来了,然后访问 IP:9800/metrics 查看是否有数据
有输出信息表示数据正常

接下来就要修改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

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

没有数据的话可以多等一会

这样数据监控就已经搭建完成了,接下来我们需要配置报警功能,因为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分片集群监控报警功能