很多公司已经开发了监控解决方案, 解决了指标收集, 展示, 预警发送等一系列问题.
本文介绍的监控解决方案由高性能时序数据库 InfluxDB, 时序分析监控工具 Grafana 及 Agentless 自动化工具 Ansible 构成: Ansible 负责不间断抓取服务器硬件指标数据, 并将数据存储在数据库 InfluxDB 中; 时序分析监控工具 Grafana 负责从 InfluxDB 中读取并展示指标数据, 设定阈值, 配置预警.
一, 开发环境
通过三台本地虚机还原监控对象: 一台为监控服务器(monitor), 另两台为可接入监控服务的服务器(server1 和 server2). 使用 Vagrant 管理开发环境, 执行 Vagrant up monitor 命令, 通过下方 Vagrantfile 开启并配置监控服务器. 如果需要把 server1 和 server2 接入监控服务中, 可以稍后启动这两台虚机服务器.
Ansible 负责配置监控服务器, 包括安装 InfluxDB,Grafana 及 Ansible 以及配置监控服务. 为了保证代码整洁, 结构清晰, 每个工具的安装任务都保存在单独的 YAML 文件夹中. include_tasks 可动态地将分组后的任务纳入整个流程中.
二, 监控服务配置
监控服务配置步骤如下方 monitoring-configuration.YAML 文件所示. 首先, 创建 monitor 数据库, 生成 API, 用于完成各项数据库操作. 通过 Ansible URI 与网页服务交互. 从监控对象服务器中提取的所有指标均存储在监控数据库中.
接下来创建 Grafana 数据源, 对接数据库 InfluxDB, 读取全部指标数据. Grafana 提供 API, 支持通过 JSON 格式的内容最大限度地利用配置. 除数据源外, 还创建了 Slack 通知渠道和第一个面板.
Slack 通知渠道指向测试版 Slack 工作区. 用户可创建自己的工作区, 并邀请运维人员加入. 同时创建传入 webhook, 取代 JSON URL 字段值.
初始面板会显示已使用内存百分比. 用户可以添加其他指标或创建新面板. 可将阈值设定为 95%, 这样便能直观地查看展示结果; 同时配置预警: 当最后五个指标值大于等于 95% 时, 则向 Slack 渠道发送通知.
Ansible 支持在多个服务器上同时执行任务. 此外, Ansible 可通过清单文件 (/etc/ansible/hosts) 了解目标服务器的分组情况. 在监控服务配置期间, 在库存文件中创建 monitored_servers 分组. 该组内的所有服务器会被自动监控.
服务器接入监控服务后, 为防止 Ansible 核验 SSH 密钥, 需禁用 Ansible 配置文件 (/etc/ansible/ansible.cfg) 中的默认功能, 以便采集新增服务器的指标.
通过 Ansible playbook(playbook-get-metrics.YAML)连接所有监控对象, 提取所有相关指标. Ansible playbook 位于 /etc/ansible/playbooks 目录下, 通过 CRON 配置, 每分钟执行一次: 每分钟采集, 存储, 显示一次指标数据; 如发现问题, 则发送预警.
三, 采集指标数据
下方 playbook-get-metrics.YAML 文件负责从 monitored_servers 中提取所有重要指标, 并将采集到的数据存储在 monitor 数据库中. 初始面板仅采集内存占用比例. 用户可在 playbook 中添加任务, 采集其他指标.
InfluxDB 数据存储 API 用于存储监控数据库中的指标数据. 192.168.33.10 为监控服务器的 IP 地址, 8086 为 InfluxDB 端口号. 数据库中, 已使用内存的 key 为 used_mem_pct. 用户需为每个指标配置合适的 key.
Ansible 默认会采集目标主机信息, 用于执行任务. 例如, 根据主机名称 (ansible_hostname) 可以判断指标从哪个服务器上采集的. 此外, 通过 Ansible 采集到的实际使用内存 (ansible_memory_mb.real.used) 和累计实际使用内存 (ansible_memory_mb.real.total) 可以计算出内存消耗百分比. 掌握这些数据后, 可以执行 ansible monitor -m setup -uvagrant -k -i hosts 命令. 弹出 SSH 密码时, 输入 Vagrant. 前述信息均为 JSON 格式, 可使用点符号访问值.
四, 在监控服务中接入服务器
执行 Vagrant up monitor 命令, 启动监控服务器.
然后在浏览器中输入 http://192.168.33.10:3000, 访问 Grafana. 用户名和密码均为 admin. 点击 used_mem_pct 面板链接, 查看折线图中监控服务器的数值.
接入其他服务器, 查看折线图中的数值. 启动接入其他服务器, 查看折线图中的数值. 启动 server1, 执行 Vagrant up server1 命令, 继续执行 ansible-playbookplaybook-add-server.YAML -u Vagrant -k -i hosts 命令.-u 参数用于定义 SSH 用户,-k 参数提示输入密码,-i 用于定义监控服务器.
获取新服务器 IP 地址和 SSH 证书后, 便可实现 Ansible 与服务器对接. 在监控服务器 / etc/ansible/hosts 文件中插入一行代码后, 便可将服务器接入监控服务中. CRON 再次执行 playbook-get-metrics.YAML 时, server1 便会成为监控对象. 这样就可以采集, 存储, 展示 server1 的各项指标数据.
五, 结论
本文介绍的监控解决方案成本较低且易于实施, 具有以下优势: Ansible 不需要在所有监控对象中安装 agent; 所有指标数据存储在高性能时序数据库 InfluxDB 中; 利用 Grafana 统一展示数据, 并支持配置预警.
来源: https://www.qcloud.com/developer/article/1498161