前言
《基于 Prometheus 和 ELK 的基础平台监控系统设计与实现》,这是我在本科阶段的毕业设计,通过引入 Prometheus 和 ELK 架构实现企业对指标与日志的全方位监控。并且基于云原生,使用容器化持续集成部署的开发方式,通过 SpringBoot 和 Vue 的前后端分离技术,开发出基础平台监管系统,实现对所有基础平台的全面监控与可视化管理,让每一个监控项精确跟踪,每一个流程责任到人,每一个问题闭环处理。
首先我先整体概述一下我的业务,简单来讲就是,利用 Prometheus 实现对组件的指标监控(比如对服务器的使用率监控,超过了一个值就报警),利用 ELK 实现对日志的监控(比如监控 Java 的一个项目,监控到一个日志出现 ERROR 标签,就报警),报警会通知到对应的负责人,平台也会跟踪处理情况,以及其他一些辅助功能。
为什么选择这样一个题目?其实也是一个巧合,当时我也不知道做什么,老师直接给了我们组很多题目,让我们自己选,我选择了其中一个,题目是什么什么基础平台监控系统。当时由于我的知识匮乏,我认为这个监控是指对公司业务的监控,也就是类似于一个 OA 系统。但其实老师指的是对支撑公司的网络平台的各个组件的监控,监控他们的各项指标,像是 CPU 占用率这种,下图就是老师想让我完成的一个大概内容。我对这个内容是完全没有涉及,只能从零开始学。
毕业论文必须要有创新点,我的创新点就是不仅在平台中实现了指标监控,还加入了日志监控。市面上有很多做这种现成指标监控的平台,做日志监控平台的几乎没有,可能都是自己搭,具体我也不清楚为什么,可能指标更为关键,更直接可以看到问题所在,而日志,可能更多的作用是在报警之后,来 debug 的。当然我这个只是毕业设计,其实主要就是实现一个业务,体现工作量,并不具备什么实用价值。
这篇论文包括毕业设计,我在当时是拿了优秀毕业设计,当然我知道我的本科并不好,和其他好学校的人差距还是很大,但这个毕设我觉得还是有一点意义吧。这个意义不是说能解决业界的某些问题,我完全没有这个能力。而是说,我觉得下面 Web 架构、指标监控架构、日志监控架构我觉得可能能对一些初学这提供一些帮助。因为这些内容网络上并没有直接现成的东西,都是通过我自己的知识储备、自己的试错、网络上各种文章,最后做出来的一套东西。所有的源码都在 Github 上,结构、注释非常清晰,我希望这会对大家有些帮助。如果对大家有帮助,可以帮我点个 Star 支持一下我。
需求概述
需求可以分为以下几点:
- 信息采集:需要满足对支撑平台的指标、日志的采集,包括应用程序、数据库、中间件、主机等。并且要满足可以持续、实时的采集各类信息,以及对信息进行适当的清洗,提高其质量与准确性。
- 监控报警:可以根据监控需求自定义监控规则,以及告警的方式,包括第三方、邮件、短信等。并且需要实时的监控,及时掌握系统的运行状态、性能情况等。以及事后的信息查阅,便于之后的分析。
- 日常管理:包括对数据源的添加、报警规则的添加、报警后处理的跟踪等,一切都责任到人,进行全方位管理。以及对人员权限、任务分配、知识库等内容的实现。
- 综合分析:通过图表、报表的形式,将数据转化为可视化的形式,定期推送给运维人员,便于之后更加全面、准确的分析系统运行情况。
系统架构
Web架构设计
在 Web 方面,使用前后端分离的方式。在前端方面使用了 Vue 进行交互的实现,利用其可以与 HTML 中字段进行双向绑定的特性,可以快速完成数据渲染的工作。并且利用它组件化的思想,可以减轻许多重复 HTML 的编写,提升代码的复用性,以及可读性。
在前端 UI 上使用了 Metronic,它是基于 Bootstrap 的网页界面框架,也在其基础上提供了一些扩展和增强功能,如布局管理、用户界面元素、图表、表格、表单和自定义样式等等。使用 Metronic 可以更快地创建现代化、美观的 Web 页面,并提供了丰富的工具和插件进行定制,减少了开发人员的工作量,增加了项目的可维护性。并且依然保留了 Bootstrap 的特性,做到了响应式开发的效果。
使用 Nginx 作为前端服务器,一方面可以更符合前后端分离的思想,另一方面 Nginx 底层利用 I/O 多路复用和多进程的方式,可以接受高并发的请求,速度也更快。而且配置简单,本身就是由很多模块组成的,扩展性强。比起 Tomcat,Nginx 是 HTTP Server,而 Tomcat 是 Application Server。HTTP Server 关心的是 HTTP 协议层面的传输和访问控制,客户端通过 HTTP Server 访问服务器上存储的资源。Application Server 是一个应用服务器,它首先需要支持开发语言的运行环境,以及需要支持一些其它的规范,例如类库、安全方面的特性,所以会更加笨重,从而使用 Nginx,进行一定的解耦,在性能上进一步的提升。
在后端使用了传统的 SpringBoot 技术,数据库则使用了 MySQL,来进行关系性数据的存储。使用了 MinIO 来实现对象存储。以及使用了 Redis,主要用来存储 JSessionID,利用 Redis 内存存储的特性,可以进行高速读写。对于传统的方式,如果需要不同服务器上 Session 数据共享,需要互相进行复制。而 Redis 这种方式可以让 Session 集中存储。需要说明的是这里 Redis 不仅仅存的是 JSessionID,还有 JSessionID 对应的 Session 中的数据。这样当客户端请求服务器,产生 Session 以及 SeesionID,就会把它存到 Redis 中,下次直接从 Redis 中取就行。对于该 SpringBoot 项目,利用了 SpringSession 来简化操作,它非常好的与Redis进行了集成。这样做不仅解耦了 Session 系统,便于未来系统或者微服务的扩展,而且利用 Redis 可以方便设置 Session 过期时间的特性,可以实现用户的持久化登录。
最后利用 Github,Jenkins,Docker 的方式,实现了自动化部署。每次当完成后端代码,将源码托管于 Github 上,使用 Git 进行版本控制和合并代码。在 Jenkins 中创建一个 Pipeline 项目,并配置与 Github 的 Webhook 集成,当代码仓库发生变化时触发 Jenkins Pipeline 任务。而在 Pipeline 任务中,会使用 Docker 构建一个 Docker 镜像,并发布到 Linux 服务器中进行部署。如图4-2展示了 Jenkins 上部署的情况。
该项目利用以上技术实现前后端分离的部署,并且利用 Github、Jenkins、Docker 这三者实现了 CI/CD(Continuous Integration/Continuous Deployment)的流程,持续集成与持续部署。这种技术方案在提高开发效率和资源利用率方面具有明显优势。
指标监控架构设计
对于指标监控,首先需要进行对数据的采集,需要从不同来源收集数据,例如服务器、容器、网络设备等。这里我采用了 Prometheus 来完成这项工作,它最大的优势在于采用了 Pull 模式,比起传统的 Push 模式,它更加具有可控性,请求将由 Prometheus 发起,可以控制采集的频率和数据,避免了系统由于瞬时高峰负载而崩溃的风险;更加轻量,对于被监控的资源消耗更少;更加灵活,丰富的 Exporter,也就是埋在目标客户端的 Agent,可以方便的扩展和添加新的监控目标(特别的,如果要监控 SpringBoot 需结合 Micrometer 使用);更加安全,由于Prometheus不需要向被监控主机开放端口,有安全保障;而且采用了 Pull 模式,监控的数据在接收端暂存,可以更好地避免数据在传输过程中的丢失;易于查询,Prometheus 提供了强大的查询语言 PromQL,对数据可以进行高效处理。
在服务发现上使用了 Consul 来进行 Prometheus 和 Exporter 的连接。像传统的 Nagias,是基于 Push 模式的,这意味着必须在监控对象的每一个节点上安装相应的 Agent 程序,并且通过配置指向中心的 Nagias 服务,这样的话,受监控对象与中心监控服务器之间是一个强耦合的关系。对于一组比较少的服务器,这种手动更改配置信息的方式是非常方便的。但如果监控目标多了起来,我们需要频繁对配置文件进行修改,无疑给运维人员带来很大的负担,也大大增加了出错的可能性。为此,Prometheus 可以搭配 Consul 来实现服务发现,这样就可以摆脱手工的方式,由 Consul 动态进行自动发现与自动更新。
在数据持久化上,选择了目前性能最好的 InfluxDB。Prometheus 为了更好的监控性能,默认使用本地文件进行存储,但是这种方式的缺点是无法持久化,一旦重启就会丢失所有数据。所以需要接入第三方 TSDB 数据库。InfluxDB 是一个用 Go 语言编写的时序数据库,与传统关系型数据库相比,它对时序数据场景有专门的优化,有更加优异的性能。
在可视化上,选择了 Grafana 来实现。Grafana 提供了丰富的图表类型和设置选项,基于此用户可以结合 PromQL,快速创建自定义、交互性强的可视化图表。并且 Grafana 是开源的,拥有广泛的用户和开发者社区,提供丰富的文档、教程和模版,解决问题和分享经验非常方便。
在报警上选用了 Alertmanager,它的功能非常强大,主要有以下几个方面,首先它可以做到告警聚合,可以对相同或相似的告警进行聚合,只保留最新一个告警条目,以减少重复告警的数量,提高操作人员处理告警的效率;告警合并,当多个告警条目描述相同的问题时,可以将它们合并为一个包含所有相关信息的告警条目;可以同时将告警输出到多个目的地,例如 SMTP 电子邮件、Webhook 回调地址等;可以根据用户定义的路由规则来路由告警条目,选择合适的输出目的地。可以控制告警的级别、到期时间、过期时间等,达到合理控制告警信息的输出频率和持续时间的目的。这些功能使得 Alertmanager 可以简化运维人员处理告警的工作流程,最大限度地减少无用信息并确保关键告警的及时传,这些都是提高监控系统运用效果的重要保障。
以上提到的技术是现代分布式系统架构中常用的监控、告警、配置管理和数据可视化工具,它们相互配合,实现了对系统的全方位监控和管理,帮助用户更好地理解分布式系统的运行状态和问题,并及时处理这些问题,保证分布式系统的高可用性和可靠性。
日志监控架构设计
在本架构中,Filebeat 充当了采集器的角色。它本身隶属于 Beats 家族,Beats 还包括Metricbeat、Packetbeat 等,Filebeat 则是专门用来收集文本的组件。它能够实时收集服务器及应用程序的日志数据,并将其转发至Kafka。这其中 Logstash 本身也可以采集数据,但是相对于 Logstash 比较庞大的代码库和消耗较多的资源,Filebeat代码库较小,占用系统资源也相对较少,更加轻量,更适合部署在较小的环境中。并且 Filebeat 使用 Go 语言编写,对 CPU 和 I/O 资源的利用率更高,能够快速高效地扫描和采集大量的日志数据,并将其传输到下游处理器。
Filebeat 搜集的数据会传送到 Kafka,Kafka 是一种高吞吐量的消息队列系统,能够缓解数据传输过程中的高频流量并保证数据的可靠传输。在这里,Kafka 接收 Filebeat 采集的本地日志文件,最主要提供了缓解流量峰值的功能,Kafka 通过将数据缓存在其集群中,然后进行批量写入到下游系统的方式,能够有效地缓解突发的高频流量带来的压力。并且 Kafka 具有很高的可靠性和容错性,以及可以解耦数据源和消费者,增强系统的可维护性。
Logstash 是一款用于数据收集、分析和处理的开源工具。这里 Logstash 消费来自 Kafka 的消息,对其进行解析、过滤、转换等格式化处理,并将处理过的事件输出到 Elasticsearch 中进行存储,以便之后进行搜索。
接着,Elasticsearch 作为搜索引擎和数据分析平台来处理过滤后的日志数据,并将其存储在其中。Elasticsearch 是一个基于实时搜索的分布式搜索引擎,能够实时地、快速地查询数据。这使得它作为日志存储引擎时,能够提供实时的日志响应和查询功能,让用户快速获得实时的监控数据。
最后,Kibana 提供了可视化界面,允许用户以直观、易于理解的方式查询、分析和展示数据。用户可以使用 Kibana 自定义或从官方社区中配置各种图表、可视化和仪表板来监控各种日志,以便检测和解决问题。
除了以上的技术组件外,通过 ElastAlert 还提供了一个强大的预警和通知服务。它可以根据事先定义的规则和条件,自动检测异常和问题,并及时通知相关人员。这大大缩短了故障排查和响应的时间。在此基础上再一次引入了Alertmanager,但与指标监控架构中不同的的是,这里仅作为一个转发的功能,目的是能与指标监控传回的 JSON 数据格式保持一致。
以上提到的技术是现代日志采集、处理、存储、搜索和可视化的主要工具,它们相互协作,实现了对大量日志数据的高效管理和分析,帮助用户更快地理解分布式环境的运行状况,提高分布式系统的可用性和稳定性。
功能说明
-
登录注册功能
在登录功能上不仅仅使用传统的账号密码登录,还接入了 QQ 和钉钉来实现第三方登录。不仅如此,也利用 Vue 的局部刷新和双向绑定实现很好的交互,当账号或者密码错误时,会有提示字符出现。并且还使用了 reCAPTCHA 进行人类识别,比起传统验证码的方式,可以为用户提供更好的体验效果。 如果忘记密码可以跳到忘记密码页面,通过阿里云接入的手机号短信验证的方式来进行重制密码。
-
首页数据展示功能
这是用户登录后会首先跳到的页面,展示了已完成巡检数、普通告警数等内容,为运维人员提供宏观的数据展示。
-
指标监控功能
在该页面用户可以对监控对象进行增删改查,包括了名称、服务器地址等内容等,并且可以进行增删改查,以及导出功能。
点击图表,可以进入查看集成的 Grafana 图表。
进入对应监控对象,可以查看具体规则的信息,以及对该对象的监控规则进行增删改查。
下方还有该对象的报警信息,可以查看报警时间、名称、内容等,以及可以下载对应人员解决后上传的工单。
-
日志监控功能
在该页面用户可以对监控对象进行增删改查,包括了名称、服务器地址等,并且可以进行增删改查,以及导出功能。点击图表,可以进入查看集成的 Kibana 图表。进入对应监控对象,可以查看具体规则的信息,以及对该对象的监控规则进行增删改查。下方还有该对象的报警信息,可以查看报警时间、名称、内容等,以及可以下载对应人员解决后上传的工单。
-
文件监控功能
用户可以查看各个监控文件,以及对其增删改查。添加后定期后端会进行钉钉通知,提醒你需确认文件是否正常,是否备份成功。
-
巡检计划功能
在该页面管理员可以为特定人员制定巡检计划,并上传巡检单。
对应人员可以查看自己的巡检计划,并且有日历进行可视化。在规定时间上传自己的巡检表。
-
报警工单功能
当有自己负责的报警规则报警时,会自动添加到该页面,对应运维人员需解决后提交工单,报告问题。
-
报表功能
运维人员可以下载对应的周报,它们会在规定时间自动生成。
-
知识库功能
运维人员可以上传资料,供所有人下载学习。
-
展示看板功能
利用Echarts 构建了大屏展示,展示了已完成巡检数、普通告警数等内容,为运维人员提供宏观的数据展示。
-
其它辅助功能
用户可以去帮助中心查看一些开发内容,可以跳到 Github 代码仓库,可以查看 Swagger 接口文档。
-
人员管理功能
运维人员自己可以查看修改自己的个别信息。而对于超级管理员,他会有更大的权限,可以对所有运维人员进行增删改查。
-
服务器检查功能
后端会定期对服务器各个组件进行 Socket 测试连接,如有问题会钉钉通知。
并且提供了拓扑图进行可视化展示。