一、Druid架构
Druid本身包含以下四个节点和一个服务:
1、实时节点(RealTime Node) 即时摄入实时数据,并且生成Segment文件。
2、历史节点(Historical Node)加载已经生成好的数据文件,以供数据查询使用。
3、查询节点(Broker Node) 对外提供数据查询服务,并且从实时节点和历史节点汇总数据,合并后返回。
4、协调节点(Coordinator Node)负责历史节点的数据的负载均衡,以及通过规则管理数据的生命周期。
5、索引服务(Indexing Service)有不同的获取数据的方式,更加灵活的生成segment文件管理资源。
二、Druid技术特点
• 数据吞吐量大。
• 支持流式数据摄入和实时。
• 查询灵活且快。
• 社区支持力度大。
三、数据结构
与Druid架构相辅相成的是基于DataSource和Segment的数据结构。
DataSource的结构:与传统的关系型数据库相比较DataSource可以理解为表,包含下面几点:
• 时间列:表明每行数据的时间值
• 维度列:表明数据的各个维度信息
• 指标列:需要聚合的列的数据
Segment 结构:Datasource是指的逻辑概念,Segment指的是实际的物理存储格式,Druid通过Segment实现了横纵向切割操作。Druid将不同的时间范围内的数据存放在不同的Segment文件块中,通过时间实现了横向切割,同时,Segment也面向列进行数据压缩存储,这边是纵向切割。
四、架构说明
1、实时节点
实时节点主要负责即时摄入实时数据,以及生成Segment文件。
实时节点通过firehose进行数据的摄入,firehose是Druid实时消费模型。比如通过kafka消费,就是kafkaFireHose。 同时,实时节点的另外一个模块Plumer,用于Segment的生成,并且按照指定的周期,将本周期内生成的所有数据块合并成一个
Segment文件从制造到传播要经历一个完整的过程。
1. 实时节点生产出Segment文件,并且存到文件系统中。
2. Segment文件的MetaStore存放到Mysql等其他外部数据库中
3. Master通过Mysql中的MetaStore,通过一定的规则,将Segment分配给属于它的节点。
4. 历史节点得到Master发送的指令后会从文件系统中拉取属于自己的Segment文件,并且通过zookeeper,告知集群,自己提供了此块Segment的查询服务
5. 实时节点丢弃Segment文件,并且声明不在提供此块文件的查询服务
2、历史节点
历史节点再启动的时候,会优先检查自己的本地缓存中是否已经有了缓存的Segment文件,然后从文件系统中下载属于自己,但还不存在的Segment文件,无论是何种查询,历史节点首先将相关的Segment从磁盘加载到内存,然后在提供服务。
可以看出,历史节点的查询效率受内存空间富余成都的影响很大,内存空间富余,查询时需要从磁盘加载数据的次数减少,查询速度就快,反之,查询时需要从磁盘加载数据的次数就多,查询速度就相对较慢,因此,原则上历史节点的查询速度与其内存大小和所负责的Segment数据文件大小成正比关系。
3、查询节点
在常规情况下,Druid集群直接对外提供查询的节点只有查询节点,而查询节点会将从实时节点与历史节点查询到的数据合并后返回给客户端,因此查询节点便是整个集群的查询中枢。
Druid使用了Cache机制来提高自己的查询效率。Druid立功了两类介质作为Cache以供选择。
外部cache,比如Memcached。
内部Cache,比如查询节点或历史节点的内存。
如果用查询节点的内存作为Cache,查询的时候会首先访问其Cache,只有当不命中的时候才会去访问历史节点和实时节点查询数据。
4、协调节点
对于整个Druid集群来说。其实并没有真正意义上的Master节点,因为实时节点与查询节点能自行管理并不听命于任何其他节点,但是对于历史节点来说,协调节点便是他们的Master,因为协调节点将会给历史节点分配数据,完成数据分布在历史节点之间的负载均衡。历史节点之间是相互不进行通讯的,全部通过协调节点进行通讯。
利用规则管理数据的生命周期:Druid利用针对每个DataSoure设置的规则来加载或者丢弃具体的文件数据,来管理数据的生命周期,可以对一个DataSource按顺序添加多条规则,对于一个Segment文件来说,协调节点会逐条检查规则,当碰到当前Segment文件负责某条规则的情况下,协调节点会立即命令历史节点对该文件执行此规则,加载或者丢弃,并停止余下的规则,否则继续检查。
5、索引服务
除了通过实时节点生产Segment文件之外,druid还提供了一组索引服务来摄入数据,相比较于实时节点,索引服务的优点是能够有不同的获取数据的方式,支持pull和push;可以通过API编程的方式来配置任务;可以更加灵活地使用资源;灵活地操作Segment文件等。
网友评论