第八届中国软件杯大赛-云监控系统设计思路

前言

好久没写博客了,主要是因为最近 2 个月在忙着做 2 个比赛,一个是中国软件杯,另一个是阿里的第五届中间件性能挑战赛,另外还有就是忙着准备秋招,所以差不多 3 个月没写博客了,最近刚结束了中国软件杯的比赛,阿里的第五届中间件性能挑战赛也结束了初赛,所以趁着空闲的时间总结一下这两个比赛。
首先汇报一下成绩,中国软件杯获得了三等奖(国家级),第五届中间件性能挑战赛初赛取得了第六名(4094个队伍),目前已经进入复赛。
先说一下中国软件杯这个比赛成绩,首先这个成绩对于我来说挺出乎意料的,首先对这个比赛感到挺失望的,一开始参赛的时候以为这个比赛是属于技术类比赛,结果到头来还是偏向于 PPT 型的比赛,至于为什么这么说,这里不得不吐槽一下,我参加的赛题是关于云平台的监控报警系统,大概使用出题企业提供的 HTTP API 获取到云服务器的性能指标,然后通过对这些指标进行监控,当指标符合用户规定的规则时候则触发报警,赛题需求看起来没啥问题,清晰明了,我和我队友也就中规中矩的实现赛题的需求,最后也就止步于三等奖了,决赛都没进(我参加的赛题只有 3 个队伍进入了决赛)。后面通过观看现场的决赛视频,了解到进入决赛的队伍的实现情况,他们竟然使用上了人工智能、区块链、人脸识别、AR等等这热门的技术,使用区块链技术保障从 API 中获取到的数据不丢失、不被篡改,使用 AR 来查看云服务器的监控信息,使用人脸识别来身份证验证,使用人工智能来….,听起来牛逼的技术都往上堆,先不说这些跟监控报警系统有啥关系吧,也不说他们到底有没有实现,单靠这些名词就把”专家”治的服服帖帖,也难怪进了决赛,这些高大上的技术我和我队友一个都没用上,所以最后比赛也就获得了三等奖而已。
再说一下第五届中间件性能挑战赛初赛,这个成绩对于我来说挺满意的了,初赛第一天拿了个第 5 名,然后中间陆陆续续也当过几天第一名,最后成绩为第 6 名,总体来说这个成绩也并不意外,因为从初赛第一天开始到结束我的排名都是靠前的。

这两个比赛就说到这里吧,然后下面是分享下我和我队友参加中国软件杯的大概思路,最后也附上源码、成品视频。

喜欢的朋友可以点个赞~要是点赞数多的话我下一篇写一下第五届中间件性能挑战赛初赛的思路。

赛题分析

赛题地址: 基于华云公有云平台,设计公有云监控系统

在全民云时代的当下,单体应用已无法满足急速增加的业务需求,本文设计思路是将单体应用按照业务功能拆分成多个小型服务,每个小型服务提供专门业务功能,不同的服务之间可以通过 RPC 或者 HTTP 进行通讯,这样一来系统就可以解耦成多个服务,各个服务可以独立的进行开发、部署、维护和管理,同时也可以基于服务进行横向的扩展,可以进行更细粒度的扩展。

架构设计

整体架构

按照赛题需求,本文将系统按照业务拆分成五个主要服务:

  • 数据收集:负责收集来自不同应用的数据,将数据清洗之后发布到消息队列中间件。
  • 数据存储与检索:主要的功能是将数据持久化,同时向外提供检索服务。通过订阅消息队列,异步的处理收集到的数据,将数据存储到检索框架中,方便对数据的检索,同时将数据持久化到数据库中,以防数据丢失。
  • 监控报警:主要的功能是提供自定义报警规则和异常报警。向外提供接口进行自定义报警规则,通过 RPC 调用数据存储与检索的检索服务,对数据进行分析和统计,当数据满足报警规则时实现自动报警。
  • 统一服务层:主要功能是将各个服务统一起来,向外提供 API 进行通讯。
  • 前端:主要功能是提供用户对云主机管理操作、自定义监控报警的页面,将云主机性能数据可视化展示。

数据收集实时的对华云系统数据进行收集,保证了数据的有效性,数据收集和数据存储与检索通过 RabbitMQ 达到解耦、异步的目的,让海量的数据收集提供了可能,同时依靠 RabbitMQ 提供的消息可靠性,保证了数据的可靠性。数据存储与检索通过订阅 RabbitMQ 实时的将数据存储到 MySQLElasticsearch 中,通过 Elasticsearch 提高了检索效率,让海量的数据检索成为了可能。

监控报警将实时的对数据进行监控、分析和统计,当数据符合报警规则的时候,将会通过 Email、手机短信将报警信息及时发送给用户,让用户对云主机的安全了如指掌。同时用户可以自定义报警规则,可以对报警规则进行多维度的设置,比如监控的参数、监控周期、周期数、符合一次报警规则还是总是符合时候才报警等信息,让用户可以对云主机的性能进行多维度的掌控。

统一服务层将数据存储与检索、监控报警、云主机管理等统一集成,对外提供统一的 API 进行操作。

