图片-稻子网
图片-稻子网
图片-稻子网
图片-稻子网

腾讯云服务器增加内存-基于流计算Oceanus和Elasticsearch Service构建百亿真实世界应用

一、为什么要建监控系统

在后移动互联网时代,良好的用户体验是成长的基础,稳定的用户体验是用户体验的基础。大型互联网企业,尤其是面向C端客户的企业,对业务系统稳定性的要求越来越高,在线问题发现和处理的速度通常在分钟级。例如,对于滴滴这样的出行公司,打车服务暂停10分钟,将引发乘客和司机的大规模投诉,不仅造成经济损失,还严重影响平台商誉和用户口碑。

大型互联网公司的业务系统是大型分布式系统。各种业务应用程序和基本组件(数据库、缓存、消息队列等)交织成一个复杂的依赖网络。任何节点都可能发生故障,导致系统不可用。. 因此,对业务系统的监控非常重要。通过监控,可以及时发现问题并及时干预,避免事故发生或减少事故影响。

二、监控系统总体设计

(一)监控系统要求

世界上没有完全可靠的系统。程序、机器、网络等在运行过程中可能出现故障,导致服务异常。因此,监控的目标是高效、及时地发现和定位异常系统问题,并期望缩短异常的平均修复时间,从而减少异常造成的损失。

为实现减少平均修复异常时间的目标,监控系统应具备以下能力:

数据采集​​能力:全面、准确、快速、低损耗地采集监控日志和数据;

数据聚合能力:聚合相关数据,方便处理,获取我们需要关注的数据;

数据分析处理能力:对需要关注的数据提供异常指标检测、故障诊断等分析方法,以及数据过滤、采样、转换等处理方法;

数据存储能力:为海量日志和监控指标提供高性能存储;

监控告警能力:指定监控规则,并在规则触发后提供电话、邮件、微信、短信等多种告警机制;

数据展示能力:提供监控数据和告警展示功能,加速问题定位;

高可用:整个监控系统需要高可用,监控就是检测异常。如果因为异常而无法使用,肯定会被扣除。

(二)监控系统架构

根据对监控系统需求的研究,监控系统的整体数据流转过程可以抽象为以下几个阶段:采集->聚合->处理->存储->分析->显示->告警。

由此我们可以总结出监控系统的总体架构:

图片[1]-腾讯云服务器增加内存-基于流计算Oceanus和Elasticsearch Service构建百亿真实世界应用-稻子网

从下往上,首先是数据采集层,提供了很多采集方式,包括Agent采集、RPC埋点、HTTP上报等。主机监控数据和日志可以通过Agent采集,也可以通过RPC采集埋点可以上报,也可以用户直接通过HTTP推送进行数据采集。

成功采集的数据需要经过统一的数据聚合层聚合相关数据。例如,将同一业务系统的所有服务器数据聚合到同一个消息队列中,以方便异常检测。

数据聚合后,会分为数据处理、数据分析、数据存储三个数据流处理。

数据处理层:对原始监控数据进行处理,通过数据清洗和转换对数据进行格式化,并进行基本的聚合计算,如累计计算10台服务器的ERROR日志数;

数据分析层:对标准化数据进行关联分析、异常检测、故障诊断等,为后续告警提供判断依据;

数据存储层:存储日志、指标、时序数据,方便展示,可用于进一步的数据挖掘。

数据流处理完成后进入监控告警层,对符合监控告警规则的事件进行推送告警。

数据流最终到达数据展示层,提供常用的用户交互页面:如监控面板、报警面板等。

三、实施监控系统解决方案

(一)技术选型

方案一:流计算+堆栈

提到监控系统解决方案,首先想到的就是 Stack(、、、、Beats)。其活跃的社区、简单的安装过程、便捷的使用方式吸引了大量用户。目前很多互联网公司的监控系统架构都是基于开源栈构建的。

堆栈由 、 、 和 Beats 组成。下面简要介绍每个组件。

是一个实时全文搜索和分析引擎。作为stack的核心,可用于搜索各类数据:从文本、数字、地理空间数据到其他类型的结构化和非结构化数据,主要支持搜索、分析、数据存储三大功能。建立在搜索引擎库之上,易于使用且可扩展。

是一个日志聚合器,它动态地从各种输入源收集监控日志和数据,对其进行转换,并将数据传递到各种支持的输出目的地。许多用户将转换后的数据发送到日志,监控数据被索引和搜索。

