如何快速实现基于Nginx的网站监控

如何快速实现基于Nginx的网站监控

 

介绍:

在本文中,我们将深入探讨一个使用为用户提供电子商务数据统计 Web 服务的应用程序快速发展的业务的场景。应用采用常见的分布式Nginx app架构,为了克服性能问题和bug,需要对应用服务设置监控,提高应用运行质量。本文将讨论如何解决这个难题的来龙去脉。

 

一切从应用服务监控开始

James 合作的一家小型互联网创业公司一直在国内的 A 云端运行其应用程序,该应用程序采用常见的分布式 Nginx app 架构,为用户提供电子商务数据统计 Web 服务。除了偶尔的错误和性能问题外,该应用程序运行良好。

如何快速实现基于Nginx的网站监控

最近,James 的经理分配给 James 设置应用程序服务监控的任务,以提高应用程序运行的质量。詹姆斯的经理主要有三个要求:

  1. 首先,以应用服务监控为出发点,系统应该能够:
    a) 实时统计各类服务的调用次数;

b) 基于a)点,生成各种服务的各种响应值出现次数的实时统计数据,如200、404和500;
c) 基于b)点,当某类响应值的调用次数超过设定限制时,实时报警;

  1. 系统应该能够提供历史数据的查询功能,并返回所有服务在任何时期的任何响应值调用的统计信息;
  2. 展望未来,公司对各种定制服务的监控应该可以快速扩展到系统,例如界面响应时间的统计,用户特征的统计;

用经理的话来说,“解决方案应该尽可能多才多艺、快速、好、划算,最好把监控平台搭建在A云上。James一定不能把数据放在第三方云上,主要是为了节省公共交通成本并简化未来大数据分析的准备工作。”

 

技术选项

詹姆斯在收到任务简报后开始选择技术模型。现在,他有三个可行的选项可供他选择:传统的 OLAP 风格的方法、搜索引擎和实时计算方法,如下图所示:

如何快速实现基于Nginx的网站监控

在分析了现状和众多技术后,他的发现是:

 

1. 传统的 OLAP 风格的方法

由于公司不是小型企业,考虑到业务仍在快速增长,白天高峰时段的平均 QPS 可能会超过 100。因此,将每秒调用数百次的信息直接存储到数据库中进行实时查询是不合适的。成本太高,架构不适合扩展。

 

2. 搜索引擎

云提供搜索引擎服务,其错误统计基本可以满足业务需求。但是,在这种情况下存在两个不确定性。一方面,搜索引擎价格和存储成本高(搜索引擎需要引入索引存储),公司无法保证接口响应时间统计的查询响应时间等各类聚合查询。另一方面,考虑到实时报警的特性,需要编写API来对各种调用错误计数进行无休止的轮询,性能和成本并不确定。

 

3.实时计算方法

基于实时计算架构,在服务的内存中处理所有在线日志进行实时聚合计算,返回值错误类型和时间维度,然后持久化存储到存储中。一方面,实时计算可以非常高效,因为与原始数据相比,它大大减少了聚合结果的大小。从而降低持久化成本,保证实时处理。另一方面,我们可以在内存中实时验证警报策略,以最小化警报性能开销。

考虑到上述因素,基于实时计算的架构似乎最适合公司当前的需求。一旦决定最终,詹姆斯开始深入探索建筑设计。

 

架构设计

在确定最合适的技术应该是一种以实时计算为骨干的技术后,James 开始设计架构。在深入研究并参考各种技术网站后,他得出以下结论,对于构建可靠的网站监控解决方案,以下组件是必不可少的。

 

数据通道

数据通道负责从 Nginx 中拉取数据并发送给搜索引擎。它还承担数据积累和数据重新计算的任务。

 

计算引擎

基于 Nginx 服务的错​​误码和时间维度中的聚合实时计算逻辑是基于选择的引擎。同时,计算引擎还负责报警逻辑。

 

贮存

这是 Nginx 监控存储结果的位置。考虑到监控结果虽然是简单的表结构,但查询的维度是多维度的,因此最好采用类似OLAP的存储类型。

 

演示门户

演示门户对所有 Nginx 监控结果进行全维度的快速分析和呈现。

下面是在这种情况下合适的架构图的描述:

如何快速实现基于Nginx的网站监控

