Petabyte秤数据删除
Mixpanel从移动,浏览器和服务器端客户端从网络上摄入了事件数据的之前。由于不可靠的网络,客户可以重试活动,直到收到200好来自Mixpanel的消息。尽管这种重试策略避免了数据丢失,但它可以在系统中创建重复的事件。用重复分析数据是有问题的数据仓库。这就是为什么我们非常关心数据完整性的原因。
今天,我们很高兴分享我们的解决方案,以PABYTE量表重塑事件数据。
要求
为了解决这个问题,我们需要一种方法:
- 可扩展:鳞片摄入量为1M+事件/秒
- 成本效益:优化摄入,存储和查询的成本/性能开销
- 追溯:确定稍后发送的重复事件
- 无损:在不合格的情况下,保留重复的回滚
- 可维护:最小化运营开销
艺术状态:摄入时间重复数据删除
该行业有许多创造性的方法来解决重复数据删除问题。中心主题涉及架构在摄入层执行重复数据删除的基础架构。客户发送唯一标识符,$ insert_id作为一个财产在每个事件中。重复数据删除基础架构在有限的保留窗口(例如7天)中为所有事件存储了$ insert_id,并将其与每个新事件进行检查以进行重复识别。像钥匙值商店一样碎片Rocksdb或者卡桑德拉通常用于存储。可以使用A中的查找成本来提高布卢姆过滤器。这种结构可确保重复项在其入口处从系统中淘汰。
但是,由于以下原因,这种方法无法满足我们的要求:
- ✅可扩展:碎片钥匙值商店可以水平扩展
- ❌成本效益:需要一个单独的数据存储和重复的基础架构
- ❌追溯:只能在有限的保留窗口中捕获重复项
- ❌无损:将数据放在摄入时,因此不可能回滚
- ❌可维护:DEDUPE成为一项必须提高24×7的额外服务
我们的方法
我们通过摄入所有事件并在阅读时间进行重复绘制来满足我们所有要求的解决方案。一种简单的阅读时间删除方法是建立一个哈希表每个查询上的所有$ insert_ids;但是,这将为我们的系统增加非平凡的开销。但是在描述我们的解决方案之前,让我们回顾一下我们的一些关键方面建筑学。
Mixpanel架构
(项目,用户,时间)基于碎片
Mixpanel的分析数据库ARB,碎片其数据文件按项目,用户和事件时间。这使我们能够确保将给定用户的所有数据共同确定,以便行为查询可以在相关的时间内同时跨许多用户运行。
Lambda架构
在ARB中,所有事件都写入仅附加文件,这些文件定期索引(压实)为背景中的柱状文件。仅附录文件达到尺寸或年龄阈值时,将索引。这种方法通过扫描小型,实时,仅附加文件和大型历史索引文件来确保查询既实时又有效。
我们利用架构的这两个方面来提高阅读时间的重复数据删除。经过第一原则,事件重复项具有以下属性:
- 事件重复属于同一项目
- 事件重复属于同一用户
- 活动重复属于同一活动时间
我们从这些基本原理中收集了以下主要见解:
- 我们可以将事件重复的搜索空间范围范围划分到项目,用户和日期 - 即单个ARB shard。
- 我们可以通过与Lambda体系结构一起摊销重复数据删除的开销,以保持实时和有效的查询。
这些见解导致了满足我们所有要求的解决方案。
重复数据架构
在MixPanel基础架构中添加既有在索引时间和查询时间都会发生。
我们的索引器保持内存哈希集$ insert_id for正在索引的文件中的所有事件。如果看到事件的命中率,则通过在索引格式中设置一些事件来将该事件标记为重复。此过程的开销很小,因为索引在细粒碎片水平上发生。
在查询时间,由于我们的lambda架构,我们扫描了索引文件和仅附加文件。对于索引文件,我们可以检查是否设置了重复位,如果是,则跳过处理事件。对于仅附加文件的小文件,查询在$ insert_id上基于哈希的添加。这使我们能够实时和高效,利用Lambda体系结构的力量。
表现
从我们的实验中,我们发现,重复2%的文件的索引的时间间接开销范围为4%至10%。这对我们的用户体验没有任何直接影响,因为索引是一个离线过程。
对于查询时间,我们发现每次事件的额外读数都会为数据读取大约10N。由于额外的列,查询时间的增加了2%。阅读1000万事件增加了一个时间间接费用接近0.1秒(100ms)。作为参考,Mixpanel截至今天的最大柱状文件包含大约200万个事件(这要归功于项目,用户,时间分片)。我们认为,鉴于我们获得无限保留窗口和最低运营开销的胜利,准时开销是可以接受的。
结论
在此博客中,我们讨论了我们的体系结构,该体系结构在索引层上分发重复标识并在查询级别进行了重复过滤。在过去的6个月中,该解决方案一直在Mixpanel中使用。
如果您喜欢这篇文章,并且有兴趣解决类似的分布式系统问题,我们是招聘呢请随时发表评论或连接Linkedin如果您有任何疑问或评论。
最初出版在https://engineering.www.jy710.com2019年7月18日。