《基于 Prometheus 和 ELK 的基础平台监控系统设计与实现》,这是我在本科阶段的毕业设计,通过引入 Prometheus 和 ELK 架构实现企业对指标与日志的全方位监控。并且基于云原生,使用容器化持续集成部署的开发方式,通过 SpringBoot 和 Vue 的前后端分离技术,开发出基础平台监管系统,实现对所有基础平台的全面监控与可视化管理,让每一个监控项精确跟踪,每一个流程责任到人,每一个问题闭环处理。
首先我先整体概述一下我的业务,简单来讲就是,利用 Prometheus 实现对组件的指标监控(比如对服务器的使用率监控,超过了一个值就报警),利用 ELK 实现对日志的监控(比如监控 Java 的一个项目,监控到一个日志出现 ERROR 标签,就报警),报警会通知到对应的负责人,平台也会跟踪处理情况,以及其他一些辅助功能。
为什么选择这样一个题目?其实也是一个巧合,当时我也不知道做什么,老师直接给了我们组很多题目,让我们自己选,我选择了其中一个,题目是什么什么基础平台监控系统。当时由于我的知识匮乏,我认为这个监控是指对公司业务的监控,也就是类似于一个 OA 系统。但其实老师指的是对支撑公司的网络平台的各个组件的监控,监控他们的各项指标,像是 CPU 占用率这种,下图就是老师想让我完成的一个大概内容。我对这个内容是完全没有涉及,只能从零开始学。
毕业论文必须要有创新点,我的创新点就是不仅在平台中实现了指标监控,还加入了日志监控。市面上有很多做这种现成指标监控的平台,做日志监控平台的几乎没有,可能都是自己搭,具体我也不清楚为什么,可能指标更为关键,更直接可以看到问题所在,而日志,可能更多的作用是在报警之后,来 debug 的。当然我这个只是毕业设计,其实主要就是实现一个业务,体现工作量,并不具备什么实用价值。
这篇论文包括毕业设计,我在当时是拿了优秀毕业设计,当然我知道我的本科并不好,和其他好学校的人差距还是很大,但这个毕设我觉得还是有一点意义吧。这个意义不是说能解决业界的某些问题,我完全没有这个能力。而是说,我觉得下面 Web 架构、指标监控架构、日志监控架构我觉得可能能对一些初学这提供一些帮助。因为这些内容网络上并没有直接现成的东西,都是通过我自己的知识储备、自己的试错、网络上各种文章,最后做出来的一套东西。我希望这会对大家有些帮助。如果对大家有帮助,可以帮我点个 star 支持一下我。
需求可以分为以下几点:
- 信息采集:需要满足对支撑平台的指标、日志的采集,包括应用程序、数据库、中间件、主机等。并且要满足可以持续、实时的采集各类信息,以及对信息进行适当的清洗,提高其质量与准确性。
- 监控报警:可以根据监控需求自定义监控规则,以及告警的方式,包括第三方、邮件、短信等。并且需要实时的监控,及时掌握系统的运行状态、性能情况等。以及事后的信息查阅,便于之后的分析。
- 日常管理:包括对数据源的添加、报警规则的添加、报警后处理的跟踪等,一切都责任到人,进行全方位管理。以及对人员权限、任务分配、知识库等内容的实现。
- 综合分析:通过图表、报表的形式,将数据转化为可视化的形式,定期推送给运维人员,便于之后更加全面、准确的分析系统运行情况。
在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 图表。进入对应监控对象,可以查看具体规则的信息,以及对该对象的监控规则进行增删改查。下方还有该对象的报警信息,可以查看报警时间、名称、内容等,以及可以下载对应人员解决后上传的工单。 -
文件监控功能
用户可以查看各个监控文件,以及对其增删改查。添加后定期后端会进行钉钉通知,提醒你需确认文件是否正常,是否备份成功。 -
巡检计划功能
在该页面管理员可以为特定人员制定巡检计划,并上传巡检单。
对应人员可以查看自己的巡检计划,并且有日历进行可视化。在规定时间上传自己的巡检表。 -
人员管理功能
运维人员自己可以查看修改自己的个别信息。而对于超级管理员,他会有更大的权限,可以对所有运维人员进行增删改查。