幸运的是,A Cloud 为前三个组件提供了现成的产品。因此詹姆斯不需要一一搭建,降低了进入门槛。

  • 关于数据通道,James 在阿里云上选择了一个类似 Kafka 的数据通道。该服务支持性能和消息积累以及其他功能,同时为数据访问提供一定程度的简单性。
  • 为简单起见,James 选择了基于 spark-stream 的计算引擎组件,允许程序员直接编写 SQL 语句进行实时计算。随后,James 不需要自己编写流式计算程序。
  • 对于存储,James 选择了类似 HBase 的云存储产品,因为没有苛刻的事务要求;然而,对容量的需求很高。
  • 演示门户没有现成的产品,这导致 James 摸不着头脑,决定更深入地研究他前段时间学到的编程技术。他编写了一个基于开源演示框架的简单查询门户。

经经理批准预算后,James 开始激活各种产品进行开发测试。完成这项任务的目标时间是一个月。

 

漫长的发展历程

这种架构的漫长开发之旅始于一个简单的激活过程。不到半天时间,Kafka、Storm、HBase 租户和集群就准备就绪。不幸的是,正如俗话所说,程序开发人员将一个开发项目的 80% 的时间花在了最后 20% 的陷阱上。一个月过去了,不到 70% 的项目功能已完成。James 遇到了以下陷阱,并记录在他的技术博客中:

 

集成故障排除成本

集成的组件包括数据通道、实时计算层和后台存储。数据推送逻辑和告警查询逻辑都集成在代码中,任何一个环节稍有错误就会阻塞整个环节。此外,调试成本非常高。

 

日志清理

在开发过程中,为了获取相关应用调整的推送逻辑,每个Nginx日志内容发生变化后,需要在各个服务端改变API推送逻辑。但是,变更过程漫长且容易出错。

 

持久性表设计

为监控项设计适当的表和数据库对于避免索引热点至关重要。当实时计算层不稳定导致重复计算时,需要保证数据库写入数据结果的幂等性。这是表结构设计的一大挑战。

 

延迟数据整合

如果 Nginx 日志数据发送延迟是由于应用的原因,无法保证实时计算引擎能够准确计算延迟数据,例如延迟一小时的数据,并将结果合并到以前的结果。

 

警报发布

考虑为所有结果设置限时任务,以每分钟遍历和查询数据。比如500个调用错误的服务占总数的5%以上,多次调用结果遍历,那么你应该考虑对所有这样的服务进行查询。另一个挑战是在确保高效查询的同时避免错过任何服务错误检查。

 

报警准确度

有时由于日志延迟,最后一分钟服务器的正常日志还没有完成采集,导致暂时有超过5%的服务出现本地500调用错误。系统会针对此类错误触发警报吗?如果它确实触发了警报,则可能存在错误警报。但是,如果不是,应该如何处理这种情况?

 

如何计算 UV 和 TopN

以UV为例,如果要查询任意时间跨度的UV,还需要以常规方式将单位时间(如分钟)的完整IP访问信息存储在数据库中。这在存储利用率方面是不可接受的。有更好的解决方案吗?

 

错误场景的诊断方法

对于各种返回值为500的调用错误,业务期望在出现500错误时,能够在要求的时间内或调用的服务维度内查询到详细的调用输入参数等详细信息。该场景类似于日志搜索。对于类似的新需求,我们似乎无法通过实时聚合计算和存储来满足这个需求。因此,我们需要另辟蹊径。

上述问题是对本文前面讨论的各种问题的附加挑战。

两个月过去了,詹姆斯试图应对这些挑战并找到解决方案,而项目完成了一半,詹姆斯开始感到焦虑。

 

结论:

本文深入探讨了一个场景,该场景讨论了一个快速增长的业务,该应用程序为用户提供电子商务数据统计和 Web 服务。应用采用常见的分布式Nginx app架构,为了克服性能问题和Bug,需要对应用服务设置监控,提高应用运行质量。在找到正确的方法来解决它并探索各种选项时,最好的方法是实时计算方法。它不仅执行实时聚合计算,而且在减少开销的同时持久高效地存储数据。我们讨论了阿里云提供的应用程序架构设计、其组件、遇到的挑战以及企业必备的解决方案组件。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/9693.html
点赞
0.00 平均评分 (0% 分数) - 0

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注