Skip to content
第八届“中国软件杯”《基于华云公有云平台,设计公有云监控系统》
Java
Branch: master
Clone or download
Latest commit dfc8912 Jul 5, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
huayun-log update readme Jul 5, 2019
huayun-search update readme Jul 5, 2019
huayun-web update readme Jul 5, 2019
.gitignore first commit May 25, 2019
README.md fix Jul 5, 2019
pom.xml first commit May 25, 2019

README.md

赛题分析

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

在全民云时代的当下,单体应用已无法满足急速增加的业务需求,本文设计思路是将单体应用按照业务功能拆分成多个小型服务,每个小型服务提供专门业务功能,不同的服务之间可以通过 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 中,提高效率。

环境搭建

  1. Java

    Java 版本要求:JDK >= 1.8

  2. Redis

    Redis 版本要求: >= 3.2.100

  3. Elasticsearch

    Elasticsearch 版本要求:6.2.2 版本,Elasticsearch 依赖于 Java 运行环境,所以需要先安装 JDK。

  4. RabbitMQ

    RabbitMQ 安装前需要先安装 Erlang,Erlang 版本要求 >= 21.0,RabbitMQ 版本要求为 3.7.15

  5. ZooKeeper

    Zookeeper 版本要求为 3.4.14

  6. MySQL

    MySQL 版本要求为:>= 5.6

部署

  1. 运行软件

    启动运行 Redis、Elasticsearch、RabbitMQ、Zookeeper、MySQL。

  2. 数据收集

    打开 huayun-log 应用下的 src/main/resources/application.yml,配置 RabbitMQ 的相关信息。

  3. 数据检索与存储

    打开 huayun-search 应用下的 src/main/resources/application.yml,配置 RabbitMQElasticsearchMySQLZooKeeper的相关信息。

  4. 统一服务层

打开 huayun-web 应用下的 src/main/resources/application.yml,配置 ZooKeeperMySQL、邮箱、SMS 的相关信息。

  1. 编译运行

    编译 huayun-loghuayun-searchhuayun-web,编译完成之后使用 Java 命令:java -jar xxxx 运行编译后的 jar 应用程序,即可完成服务端的部署。

展望

系统分为4大模块,分别是数据收集、数据检索与持久化、监控报警、统一服务层,各个模块之间采用 Dubbo 进行 RPC 通讯,同时使用 Zookeeper 作为分布式服务框架。其中数据收集采模块用 RabbitMQ 作为消息队列存储收集来的数据;数据检索与持久化模块订阅 MQ 获取数据存储到 Elasticsearch 进行检索,同时持久化到 MySQL 中;监控报警模块使用数据检索于持久化模块的检索功能,对数据进行定时查询、统计和分析,对异常数据进行实时的反馈;统一服务层模块将各个模块提供的服务统一起来,对外提供统一的 API 接口。

You can’t perform that action at this time.