使用Prometheus和Grafana构建集群监控系统(一): 配置与搭建

1, 基础知识

目前在服务器监控领域, 除了老牌的Zabbix和nagios外, Prometheus和Grafana也是目前较为流行的监控方案, 本文介绍Prometheus和Grafana的配置方法.

什么是Grafana?

Grafana是一个图形化工具, 它可以从很多种数据源(例如Prometheus)中读取数据信息, 使用很漂亮的图表来展示数据, 并且有很多开源的dashborad可以使用, 制作自己的dashboard也很简单, 总之, 可以快速地搭建起一个非常精美的监控平台.

什么是TSDB?

TSDB(Time Series Database)时间序列数据库, 简单来说就是存储随时间变化的数据的数据库. 什么是随时间变化的数据呢?举个简单的例子, 比如, CPU使用率, 典型的随时间变化的量, 这一秒是50%, 下一秒也许就是80%了. 或者是温度, 今天是20度, 明天可能就是18度了.

常见的TSDB(时间序列数据库): influxDB, RRDtool, Graphite, OpenTSDB, Kdb+, Druid, KairosDB, Prometheus等.

什么是Prometheus?

Prometheus(中文名:普罗米修斯)是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB). Prometheus使用Go语言开发, 是Google BorgMon监控系统的开源版本. 2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目.

Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态, 任意组件只要提供对应的HTTP接口就可以接入监控. 不需要任何SDK或者其他的集成过程. 这样做非常适合做虚拟化环境监控系统, 比如VM、Docker、Kubernetes等. 输出被监控组件信息的HTTP接口被叫做exporter. 目前互联网公司常用的组件大部分都有exporter可以直接使用, 比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等).

Prometheus获取数据的策略是Pull而不是Push, 也就是说, 它会自己去抓取, 而不用你来推送. 抓取使用的是HTTP协议, 在配置文件中指定目标程序的端口, 路径及间隔时间即可. 这也就意味着任何程序想要使用Prometheus存储数据都很简单, 定义一个HTTP接口即可.

什么是exporter?

prometheus可以理解为一个数据库+数据抓取工具, 工具从各处抓来统一的数据, 放入prometheus这一个时间序列数据库中. 那如何保证各处的数据格式是统一的呢?就是通过这个exporter. Exporter是一类数据采集组件的总称. Exporter负责从目标处搜集数据, 并将其转化为Prometheus支持的格式, 它开放了一个http接口(以便Prometheus来抓取数据). 与传统的数据采集组件不同的是, Exporter并不向中央服务器发送数据, 而是等待中央服务器(如Prometheus等)主动前来抓取.

Prometheus提供多种类型的Exporter用于采集各种不同服务的运行状态. 目前支持的有数据库、硬件、消息中间件、存储系统、HTTP服务器、JMX等. https://github.com/prometheus这里有很多写好的exporter, 我们可以直接使用. 本文使用的node-exporter是用来收集节点上的metrics监控数据的.

2, 环境准备

本文准备了3台机器, 分别是

192.168.33.10, 安装prometheus及Grafana
192.168.33.11, 安装node_exporter(监听TCP 9100 端口)
192.168.33.12, 安装node_exporter(监听TCP 9100 端口)

3, 安装node_exporter

$ wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz

$ tar zxvf node_exporter-0.16.0.linux-amd64.tar.gz

$ cd node_exporter-0.16.0.linux-amd64

$ nohup ./node_exporter-0.16.0.linux-amd64/node_exporter &

这里我们也可以把node_exporter写成systemd服务

$ sudo mv node_exporter-0.16.0.linux-amd64 /usr/local/node_exporter

$ sudo groupadd node_exporter
$ sudo useradd -g node_exporter -m -d /usr/local/node_exporter -s /sbin/nologin node_exporter

$ sudo chown -R node_exporter:node_exporter /usr/local/node_exporter

$ sudo vim /etc/systemd/system/node_exporter.service
[Unit]
Description=Node_exporter
DefaultDependencies=no

[Service]
Type=simple
User=node_exporter
RemainAfterExit=yes
ExecStart=/usr/local/node_exporter/node_exporter --collector.textfile.directory=/usr/local/node_exporter/ --web.listen-address=:9100
Restart=on-failure

[Install]
WantedBy=multi-user.target

$ sudo systemctl start node_exporter.service
$ sudo systemctl enable node_exporter.service

4, 安装prometheus

$ wget https://github.com/prometheus/prometheus/releases/download/v2.4.3/prometheus-2.4.3.linux-amd64.tar.gz

$ tar zxvf prometheus-2.4.3.linux-amd64.tar.gz

$ cd prometheus-2.4.3.linux-amd64

$ vim prometheus.yml    #添加2个新的job
global:
  scrape_interval:     15s
  evaluation_interval: 15s
  # scrape_timeout is set to the global default (10s).
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093
rule_files:

scrape_configs:

  - job_name: 'prometheus'
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
    - targets: ['localhost:9090']

  - job_name: 'linux1'
    static_configs:
      - targets: ['192.168.33.11:9100']
        labels:
          instance: server1
  - job_name: 'linux2'
    static_configs:
      - targets: ['192.168.33.12:9100']
        labels:
          instance: server2
$ nohup ./prometheus &    #运行Prometheus

这里我们可以写成systemd服务

$ cd ..
$ sudo mv prometheus-2.4.3.linux-amd64 /usr/local/prometheus

$ sudo groupadd prometheus
$ sudo useradd -g prometheus -m -d /usr/local/prometheus -s /sbin/nologin prometheus

$ sudo chown -R prometheus:prometheus /usr/local/prometheus

$ sudo vim /etc/systemd/system/prometheus.service  #写入如下内容
[Unit]
Description=prometheus
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/usr/local/prometheus
Restart=on-failure
[Install]
WantedBy=multi-user.target

Prometheus自带一个比较简单的Web(监听在9090端口), 可以查看表达式搜索结果/报警配置/prometheus配置/exporter状态等.

访问http://ip:9090的界面如下图
Prometheus的web界面

Prometheus的web界面

5, 安装配置Grafana

http://docs.grafana.org/installation/这里提供了在不同系统上安装Grafana的方法, 此处提供ubuntu/debian 64bit的安装方法(官方安装文档在此https://grafana.com/grafana/download?platform=linux).

$ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_5.3.0_amd64.deb 
$ sudo dpkg -i grafana_5.3.0_amd64.deb 

$ sudo systemctl status grafana-server    #应该是默认进入了运行的状态

$ sudo systemctl enable grafana-server

Grafana默认监听在3000端口上, 所以我们可以打开http://ip:3000来访问Grafana页面, 访问http://ip:3000的界面如下图
Grafana登陆界面

初始登陆用户名和密码为admin/admin, 第一次登陆时, 可能会要求你设置一个新密码.

进入Grafana第一步, 是设置一个数据源(Data Source), 我们按照如下图所示的方式设置即可.
Grafana添加Data Source

有了Data Source以后, 我们就可以添加各种精美生动的图表了. 这部分内容将在下一篇博文里讲述.

注意:
1, 如果是阿里云的ECS的话, 系统里无须安装exporter等agent, 阿里云直接提供了各种方便的接口来对接Grafana, 详情请看这篇文章.

发表评论

电子邮件地址不会被公开。