概述
Kafka端到端审计是指出产者出产的动静存入至broker,以及消费者从broker中消费动静这个进程之间动静个数及延迟的审计,以此可以检测是否有数据丢失,是否有数据反复以及端到端的延迟等。
今朝主要调研了3个产物:
对付Kafka端到端的审计主要通过:
内嵌timestamp的方法
主要是通过配置一个审计的时距离断(这里称之为time_bucket_interval,可以配置几秒可能几分钟,这个可以自界说), 每个timestamp城市被分派到相应的桶中,算法有:
这样可以得到相应time_bucket的起始时间time_bucket_start,一个time_bucket的区间可以记录为[time_bucket_start, time_bucket_start+time_bucket_interval]。
每发送可能消费一条动静可以按照动静payload内嵌的时间戳,分派到相应桶中,然后对桶举办计数,之后举办存储,简朴的可以存储到,好比:Map<long time_bucket_start, long count>之中。
内嵌index的方法
这种方法就更容易领略了,对付每条动静都分派一个全局独一的index,图纸加密,假如topic及相应的partition牢靠的话,可觉得每一个topic-partition配置一个全局的index,当有动静发送到某个topic-partition中,那么首先获取其topic-partition对应的index, 然后内嵌到payload中,之后再发送到broker。消费者举办消费审计,可以判定出哪个动静丢失,哪个动静反复等等。假如要计较端到端延迟的话,还需要在payload中内嵌timestamp以作相应的计较。
下面来扼要阐明下三个产物。
Chaperone
github地点:https://github.com/uber/chaperone
官方先容(中文):http://www.infoq.com/cn/news/2016/12/Uber-Chaperone-Kafka
官方先容(英文):https://eng.uber.com/chaperone/
Chaperone进动作静端到端的校验主要是基于message内置timestamp实现的,按照timestamp将message分派到差异的bucket中。之后就是对这个bucket中的动静举办计数等一系列的audit操纵,然后将这个audit操纵之后的信息auditMessage生存起来,auditMessage的内容:
留意这里的latency的计较法则是:currentTimeMillis – (timestamp*1000)。
Chaperone的架构
Chaperone的整体架构分为:AuditLibrary, ChaperoneService, ChaperoneCollector和WebService, 它们会收集数据,并举办相关计较,自动检测出丢失和延迟的数据,劳务派遣管理系统,并展示审计功效。
从Chaperone的github上的源码来看:
Chaperone分为ChaperoneClient, ChaperoneCollector, ChaperoneDistribution, ChaperoneServiceController, ChaperoneServiceWorker这5个子项目。比拟着上面的架构图来阐明。
1. ChaperoneClient对应着AuditLibrary,主要是用来audit message的库(library),并不以实际处事运行,可以在Producer可能Consumer客户端中挪用,默认利用10mins的转动时间bucket来不绝地从每个主题收集动静。然后发送到kafka的chaperone-audit这个topic中。官方文档先容说AuditLibrary会被ChaperoneService, ChaperoneCollector和WebService这三个组件所依赖,但代码中来看并非完全如此,略有进出。
2. ChaperoneDistribution可以忽略
3. ChaperoneServiceController和ChaperoneServiceWorker对应架构图中的ChaperoneService,ChaperoneServiceController主要用来检测topics并分派topic-partitions给ChaperoneServiceWorker用以审计(audit)。ChaperoneServiceWorker主要是audit message的一个处事。
4. ChaperoneCollector对是用来读取audit的数据,然后耐久化操纵,默认存入mysql中,看代码也可选存入redis中。
5. 源码中没有WebService这个对象,预计是uber内部的web系统,读取下mysql中的内容展示到页面罢了。