druid (http://druid.io/)是设计用来分析时序数据,对OLAP提供支持。设计的时候就考虑到分布式的一些基本问题, 比如扩展性, 可靠性等问题。虽然文档比较糟心, 但是功能还是有一定吸引力的。
druid 的设计思想是把时序数据分析这个任务分成几个处理步骤, 建立相关的组件, 每个组件只集中精力处理自己的任务。那么我们也根据一个时序数据的处理流程来了解一下druid的主要几个组件。
时序数据因为从产生的那一刻起就需求被查询, 所以时序数据的索引应该是数据注入到系统的同时生成, 在druid里, 完成这部分功能的组件叫 indexer。用户提交一个任务(task)给indexer,告诉indexer一些基本信息, 比如数据来源, 数据的结构(schema), 数据如何分片等信息。如果是指定数据来源于kafka 这样的消息服务, indexer 可以自己从kafka 里拉取数据到自己内存,并且在内存里建立相关索引。 数据也可以通过应用程序直接发送给 indexer, 从 kafka 拉取这种方式是druid早期的方式, 那个时候, indexer 这个角色是由 realtime node 来扮演, 这种方式因为高可靠性的考虑(以后另写文章来解释)已经废弃不用, 目前实时数据主要采用通过应用程序推的方式push到indexer node。