近日,Uber工程师团队发布了开源项目Chaperone(中文意为监护人),这是一个Kafka监控工具。在Uber,它被用于监控多个数据中心和大容量Kafka集群中数据丢失、延迟以及重复的问题。 Uber现在的Kafka数据管道跨越了多个数据中心。Uber的各个系统会生成大量服务调用和事件的日志信息。这些服务在多个数据仓库间以多活模式运行。通过Uber的Kafka管道的数据被同时用于批处理以及实时数据分析。 Kafka作为数据总线,会连接Uber各个系统以及一个称为uReplicator的工具。uReplicator是一个Kafka的复制器,它参照了Kafka用于复制现存集群的MirrorMaker的原理进行设计。当日志消息被推送到Kafka的代理,代理会将消息进行汇总并推送到数据仓库对应的Kafka区域性集群。消费者会同时处理各个Kafka区域集群与合并了多个数据仓库数据的Kafka架构内的数据。Chaperone就用于实时监控这些消息。 Chaperone的首要职责是在数据通过管道时检测数据丢失、延迟、重复等数据异常。它包含四个组件:
在Chaperone的实现上,必须要保证监控数据的准确性。为了实现准确性,Chaperone采用的策略是保证每一条数据会并且只会被监控一次。这里使用了预写式日志(WAL)。WAL会在消息从ChaperoneService被送到Kafka之前记录一条监控日志,这就保证了如果服务宕机,任何发送的消息都可以被重放。这个技术常见于一些数据库,如PostgreSQL。 还有一个策略是无论监控消息是在哪里、哪一步被处理,都能使用一个一致的时间戳。Chaperone尚未完全解决这一问题。目前使用的是基于消息编码的混合技术。对于Avro-schema编码的消息,时间戳可以在常量时间内被读出,对于JSON消息,Chaperone团队写了一个基于流的JSON解析器,它只会读取时间戳而不会解析整个JSON消息。而在代理客户端和服务端仍然使用消息处理时的时间戳。 Chaperone的作用并不仅限于检查数据丢失,还可以用其从Kafka中按照时间戳来读取数据而非通过偏移量。这样无论数据是否已经被处理,用户都可以读取任意时间范围内的数据。因此,Chaperone也可以被用作调试工具,让用户查看已经处理过的消息用以进一步分析。 Chaperone的源码可在GitHub上获取(https://github.com/uber/chaperone)。 今日荐文点击下方图片即可阅读 声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除 |