基于grafana和influxdb和collectd的性能监控系统

基本性能监控系统组成

  • Collectd+influxdDB+Grafana
  • Collectd是是一个守护(daemon)进程,用来定期收起系统和引用程序的性能指标,同时提供了以不同的方式来存储这些指标值的机制
  • InfluxDB 开源的,高性能的时序型数据库
  • Grafana一个非常酷的数据可视化平台,常常应用于显示监控数据,支持多种数据源。

环境搭建

  • Docker部署环境

  • 步骤:

    • 准备数据文件:types.db collectd.conf
    • 启动influxDB
    • 启动grafana
    • 启动collectd
  • 准备过程的报错:

    1. 在执行:docker cp temporary:/usr/share/collectd/types.db types.db命令时报错:

      successfully copied 512b to /home/xianzhe/桌面/types.db

      open /home/xianzhe/桌面/types.db: permission denied

      原因:虚拟机里的桌面文件夹的权限不够,无法打开新建文件。

      解决:更改文件夹权限:$ sudo chmod -R 777 lib64命令解析:-R 指目标文件夹及其所有子文件递归,777指全权限 lib64 目标文件夹 :即修改目标文件夹及其所有子孙的权限全开放。

      检查:查看文件夹权限:ls -l /home/xianzhe/这样会查看xianzhe下所有文件夹的权限,而不会查看xianzhe这个文件夹本身的权限。

准备数据文件

> docker create --name temporary mwaeckerlin/collectd
创建一个名为temporary的docker容器并且基于 mwaeckerlin/collectd 这个镜像。mwaeckerlin/collectd 镜像来源可能是 Docker Hub 或其他 Docker 仓库中可用的一个镜像,它可能包含了一个预先配置好的 Collectd 环境
> docker cp temporary:/usr/share/collectd/types.db types.db
从temporary容器中拷贝`usr/share/collectd/types.db`文件 到当前目录下的types.db文件
> docker cp temporary:/etc/collectd/collectd.conf collectd.conf
从temporary容器中拷贝`/etc/collectd/collectd.conf`文件 到当前目录下的collectd.conf文件
(一般当前目录为桌面目录)
> sudo mkdir -p <your path>
> sudo mv -i types.db <your path>
> sudo mv -i collectd.conf <your path>
> docker rm temporary

启动 InfluxDB服务

docker run -d \
    --name influxdb \
    -e INFLUXDB_COLLECTD_ENABLED=true \
    -e INFLUXDB_COLLECTD_DATABASE=_internal \
    -e INFLUXDB_COLLECTD_TYPESDB=/usr/share/collectd/types.db \
    -e INFLUXDB_COLLECTD_SECURITY_LEVEL=none \
    -v <your path>/types.db:/usr/share/collectd/types.db \
    influxdb:1.8
    
    
    解析:上面应该是启动一个名为influxdb的容器,然后 -e全是容器的权限,设置啥的,然后 -v好像是获取的镜像地址,然后没找到,就到dockhub去找这个名为influxdb :1.8的镜像。输入的时候全输入就好,上面的命令慢慢敲

启动grafana服务

docker run -d \
    --name=grafana \
    -p 3000:3000 \
    --link influxdb:influxdb grafana/grafana 
    解析:启动一个名为grafana的容器,与本地的映射端口为 3000  映射虚拟机的3000端口
    --link 需要连接的 influxdb服务对应的容器名为 influxdb  
    然后镜像时 grafana/grafana
    然后本地找不到,就到线上找
    
    默认用户名/密码:admin/admin

启动collectd服务

docker run -d \
    --name collectd \
    --hostname localhost \
    --link influxdb:influxdb \
    -v <your path>/collectd.conf:/etc/collectd/collectd.conf \
    mwaeckerlin/collectd
    创建并运行一个名为collectd的容器,然后是设置hostname名localhost,连接influxdb服务对应的启动容器influxdb,-v 则是将主机上的 <your path>/collectd.conf文件挂载到容器里的/etc/collectd/collectd.conf文件  然后是镜像源:mwaeckerlin/collectd

注意上述三个服务都要启动在同一个虚拟机上或者本地机器上

查看正在运行的容器:docker ps

环境配置与监控环境的使用

Grafana中配置数据源
类型: InfluxDB
URL: http://influxdb:8086
Database: _internal
Grafana 中配置Dashboard
Import id 555

image
image
image

