概述
- 如果希望运行分布式集群,Broker是查询路由的流程。Broker可以读取并理解zookeeper集群上的元数据,这些元数据是关于哪些进程和路由查询上存在哪些段,以便它们能够访问正确的进程。此过程还将来自所有单个过程的结果集合并在一起。当启动的时候,Historical进程会在zookeeper中声明自己和他们所服务的Segment。
运行命令
org.apache.druid.cli.Main server broker
转发查询
- 大多数的Druid查询都包含一个Interval对象,它表示请求数据的时间段。Druid的Segments被切割成一定时间间隔的数据,分布在一个集群中。假设一个简单的datasource包含7个Segment,其中每个Segment包含一周中某一天的数据。现在,向datasource中查询超过一天的数据,这会查询多个Segment。这些Segment可能会分布在多个进程中,因此,查询可能涉及多个进程。
- 为了确定将查询转发给某个具体的进程,Broker进程首先会总zookeeper的元数据中读取相关信息。zookeeper中维护这关于Historical进程 、流式提取Peon进程、和他们服务的Segments信息。对于zookeeper中的每一个datasource,Broker会创建一个包含哪些Segment和服务哪些Segments的时间轴。当接收到特定datasource和时间间隔的查询时,Broker会在时间轴上查询时间间隔相关的datasource,并查询数据的进程。然后Broker会将查询转发给所选的进程中。
缓存
- Broker进程会使用带有LRU缓存失效策略的缓存机制。Broker缓存存储Segment结果,缓存可以是每个Broker进程的本地缓存,也可以使用外部分布式缓存(如memcached)在多个进程之间共享。当Broker进程接收到一个查询
query
时,首先将查询映射到一组Segment。这一组Segment的一部分已经存在缓存中,并且可以直接从缓存中读取结果。对于不在缓存中Segment,Broker进程将查询转发给Historical进程。一旦Historical进程将查询结果返回,Broker进程会将结果缓存。Real-time segments 永远不会被缓存,因此对real-time数据的请求总是被转发给real-time进程。real-time数据是不断变化的,所以缓存的结果是不可靠的。
网友评论