前端将为用户提供云主机管理、数据可视化、监控报警的界面。

技术选型

1. 开发语言

本文采用 Java 作为开发语言,主要原因是 Java 稳定性高、安全性高,拥有庞大的生态系统,同时具有跨平台的特性,所以本文采用 Java 作为开发语言。

2. 开发框架

本文采用 Spring Boot 作为系统开发的框架,原因是 Spring 系列的框架生态非常好,能进行快速的开发和敏捷的部署,还有提高后期的可维护性。Spring Boot 作为 Spring 系列框架下的一个子项目,可以快速的整合第三方框架,同时支持将系统打包成应用程序进行执行,为微服务提供了可能。

3. 消息队列

本文采用 RabbitMQ 作为消息队列中间件,原因是 RabbitMQ 低延迟、可用性高、消息可靠性高。

4. RPC 框架

本文采用 Dubbo 作为 RPC 框架,Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。

5. 分布式服务框架

本文采用 ZooKeeper 作为分布式服务框架,ZooKeeper 是一个分布式的,开源的分布式应用程序协调服务。

6. 全文检索框架

本文采用 ElasticsearchElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

7. 缓存框架

文本采用 Redis 作为缓存框架,Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库。

8. 数据库

本文采用 MySQL 作为数据库系统。

后端实现

数据收集

将日志数据收集和业务抽离出来,动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储以供后续使用,实现不同服务器生成的日志的统一化管理,日志数据统一化管理具有非常重要的作用:

  • 日志分析:通过日志统一平台进行日志分析、统计,而不再需要运维者到一个个服务器里面去查看日志。
  • 数据查找:通过检索日志,掌握服务器的负荷和运行状态。

通过定时任务去获取华云提供的云主机性能数据,让数据和华云官方的保持数据一致,保证了数据的实时性、有效性。同时将获取到的数据进行清洗,只保留有用的数据,将数据发布到消息队列中间件 RabbitMQ 中。通过扇形交换器 huayun.fanout 将消息发布到 huayun.eshuayun.persistence 这两个队列中,前者用于将消息存储到 Elasticsearch 中,后者用于将消息存储到 MySQL 中。

通过消息延迟投递进行数据可靠性的保障,上游服务数据收集将数据将一个消息发送到 RabbitMQ 之后继续发送一个延迟消息到 RabbitMQ 中,下游服务消费消息之后,将取消消息投递给 RabbitMQ,回调服务 Callback Service 通过订阅下游服务投递的取消消息,知道了有哪些消息成功被消费了,如果当上游服务投递的延迟消息到达 RabbitMQ之后,回调服务获取到这个延迟消息之后,发现该消息并没有收到下游服务发来的取消消息,那么回调服务将重新调用上游服务,让上游服务重新投递,保证消息投递的可靠性。

数据存储与检索

利用 Elasticsearch 对数据进行全文检索,其具有高扩展性,可以扩展到上百台服务器,处理PB级别的数据,同时还具有高效的检索能力,对于大量的数据也能快速的检索。采用 Dubbo + ZooKeeper 对外提供分布式的 RPC 服务,利用 Zookeeper 作为分布式服务管理,服务提供方将服务发布到注册中心,而服务消费方可以通过注册中心订阅服务,接收服务提供方服务变更通知,使用Zookeeper,能够对服务的调用情况进行监控分析。

订阅消息队列中间件 RabbitMQElasticsearch 服务层通过监听队列 huayun.es,当这个队列有消息达到时,RabbitMQ 将会主动将消息推送过来,Elasticsearch 服务层将接收到的消息存储到 Elasticsearch 中。同样,MySQL 服务层也将推送过来的消息存储到 MySQL 中。

数据存储与检索除了提供数据持久化服务外,还对外提供数据检索的服务,通过 ZooKeeper 进行检索服务的注册,通过 Dubbo 提供RPC

监控报警

基于数据存储与检索提供的服务,可以多维度的自定义规则,对服务器的运行状态实时监控,同时对于服务器出现的异常,监控报警能够及时的进行通知用户,报警消息发送后,可以让开发者一目了然地发现问题出现在什么地方,从而快速解决。

监控报警通过订阅 Zookeeper 获取到服务信息,通过 Dubbo 获取到数据存储与检索提供的检索服务,基于检索服务对数据进行检索和分析,根据报警规则定时的去对数据进行分析,当数据满足报警条件时自动进行报警,将报警信息实时的发送发给用户,同时将报警信息存储到 MySQL 中,以便日后查询。

用户可以对报警规则进行多维度的设置,比如监控的属性、监控周期、周期数、触发报警的条件和阈值等。

统一服务层

统一服务层对外提供统一的 API ,前端可以通过统一服务层提供的 API 对数据的检索、报警规则的设置、云主机的管理、镜像管理和快照管理等。

通过 RPC 使用数据的检索和监控报警的服务,同时通过增加 Redis 缓存层,将查询结果缓存到 Redis 中,提高效率。

源码

开源了我们队伍的作品,欢迎大家批评指正

源代码:https://github.com/xue8/huayun-cloud

演示视频:https://www.bilibili.com/video/av61070949/