image
image
image
image
image

如果一开始点进来没有influxdb数据库,就点击add database,添加一下就好

然后进入可视化页面:

配置文件

collectd 启用对应的监控数据
编辑配置文件 collectd.conf
启用对应的监控选项

使用vim collectd.conf
然后 输入 :set number

输入 :/uptime
然后找到 #load plugin uptime
光标移到#号位置,按下键盘s,然后就进入了编辑模式并且删除了光标所指字符,然后按esc退出编辑模式
输入 :wq 保存并退出
如果因为权限问题无法修改,就 :q,先退出
然后输入权限修改命令 $ sudo chmod -R 777 ./
然后查看权限:ls -l ./
然后再进行修改

报错:没有数据,下面的panel报错:“missing parameter: __auto_interval”

原因:在grafana页面里没有填写host:localhost 勾选箭头所指的地方,因为这个参数本身应该是grafana自动填写的,然而并没有,大概是因为并没有告诉grafana要监控谁的数据,因为当时并没有填写host,这个host要填的东西好像是当初创建collectd容器时指定的hostname

image-20240326162140408

注意需要下载 influxdb 1.8的镜像,因为好像下载最新的influxdb的话,根据已有的命令行,根本连不上去。

如果需要放开某些面板比如 uptime(上图的N/A)的监控数据,则要进入collectd.conf文件里,然后找到# loading plugin uptime 的那行,将#删掉。

现在讲解一下涉及到的linux修改文件的命令:首先去到所在文件夹,

vim 文件名
注意以下的:都是要切切实实在键盘里嗯出来,输出的
输入  :/uptime    这一句会找到文件里包含uptime字样的段落
按下键盘 i,或者a,或者s,当按下s时会在进入编辑模式的同时删除光标所指的字符
按下esc退出编辑模式
输入:wq   保存并退出

从某种意义来说  键盘按下 : 会让文件进入命令模式 
做完上述操作后,重启collectd容器即可  sudo docker restart collectd

总结命令行

准备数据,没什么坑

> docker create --name temporary mwaeckerlin/collectd
> docker cp temporary:/usr/share/collectd/types.db types.db
> docker cp temporary:/etc/collectd/collectd.conf collectd.conf
> sudo mkdir -p <your path>
> sudo mv -i types.db <your path>
> sudo mv -i collectd.conf <your path>
> docker rm temporary

启动influxdb服务容器,老师的代码里没有 -p 8086:8086这个挂载端口的操作。我这里加上了。

因为如果不加,那么开启容器时,确实显示在监听8086端口,可是在linux里查端口时却又显示8086端口没人在用,问题在于,容器里的那个显示在监听8086端口是指容器内部的8086端口在被监听,不代表其宿主机,即linux的8086端口在被监听,所以这里我给它进行了端口绑定。

而且必须要指定下载1.8的镜像,因为1.8稳定,而且如果下载最新的镜像,后续操作里在grafana里会连接不上数据库

docker run -d \
    --name influxdb \  
    -p 8086:8086\
    -e INFLUXDB_COLLECTD_ENABLED=true \
    -e INFLUXDB_COLLECTD_DATABASE=_internal \
    -e INFLUXDB_COLLECTD_TYPESDB=/usr/share/collectd/types.db \
    -e INFLUXDB_COLLECTD_SECURITY_LEVEL=none \
    -v <your path>/types.db:/usr/share/collectd/types.db \
    influxdb:1.8

启动grafana服务容器,没什么坑

docker run -d \
    --name=grafana \
    -p 3000:3000 \
    --link influxdb:influxdb grafana/grafana 

默认账号密码 admin / admin

启动collectd容器服务,有坑,要注意-v 操作里是挂载文件或者挂载目录,如果跑下面脚本时报错,则先看容器日志:sudo docker logs 容器名 然后发现是挂载失败:说是无法将文件夹挂载到文件里,换句话说就是两边不对等,要么全是文件,要么全是文件夹。但是从命令来看,很明显是文件,但是眼见未必为实。

检查是否为文件:ls -l ./会输出当前文件夹下的东西的权限,而不会输出当前文件夹本身的权限,如果权限开头是-则为文件,如果为d则为文件夹。

docker run -d \
    --name collectd \
    --hostname localhost \
    --link influxdb:influxdb \
    -v <your path>/collectd.conf:/etc/collectd/collectd.conf \
    mwaeckerlin/collectd