Druid协调节点主要负责segment的管理和分配,它基于配置信息通知历史节点加载和删除segments。具体来说,协调节点的工作主要包括以下几个方面:加载新segments信息,删除过期segments信息,管理segment的复制操作和segment的负载均衡。
协调节点周期性的执行操作,执行间隔通过配置参数指定。与Broker和Historical节点类似,协调节点也会与ZK维持一个长连接,在执行相应的动作之前,协调节点会从ZK获取集群当前的状态。同时协调节点也维持着与一个数据库的链接,其中存储着可用segments和规则的信息。可用segments信息存储在segment表里,其中列除了所有在集群中加载的segments。规则信息存储在规则表中,它指明了segments应该被怎样处理。
在一个新segment被分配至历史节点前,所有可用的历史节点会根据已存储数据的大小进行排序,存储数据最少的节点有最高的优先级被分配到新segment,这种机制是为了节点之间存储的均衡。协调节点不会直接同历史节点进行通信,分配segment的过程是通过在ZK中相应的历史节点路径下创建临时segment信息节点完成的。一旦该动作被历史节点获知,该segment就会被历史节点加载,并使其可查询。
Running
io.druid.cli.Main server coordinator
Rules
Segments基于一组机制能够实现从集群中动态的加载和删除
Cleaning Up Segments
每一次执行时,协调节点将会对数据库中存储的可用segment信息和集群中当前可用的segment信息做比较。集群中存在但数据库中不存在的segments将会被标记并加入待删除队列。对于那些版本已过期并且数据已被新的segments覆盖的segments也会被删除。注意,如果数据库中所有的segments都被删除了(或者被标记为不可用),协调节点这时不会从集群中删除segments。
Segment Availability
如果一个历史节点由于重启或者其他原因处于不可用状态,协调节点会通知一个历史节点丢失,并将该历史节点服务的segments全部置为dropped。在一段时间后,这些segments会被重新分配给集群中的其它节点。但是,并不是每个被删除的segments信息马上就会被集群清理,会有一个数据结构来存储删除的segments和它们对应的生命周期。在这个周期时间内,协调节点不会重新分配这个删除的segments。因此,当一个历史节点在很短的时间内转变为可用状态时,它就能马上启动并使本地cache中的segments可用,同时避免了segments在集群节点中的从新分配过程。
Balancing Segment Load
为了保证segments在集群中尽可能地均匀分布,协调节点在每次运行时会计算每个历史节点所服务的所有segments的数据量情况。在集群每一层的历史节点中,协调节点会选出存储利用率最高和最低的历史节点,如果两个节点之间的利用率差值超过了一定的阈值,协调节点就会将一部分segments从最高利用率节点迁移到最低利用率节点,能够迁移的segments数量上限通过一个参数来限制。对于需要迁移Segments的选择是随机的,并且只有迁移动作真正能使利用率降低的情况下segments才会被迁移。
HTTP Endpoints
协调节点提供的接口(协调节点提供的接口很多,这里列举几个,详情请参考官网 【HTTP Endpoints】小节):
GET
- /status
返回Druid的版本信息、加载扩展、使用内存、全部内存和该节点其他有用的信息
Coordinator information
- /druid/coordinator/v1/leader
返回当前集群主协调节点 - /druid/coordinator/v1/loadstatus
返回已加载在集群中的segments和所有应加载segments的比率 - /druid/coordinator/v1/loadstatus?simple
返回未加载的segments和所有应加载segments的比率,不包括segments副本 - /druid/coordinator/v1/loadstatus?full
返回未加载的segments和所有应加载segments的比率,包括segments副本 - /druid/coordinator/v1/loadqueue
返回每个历史节点加载和删除segments的ID - /druid/coordinator/v1/loadqueue?simple
返回每个历史节点加载和删除segments的数目和及其加载和删除的数据总量。 - /druid/coordinator/v1/loadqueue?full
返回每个历史节点加载和删除segments的json序列化信息。
Metadata store information
- /druid/coordinator/v1/metadata/datasources
返回集群中所有可用的datasources列表 - /druid/coordinator/v1/metadata/datasources?includeDisabled
返回集群中所有可用的和不可用的datasources列表 - /druid/coordinator/v1/metadata/datasources?full
返回集群中所有可用的datasources列表及其存储的meta信息。 - /druid/coordinator/v1/metadata/datasources/{dataSourceName}
返回给定的datasource及其存储的meta信息。 - /druid/coordinator/v1/metadata/datasources/{dataSourceName}/segments
返回一个给定datasource中的所有segments列表 - /druid/coordinator/v1/metadata/datasources/{dataSourceName}/segments?full
返回一个给定datasource中的所有segments列表及其meta信息
Datasources information
- /druid/coordinator/v1/datasources
返回集群中查询到的datasources列表 - /druid/coordinator/v1/datasources?simple
返回一个包括datasource名称及其配置信息的json对象,对象中包含segments数量,segments数据总大小、最小时间和最大时间
Rules
以json对象的形式返回集群中所有datasource包括默认datasource包含的rules信息。
Intervals
- /druid/coordinator/v1/intervals
返回所有datasource的intervals信息,包括总大小和数量
DELETE
- /druid/coordinator/v1/datasources/{dataSourceName}
disable 一个给定的datasource