随着业务的快速增长,传统的基于批处理模式和无格式的日志处理已经逐渐不能满足应用需求。因此,Airbnb 数据基础构架组开发了新一代的日志数据存储和查询平台,着重于保证日志数据的质量,解决数据的实时性,提高查询的灵活性,方便多维度统计分析,和提供异常检测。演讲主要分享 Airbnb 核心日志平台的系统构架,以及主要系统模块的设计和实现。 背景介绍 什么是日志平台系统?首先我们知道大数据对于互联网公司有非常重要的价值,对 Airbnb 也不例外。我们通过数据可以为客户提供最佳的旅行体验,同时我们也可以通过数据发掘用户的需求、市场需求,对我们的产品做出正确的决策。 这里是一些很简单、很具体的应用。首先通过数据可以进行反欺诈,让我们的平台变得更加可靠、值得信赖,同时通过数据可以找到我们所需要的房源,通过分析用户的相关行为,我们可以做到用户的拉新、促或、匹配,我们也可以做 AB 测试,可以通过数据决定新的产品或者功能是不是对业务起到一定的帮助,同时数据可以用来做监测。这是产品和数据仓库的关系,这么一个简单的从产品到数据仓库的纽带,就是日志的收集系统。 说到 Airbnb 的平台系统,在开发和完善过程中也踩到了很多坑,取得了很多进步。这是大概两年前的状态,使用的是无格式的 JSON 日志,我们有超过 800 种不同的日志记录类型,由于产品迭代和代码改动,没有约束所以非常容易出错,缺乏监控手段,保证整个日志平台的可靠性。 这是一些例子,在左边我们通过数据产生一些图表,这些图表由于整个数据平台系统的不可靠,经常会不显示或者数据比较陈旧。另外,右边有一个白板,我们项目经理会负责一个白板,写着有多少天没有产生数据,数据平台运行了,自从建立这个白板之后数字没有超过 10。 这也是真实的邮件,是某个组的项目经理发给他们全组的员工,说 dashboard 图表大家不要去相信,因为数据更新地不够快,j2直播,或者数据是不准确的。 我们可以看到,大数据领域,数据的收集处理的平台对大数据和整个公司的数据驱动是非常重要的。 日志平台的需求 对于这么一个日志系统的平台有哪些需求呢?我们发现,第一个是数据的时效性,数据必须按照一定的时间落盘,有一定的可预测性。第二个,数据的完整性,就是说我们数据不能丢失,不能损坏,也不能够重复。第三个,保证数据的质量,就是说数据不能是无效的数据,如果数据没有办法反序列化,或者数据丢失了必须的字段,我们后续的处理就没有办法进行。 Airbnb 日志平台构架 我们看一下整个 Airbnb 日志平台大体构架。首先我们有一些前端的应用,比如网页和手机的 APP,这是我们的客户端。我们整个服务器是构建在 Ruby 上的,所以有 Ruby 的服务集群,同时还有很多内部产品的集群。所有的集群能够产生数据,数据或者直接发送到 Kafka,或者通过一些代理网关发生了 Kafka,Kafka 是整个数据消息的中间件。会有一些作业定期地去消费这些消息、这些日志,我们使用 Camus,是以离线或者批处理的方式把 Kafka 中间的数据放在我们的数据仓库,上面我们用 Hive 或 Presto 进行查询。更重要的一环是,收集完这些数据之后,把数据通过一个派生数据库,得到相关的数据产品,用于提高和改善我们前端的服务。这就是数据收集并回馈到产品的过程。 在这么一个比较复杂的框架下有很多组件会发生错误。首先,进程死锁,会丢失数据,或者 Kafka 代理会产生故障造成数据丢失。因为网页和手机都是运行在客户端的,会产生一些无效的数据,或者恶意的不能够反序列化的数据。我们发也现很多软件 Bug,这些软件 Bug 也会造成数据的丢失。同时服务器节点故障,比如硬盘、内存和网络的故障会导致数据不能够按时的或者不能进入数据系统。还有做一些代理会缓存配置,缓存配置如果没有正常的数值,也会造成缓存溢出,数据丢失。 考虑到整个系统之后,我们希望去改善或者去提高日志收集的平台,我们发现有五个方面可以改进: 首先,我们需要模块监测,作为整个数据平台中间,每个模块需要保证它的正确性和可靠性; 第二点,尽管系统中间的每个模块都正确运行了,但是也不能保证系统端到端的可靠性,所以还需要一个端到端的审核机制; (责任编辑:本港台直播) |