它是一个在其之上工作的可视化层,为用户提供分析和可视化数据的能力,将存储在其中的数据转换为易于使用的图表、图形、直方图和其他可视化表示,然后深入挖掘成数据特征。

Beats 是一个轻量级的日志收集器,目前 Beats 包含多种工具: 、 等。每个 Beats 都有一个简单的任务:收集日志或数据并将其发送到输出目的地。

早期的 ELK Stack 用来收集和解析日志,但是它是基于 jdk 的,并且集成了很多插件,消耗了大量的内存、CPU、IO 等资源。相比之下,Beats 占用的系统 CPU 和内存几乎可以忽略不计,因此可以考虑使用轻量级的 Beats 组件来完成日志和监控数据收集操作。架构如下:

图片[2]-腾讯云服务器增加内存-基于流计算Oceanus和Elasticsearch Service构建百亿真实世界应用-稻子网

Stack 运行在分布式系统上,为用户提供强大的平台。平台通过采集、过滤、传输、存储等方式对海量日志和监控数据进行集中管理,并提供准实时搜索和分析。监控、事件消息、分析报告等简单易用的功能,帮助运维人员实时监控在线业务,在业务出现异常时及时定位原因排除故障,深度挖掘大日志的数据值。

但是Stack也有一些不足之处。首先,Beats只有采集日志和监控数据的功能,不能对数据进行处理;其他数据处理功能很弱腾讯云服务器增加内存,无法满足复杂的数据处理需求,且不支持监控数据缓存,存在数据丢失隐患。

综上所述,在保存监控数据和日志信息之前,需要引入消息队列缓存数据,利用大数据实时计算引擎对数据进行实时过滤、变换、聚合。

而腾讯云流计算正好可以实现这些功能。流计算是大数据产品生态系统的实时分析工具。是基于Flink构建的企业级实时大数据分析平台,具有一站式开发、无缝连接、亚秒级时延、低成本、安全稳定等特点。流计算可以很好地满足监控场景中海量实时数据处理的需求。监控系统可以利用实时计算能力对监控日志和数据进行清理、转换和聚合。实时计算的结果可以直接用于监控和报警。显示大大提高了运维人员在故障发生时的决策能力。

使用 Stack 时要注意的另一点是监控面板。其优势在于日志分析,仅适用于其他类型的数据源,不支持;其面板显示能力有提升空间,学习曲线陡峭,非技术业务用户难以上手。因此,可以考虑使用其他数据可视化工具而不是监控面板来专注于日志分析。在对现有的可视化工具进行了全面比较后,我们选择了使用它。

在实际应用场景中,可以使用 Beats 收集日志和监控数据,使用 Kafka 作为 Beats 的输出。Kafka 接收到 Beats 实时采集的数据后,利用流计算(Flink)进行实时处理和聚合,输出满足分布式检索需求的数据。通过日志分析,最终作为监控面板使用。流程如下图所示:

场景 2:++

它是一个开源的分布式系统监控软件。支持可视化配置,提供多种指标采集,支持自定义告警阈值和多种通知机制。灵活的设计为用户提供了易用的二次开发接口,让用户不仅可以使用自己提供的功能,还可以自定义更多的监控项功能,如硬件监控、操作系统指标监控、服务流程等监控。

是基于Go语言开发的监控、报警、存储套件。它通过 HTTP 协议从远程机器收集数据,并将其存储在本地时间序列数据库中。架构简单,单个服务器节点即可直接工作,轻量级。同时不依赖外部存储,便于迁移和维护。其监控数据直接存储在本地时序数据库中,单个实例可处理数百万条。灵活的数据模型和强大的数据查询语句,可以帮助快速定位和诊断问题腾讯云服务器增加内存,非常适合监控服务型架构。

它是一个开箱即用的可视化工具,具有功能齐全的指标仪表板和图形编辑器,灵活丰富的图形选项,并支持配置多个数据源,例如,等。通过链接url,并执行对访问的数据进行分组、过滤、聚合等逻辑操作,可以在监控面板中直观的展示监控指标。

构建的监控系统部署简单,功能齐全,非常适合容器化环境,但也有一定的局限性。主要缺点是超大数据量下存在性能瓶颈。

