文 | 戴强 网易云信数据平台资深开发工程师
导语:数据在很多业务中都至关重要,对于网易云信,我们通过数据来提升服务并促进业务持续增长。借助于服务监控平台的能力,我们可以很直观的感受到线上服务的运行状况,本文将详细分析网易云信的服务监控平台具体是如何实现的。
引言
通常人类的恐惧都来源于对现实世界的未知。
现实生活中存在很多的不确定性,恐惧是因为我们当前的认知无法对其作出合理解释。例如这次的疫情的突然爆发,人们对死亡的恐惧不断蔓延。世界存在很多的不确定性,什么是不确定性?假设需要对明天的股票指数是涨是跌作出判断,在没有任何数据作支撑的情况下,我们只能像抛硬币一样都是百分之50的概率。在这种场景下,我们做出的所有判断都是不可信的,并且会对自己的决定感到不安。
假如人们了解了所有涉及某种即将发生的事件的因素,那么他们就可以精确地预测到这一事件;或者相反,如果发生了某个事件,那么就可以认为,它的发生是不可避免的,这便是拉普拉斯的信条(又名决定论)。
正如以上的理论所表达的意思,数据可以帮助我们指引方向,并且验证我们的方向是否正确。同样,数据对于网易云信的发展来说也至关重要,我们需要通过数据来提升我们的服务,并促进业务持续增长。
网易云信是集网易20年 IM 以及音视频技术打造的 PaaS 服务产品,我们一直致力于提供稳定可靠的通信服务,而如何保证稳定可靠呢?
服务监控平台就是其中重要的一环,其就相当于布加迪威龙上的仪表盘,汽车的时速是多少,油量是否足够,当前的转速是多少,这些在仪表盘上一目了然,可以帮助我们做出判断:是不是还可以踩一点油门,必要的时候是不是该刹一下车。服务监控平台的目标和价值就在这里,它也就相当于网易云信这辆布加迪威龙的仪表盘,可以告诉我们当前的服务质量怎么样,是不是需要多加点“油”,是不是需要踩一下“油门”或者“刹车”,给我们和客户提供更多的信息,帮助我们提供最优质的、最可靠、最稳定的服务。
本文就来详细分析网易云信的服务监控平台具体是如何实现的,将从整体架构出发,简单介绍网易云信服务监控平台的框架,再仔细分析包括数据采集、数据预处理、监控告警、数据应用四个模块的实现。
系统架构
现在网易云信的音视频数据基本都来源于客户端和服务端日志,所以整个数据的采集链路是其中非常重要的一环,决定了数据的有效性和时效性。
首先,我们来看一下网易云信采集监控平台的整体架构,如下图:
采集监控平台整体架构主要分为数据采集、数据处理、数据应用、监控告警四部分,整个处理流程如下:
数据采集:
- 我们主要的数据来源为业务 SDK 和应用服务器,这些数据可以通过 HTTP Api、Kafka 两种方式接入采集服务。
- 采集服务对数据进行简单校验和拆分,然后通过 Kafka 传输到数据清洗服务。
- 数据处理:数据处理服务主要负责对接收到的数据进行处理然后发给下游服务使用。其中我们提供了 JOSN 等简单的数据格式化能力,另外也提供了脚本处理模块,以支持更灵活更强大的数据处理能力,该能力也使得我们监控平台的数据处理能力更富多样性。
- 监控告警:监控告警模块对于我们一开始提到的服务监控能力来说,是最重要的一环。我们对于采集到的数据进行分维度聚合统计和分析,使用丰富的聚合算法、灵活多变的规则引擎来最终达到服务预警和问题定位的目的。
- 数据应用:清洗后的数据可以直接写入时序数据库供问题排查平台使用,也可以通过 Kafka 接入 es、HDFS、流处理平台,最终供应用层使用。例如:质量服务平台、通用查询服务、问题排查平台等。
接下来我们会对上述四个模块进行详细的分析。
数据采集
数据采集是服务监控平台的入口,也是整个流程的第一步,下图是数据采集模块的架构图。
上文也有提到,为了便于用户接入,我们提供了 HTTP API 和 Kafka 两个通道给业务方。
- HTTP API 多用于端侧或服务器中偏实时的数据上报场景,用以支持秒级的数据接入。
- Kafka 多用于高吞吐量、数据实时性要求不太高的场景。
- 数据过滤预处理模块,提前将一些非法数据进行过滤,并预先数据拆分等处理。
最后通过 Kafka 传输到数据处理服务,接下来就是数据处理阶段的介绍了。
数据处理
完成数据采集阶段后,即进入数据处理阶段,具体流程如下:
- 任务调度,主要负责数据处理线程的生命周期管理,从启动到关闭。
- 消费者,在获取数据后使用内部的队列进行解耦,从而达到横向扩展的能力以提高数据处理线程的并行度。
处理单元,可以根据需要设置并行度:
- 数据处理能力分成两种,通用规则和自定义脚本。通用规则就是简单的 JSON 转换、字段提取等,这些基本可以满足80%的需求,但是为了支撑类似多字段关联计算、正则表达式、多流关联处理等复杂业务,我们也提供了自定义脚本进行数据处理的能力。
- 维度表的使用主要是针对多数据流关联处理的场景,为了解决数据量和并发高的问题使用了本地+第三方缓存的方案。
- 时序数据库输出:时序数据库我们使用的是NTSDB,NTSDB 是网易云基于influxdb做的集群化方案,有高可用、高压缩比、高并发等特点。
数据处理完之后,接下来一个比较重要的阶段就是监控告警。
监控告警
下面这张图简单展示了监控告警的流程:
监控告警阶段分为指标聚合模块以及告警模块。
指标聚合模块支持指定字段分组统计、灵活的聚合窗口时间、数据过滤、细粒度的算子级别的数据过滤、数据延迟最大时间。最重要的是我们支持了非常丰富的聚合算子:累加、最小/最大值、firstValue/lastValue、平均数、记录数、去重计数、TP系列(TP90/TP95/TP99)、环比、标准差等,同时还支持在第一次指标聚合后进行复合计算的能力(复合指标)。这些丰富的算子为我们实现更多灵活的监控规则提供了保证。
另外我们将原有的一阶段聚合改成了两阶段聚合,为什么呢?因为在数据处理的过程中我们经常会遇到的一个问题:数据热点问题导致的倾斜。所以这里我们增加了预处理阶段,在这一阶段利用随机数进行打散,保证数据的均衡,然后预聚合的数据在第二阶段进行总的聚合处理。
告警模块和指标聚合模块从原有的一个模块拆分为两个,指标模块更多的关注如何做数据聚合,而不是和告警模块耦合在一起作为告警模块的一部分。而告警作为一个附加的功能,只需要根据接收到的数据,做一些告警的规则校验、频控校验、告警信息封装、对接消息平台发送告警消息,同时支持了内部 IM 平台、短信、电话等消息通道,多样的消息通道是为了可以第一时间感知到问题的出现。
数据应用
数据应用现有的平台:数据可视化、质量服务平台、ELK日志平台、在线离线分析等。下面,我们针对每个平台简单介绍一下。
数据可视化
数据可视化这部分,我们和大部分公司一样使用 Grafana 来实现。需要做可视化的数据可以先同步到NTSDB中,然后再使用 NTSDB 作为数据制作图表和大盘。另外对于不支持的图表,我们针对Grafana 做了二次开发以支持更多的可视化需求。
下图皆是针对音视频问题排查场景做的一些仪表盘:
质量服务平台
该平台旨在为客户提供直观、高效、全面、实时的问题定位排查工具,客户在收到问题反馈之时,可以第一时间发现、定位问题,并最终反馈用户和进行优化。
ELK 日志平台
ELK 技术栈包含 Logstash、ES、Kibana 三个组件,是一整套日志采集、存储、查询及可视化的解决方案。当前在我们的体系中,更多的用于详细日志的查询。
在线离线分析
这里我们使用 Kafka 作为数据管道,借助 Flink 平台对日志数据进行切分和归档。将这部分数据同步到离线数仓后,可以进行后续的数据挖掘分析工作,同样这里也不扩展讨论。
结语
以上就是本文的全部介绍,分析了网易云信服务监控平台的设计和实践,其中主要介绍了整个服务监控平台的系统架构,并且针对数据采集、数据处理、监控告警、数据应用四个点做了一些阐述。
网易云信的整个数据采集监控体系从2020年初上线至今,从原有的十几个采集任务增长到了300多个,100+的关键用户行为和系统事件、300+的核心音视频指标,每日处理百万行的数据、T级的数据量。整个平台的并发量、吞吐量都在不断地上升,这都得益于云信业务的不断增长,但也使得我们对平台的稳定性和扩展性提出了更高的要求。 未来,我们将借助于平台的能力为客户们提供更加优质的服务。
作者介绍
戴强,网易云信数据平台资深开发工程师,一直从事数据平台相关工作,从0到1搭建了网易云信的实时和离线数仓体系,同时负责服务监控平台、数据应用平台、质量服务平台的设计开发工作。
更多技术干货,欢迎关注【网易智企技术+】微信公众号