Uber 工程师团队发布了开源项目Chaperone(中文意为监护人),这是一个 Kafka 监控工具。在 Uber,它被用于监控多个数据中心和大容量 Kafka 集群中数据丢失、延迟以及重复的问题。
Uber 现在的 Kafka 数据管道跨越了多个数据中心。Uber 的各个系统会生成大量服务调用和事件的日志信息。这已就高吞吐量进行了优化。这些服务在多个数据仓库间以多活模式运行。通过 Uber 的 Kafka 管道的数据被同时用于批处理以及实时数据分析。
Kafka 作为数据总线,会连接 Uber 各个系统以及一个称为 uReplicator 的工具。uReplicator 是一个 Kafka 的复制器,它参照了 Kafka 用于复制现存集群的 MirrorMaker 的原理进行设计。当日志消息被推送到 Kafka 的代理,代理会将消息进行汇总并推送到数据仓库对应的 Kafka 区域性集群。消费者会同时处理各个 Kafka 区域集群与合并了多个数据仓库数据的 Kafka 架构内的数据。Chaperone 就用于实时监控这些消息。
Chaperone 的首要职责是在数据通过管道时检测数据丢失、延迟、重复等数据异常。它包含四个组件:
- 监控类库(AuditLibrary),它会收集、汇总并输出每个应用监控消息的统计信息。这个类库使用了翻转窗口(Tumbling Windows)的概念,用于汇总信息来生成监控消息,并将它们发送到对应 Kafka 主题(topic)。翻转窗口常被用于像 Apache Flink 这样的流处理系统中,用于将流数据分为不重叠的分片数据。
- Chaperone 服务(ChaperoneService),它会消费 Kafka 的每条数据并记录下时间戳,并向对应的 Kafka 主题中推送生成的监控消息。
- Chaperone 收集器(ChaperoneCollector),它会接收 ChaperoneService 产生的数据并将它们存入数据库,再将它们显示在用户界面中,这样就可以方便地检测和定位消息的丢失和延迟。
- WebService,它会暴露出 REST APIs 用于获取或处理数据。
在 Chaperone 的实现上,必须要保证监控数据的准确性。为了实现准确性,Chaperone 采用的策略是保证每一条数据会并且只会被监控一次。这里使用了预写式日志(WAL)。WAL 会在消息从 ChaperoneService 被送到 Kafka 之前记录一条监控日志,这就保证了如果服务宕机,任何发送的消息都可以被重放。这个技术常见于一些数据库,如 PostgreSQL 。
还有一个策略是无论监控消息是在哪里、哪一步被处理,都能使用一个一致的时间戳。Chaperone 尚未完全解决这一问题。目前使用的是基于消息编码的混合技术。对于 Avro-schema 编码的消息,时间戳可以在常量时间内被读出,对于 JSON 消息,Chaperone 团队写了一个基于流的 JSON 解析器,它只会读取时间戳而不会解析整个 JSON 消息。而在代理客户端和服务端仍然使用消息处理时的时间戳。
Chaperone 的作用并不仅限于检查数据丢失,还可以用其从 Kafka 中按照时间戳来读取数据而非通过偏移量。这样无论数据是否已经被处理,用户都可以读取任意时间范围内的数据。因此,Chaperone 也可以被用作调试工具,让用户查看已经处理过的消息用以进一步分析。
Chaperone 的源码可在 Github 上获取。
查看英文原文: Chaperone - A Kafka Auditing Tool from the Uber Engineering Team
评论