上手容易,可以实现基础监控,但需要对深层次需求非常熟悉,二次定制开发较多;

使用pull方式采集数据,存在性能瓶颈;

基于监控指标( ),不适用于日志(Logs)、事件(Event)、调用链()等监控;

目前只能提供非持久化的数据存储,不能长期存储数据;

只适合单机部署。对于集群化和横向扩展,官方和社区都没有灵丹妙药,无法支持海量数据存储和监控。

选择总结

Stack与流计算相结合,构建分布式、可扩展、实时的监控系统,集中管理海量日志和监控数据,实时搜索分析,提供指标监控、事件消息和分析报告。. 性能完美,可扩展性强。缺点是部署比较麻烦,资源消耗大。

构建的监控系统部署简单,功能齐全,非常适合容器化环境,但存在致命缺陷,在大规模监控数据量下无法突破性能瓶颈。

综上所述,我们最终考虑使用流计算和Stack来构建监控系统。

(二)系统优化

随着业务量的增加,监控指标逐渐增多,需要监控的设备不断增长,对监控系统的性能要求也越来越高。当数据量增长到百亿甚至千亿级别时,监控系统可能会遇到以下问题:

处理性能下降,系统整体处理性能变弱,处理抖动和毛刺增加。上游消息队列中大量数据堆积,监控延迟增加;

数据有偏差。由于业务系统各个组件的监控数据和日志分布不均,导致数据偏斜,Flink 任务背压严重,每个算子的时间变长甚至频繁失败。部分节点出现CPU过载和OOM;

存储写入性能下降,写入延迟增加,大规模写入被拒绝,最终导致上游 Flink 任务背压,甚至任务崩溃。

当系统不稳定或处理性能下降时,数据延迟会上升到数小时甚至数天的水平,这对于需要尽可能实时的监控系统来说是无法接受的。

面对超大规模的监控数据量场景,腾讯云流媒体做了很多优化。详情如下。

流计算

流计算是大数据产品生态系统的实时分析工具。是基于Flink构建的企业级实时大数据分析平台,具有一站式开发、无缝连接、亚秒级时延、低成本、安全稳定等特点。

流计算可以很好地满足监控场景中海量实时数据处理的需求。监控系统可以利用的实时计算能力,使用简单的SQL对监控日志和数据进行实时清理、转换和聚合。

SQL 性能优化

流计算在原生 Flink SQL 上做了很多优化,以提升作业在超大数据量下的处理性能。

数据倾斜是 Flink 作业性能问题的常见原因。数据倾斜意味着数据分布严重不平衡。过多的数据集中在某些任务上,导致内存不足和频繁的 GC。但是频繁的 GC 会导致系统吞吐量下降、数据延迟,严重时可能会导致断线和任务丢失。坍塌。

对于数据倾斜问题,流计算自动为作业启用 Local- 和 Mini-Batch 功能。Local-可以通过局部预聚合过滤掉一些倾斜的数据,从而减少热点,避免数据倾斜,提高处理性能。同时在加工过程中可以开启Mini Batch模式。Local阶段采用微批量提交,避免数据缓存过多。在stage中,可以减少对状态的访问次数,降低I/O压力。

Flink SQL下还有UDF函数复用的问题。如果同一个 UDF 在 SQL 中出现多次,比如简单的 JSON 解析、URL 解析等,会导致 Flink 原生 SQL 被多次执行,影响性能。

针对UDF函数复用问题,流计算将逻辑执行计划中重复调用的UDF提取出来,并将UDF的执行结果缓存起来,避免多次调用。

流表维表Join存在数据冷启动问题。如果维度表数据全部加载进去,会造成大量内存消耗,容易造成背压。

流计算的解决方案是在维表的DDL中指定信息。当流加入维表时,会根据信息加载维表中对应分片的数据,流表在翻译执行计划时会得到信息。, 确保流和维表的数据基于相同的信息进行join。这种处理方案可以大大减少全维表数据预加载带来的内存消耗和背压问题。

智能作业诊断与监控

流计算为异常的作业重启、故障和/或异常的 CPU 和内存异常以及其他运行状态事件提供可视化提示。

并从异常日志的采集和聚合分析入手,智能诊断分析异常信息,提供解决方案建议。

此外,流计算还在Task粒度上定义了动态指标,以维度聚合(sum、max、min、avg)的形式定义了来自上下游系统的65+个集群作业健康运行相关的监控指标。方位监控报警。

