转载Airbnb 的核心日志系统架构及主要系统模块的设计之道

Posted Qunar技术沙龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转载Airbnb 的核心日志系统架构及主要系统模块的设计之道相关的知识,希望对你有一定的参考价值。

作者|张振
编辑|小智
随着业务的快速增长,传统的基于批处理模式和无格式的日志处理已经逐渐不能满足应用需求。因此,Airbnb 数据基础构架组开发了新一代的日志数据存储和查询平台,着重于保证日志数据的质量,解决数据的实时性,提高查询的灵活性,方便多维度统计分析,和提供异常检测。演讲主要分享 Airbnb 核心日志平台的系统构架,以及主要系统模块的设计和实现。
背景介绍


什么是日志平台系统?首先我们知道大数据对于互联网公司有非常重要的价值,对 Airbnb 也不例外。我们通过数据可以为客户提供最佳的旅行体验,同时我们也可以通过数据发掘用户的需求、市场需求,对我们的产品做出正确的决策。

【转载】Airbnb 的核心日志系统架构及主要系统模块的设计之道

这里是一些很简单、很具体的应用。首先通过数据可以进行反欺诈,让我们的平台变得更加可靠、值得信赖,同时通过数据可以找到我们所需要的房源,通过分析用户的相关行为,我们可以做到用户的拉新、促或、匹配,我们也可以做 AB 测试,可以通过数据决定新的产品或者功能是不是对业务起到一定的帮助,同时数据可以用来做监测。这是产品和数据仓库的关系,这么一个简单的从产品到数据仓库的纽带,就是日志的收集系统。

说到 Airbnb 的平台系统,在开发和完善过程中也踩到了很多坑,取得了很多进步。这是大概两年前的状态,使用的是无格式的 JSON 日志,我们有超过 800 种不同的日志记录类型,由于产品迭代和代码改动,没有约束所以非常容易出错,缺乏监控手段,保证整个日志平台的可靠性。

【转载】Airbnb 的核心日志系统架构及主要系统模块的设计之道

这是一些例子,在左边我们通过数据产生一些图表,这些图表由于整个数据平台系统的不可靠,经常会不显示或者数据比较陈旧。另外,右边有一个白板,我们项目经理会负责一个白板,写着有多少天没有产生数据,数据平台运行了,自从建立这个白板之后数字没有超过 10。

【转载】Airbnb 的核心日志系统架构及主要系统模块的设计之道

这也是真实的邮件,是某个组的项目经理发给他们全组的员工,说 dashboard 图表大家不要去相信,因为数据更新地不够快,或者数据是不准确的。

我们可以看到,大数据领域,数据的收集处理的平台对大数据和整个公司的数据驱动是非常重要的。


日志平台的需求


对于这么一个日志系统的平台有哪些需求呢?我们发现,第一个是数据的时效性,数据必须按照一定的时间落盘,有一定的可预测性。第二个,数据的完整性,就是说我们数据不能丢失,不能损坏,也不能够重复。第三个,保证数据的质量,就是说数据不能是无效的数据,如果数据没有办法反序列化,或者数据丢失了必须的字段,我们后续的处理就没有办法进行。

【转载】Airbnb 的核心日志系统架构及主要系统模块的设计之道


Airbnb 日志平台构架


我们看一下整个 Airbnb 日志平台大体构架。首先我们有一些前端的应用,比如网页和手机的 APP,这是我们的客户端。我们整个服务器是构建在 Ruby 上的,所以有 Ruby 的服务集群,同时还有很多内部产品的集群。所有的集群能够产生数据,数据或者直接发送到 Kafka,或者通过一些代理网关发生了 Kafka,Kafka 是整个数据消息的中间件。会有一些作业定期地去消费这些消息、这些日志,我们使用 Camus,是以离线或者批处理的方式把 Kafka 中间的数据放在我们的数据仓库,上面我们用 Hive 或 Presto 进行查询。更重要的一环是,收集完这些数据之后,把数据通过一个派生数据库,得到相关的数据产品,用于提高和改善我们前端的服务。这就是数据收集并回馈到产品的过程。

在这么一个比较复杂的框架下有很多组件会发生错误。首先,进程死锁,会丢失数据,或者 Kafka 代理会产生故障造成数据丢失。因为网页和手机都是运行在客户端的,会产生一些无效的数据,或者恶意的不能够反序列化的数据。我们发也现很多软件 Bug,这些软件 Bug 也会造成数据的丢失。同时服务器节点故障,比如硬盘、内存和网络的故障会导致数据不能够按时的或者不能进入数据系统。还有做一些代理会缓存配置,缓存配置如果没有正常的数值,也会造成缓存溢出,数据丢失。

【转载】Airbnb 的核心日志系统架构及主要系统模块的设计之道

考虑到整个系统之后,我们希望去改善或者去提高日志收集的平台,我们发现有五个方面可以改进:

  • 首先,我们需要模块监测,作为整个数据平台中间,每个模块需要保证它的正确性和可靠性;

  • 第二点,尽管系统中间的每个模块都正确运行了,但是也不能保证系统端到端的可靠性,所以还需要一个端到端的审核机制;

  • 第三点,发现如果日志的格式没有一定约束的话,会很容易产生非常多的无效日志,不能保证数据质量,因此我们对日志的格式也应该有一定的约束性和一定的强制性;

  • 第四点,整个系统出现异常的情况下,怎么样能够快速地或者自动地去检测到这个异常,所以需要一个异常检测的模块;

  • 最后一点,现在越来越多的系统已经不能满足批处理和离线的方式,在我们的日志平台中间也需要引入实时流处理的模块,使得日志能够更快地让用户查询或者进行一些数据聚合操作。

下面分别介绍一下每个方向的工作。


模块检测



【转载】Airbnb 的核心日志系统架构及主要系统模块的设计之道

首先,模块故障的监控,这个是比较直接的,对于日志系统中间的每个模块需要保证正确性和可靠性。比如进程的监测,进程是否活着,对于 CPU 和内存的使用量。因为日志系统有数据的输出和输入,对比数据的输出和输入帮助我们发现系统的故障。很多时候,比如对 Airbnb 网站来说,数据是有季节性的,比如说每周一、每周二我们平台的数据量会上升,到了周末数据量会下降,因此对数据会有一个季节性的对比,把这周一的数据和上周一的数据对比看有没有差别,如果差别很大看系统是不是有一定的错误。有了这些基本的模块级别指标之后就可以建立预警机制,发生错误的时候可以告知,检查系统错误。


(“端到端审核”等其他四个方向的内容详见【查看原文】)

……

写在最后


最后总结一下,我们这个日志系统有几个特点:

第一个,提供了系统级的检测和报警。

第二个,可以量化整个平台的可靠性。

第三个,对日志的格式进行规范,能够尽量减少无效性的数据。

第四个,引入实时流处理日志能够实时查询。

第五个,开发了日志异常检测服务,可以很快地检测出异常发生的状况。






以上是关于转载Airbnb 的核心日志系统架构及主要系统模块的设计之道的主要内容,如果未能解决你的问题,请参考以下文章

python标准日志模块logging及日志系统设计

大型广告系统架构 — 检索模块

大型广告系统架构 — 检索模块

转载MySQL5.6.27 Release Note解读(innodb及复制模块)

架构设计:系统间通信(31)——其他消息中间件及场景应用(下1)

离线数据分析流程及推荐系统架构图