流计算提供作业操作事件可视化、作业智能诊断、全方位监控报警等功能,为用户的实时计算操作保驾护航。

作业自动缩放

流计算提供了作业自动伸缩的功能。根据CPU、内存、背压等业务负载情况,自动调整作业的并行度,完成作业的扩缩容。

当遇到数据倾斜、工作量大等事件时,流计算会自动调整作业的并行度,增加作业运行资源,从而避免数据倾斜,减少工作量,保证作业稳定运行。在业务低谷期间,流计算会自动减少作业计算资源,减少资源浪费。

自动扩缩容功能,既保证了业务的及时性,又避免了资源的浪费,可以为用户降低可观的成本。

腾讯云

随着数据量的快速增长,开源暴露的问题有:

写入耗时过长,大量写入被拒绝;

部分索引查询性能慢;

存储成本急剧增加;

堆内存使用量太大。

社区有很多案例和经验可以借鉴,比如使用姿态和参数调优,但是在百亿实时监控场景中,很多痛点和挑战不是简单调优就能解决的。

腾讯云(ES)是基于开源搜索引擎的高可用、可扩展的基于云的全托管服务。它包括 Beats 和常用插件,并集成了安全、SQL、机器学习、警报和监控(X-Pack)等高级功能。为了应对上述困难,腾讯云ES在内核层面进行了深度优化。

存储模型优化

底层是基于 LSM 树的数据文件。原生默认的合并策略是根据文件大小相似度进行合并。默认情况下,一次合并 10 个文件,这是近似的和分层的。这种合并方式最大的优点是合并效率高,可以快速减少文件数量;主要问题是数据不连续,会导致查询时文件剪枝能力较弱。文件被合并到几天前的文件中,导致要遍历的文件更多。

为了提高数据连续性,收敛文件数量,提高文件裁剪能力以提高查询性能,腾讯云ES实现的文件合并策略主要是按时间序列分层合并文件。层外,都是按照时间顺序和目标大小进行合并,每次合并的文件个数不固定。这种策略可以保证合并的效率。对于少量未合并的文件和冷分片文件,采用连续合并策略,默认连续合并超过五分钟不再写入的分片,并控制合并的并发度和范围,减少合并开销。

通过优化合并策略,腾讯云 ES 将搜索场景的查询性能提升了 40%,主键数据写入性能提升了一倍。

成本优化

腾讯云ES对业务数据的访问频率进行了调查,发现最近的数据访问频率比较高,比如最近5分钟、1小时、1天,最近几天的访问频率比较低,一个多月。不够。

腾讯云ES基于这个数据特性,将冷热数据分离,将冷数据放在HDD上以降低成本,并通过索引生命周期管理对冷数据进行迁移。冷数据盘一般都比较大,所以也采用多盘策略来降低成本。提高吞吐量和数据容灾能力。最后将超冷数据冷备份到腾讯云的对象存储COS,冷备份成本非常低。

通过冷热数据分离,监控数据整体存储成本降低近10倍。

内存优化

通过对在线集群的分析发现,在很多场景下,堆内内存使用率较高,而磁盘使用率相对较低。其中FST,倒排索引,占据了堆中的大部分内存,而这部分是常驻内存的。每个 10TB 磁盘 FST 的内存消耗约为 10GB 到 15GB。

腾讯云ES为了优化FST等堆内占用量比较大的内存,将其移至堆外,按需加载,实现更精准的淘汰策略,提高内存使用率,增加更多Level缓存管理模式以提高性能。通过内存优化,可以提高堆内内存利用率,减少GC开销,提高单节点管理磁盘的能力。

四、总结

本文从监控系统整体架构设计和监控系统技术方案实施两部分阐述了百亿级大数据实时监控系统的建设过程。

首先阐述了监控系统的需求,并根据需求总结了监控系统架构。然后进行了技术选型,分析了基于流计算、栈和监控系统的监控系统技术方案,选择了基于流计算和栈的监控系统。最后,针对超大规模监控数据量的场景,介绍了腾讯云流计算以及各种性能和成本的优化策略和方法。总的来说,选择流计算可以很好地支持实时监控的需求,大大降低用户成本。

希望本文能够帮助读者理解监控系统的设计思路,为监控系统的搭建提供专业的指导,快速搭建高性能的监控系统。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片