Apache中德鲁伊多进程架构介绍

今天小编给大家分享的是Apache中Druid多进程架构的详细介绍,相信大部分人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,话不多说,一起往下看吧。

Druid 是多进程架构,每种进程类型都可以独立配置,独立扩展。这样可以为集群提供最大的灵活度。这种设计还提供了强失效容忍:一个失效的组件不会立即影响另外的组件。

下面我们来深入了解 Druid 有哪些进程类型,每种进程又在整个集群中扮演什么角色。

进程和服务(Process and Servers)

Druid 有多种进程类型,如下:

  • Coordinator进程在集群中负责管理数据可用。
  • Overlord进程控制数据摄入的资源负载分配。
  • Broker进程处理外部客户端的查询。
  • Router进程是可选的,它可以路由请求到 Brokers,Coordinator,和 Overlord。
  • Historical进程存储可查询的数据。
  • MiddleManager进程负责数据摄入。

你可以以任何方式来部署上面的进程。但是为了易于运维,官方建议以下面三种服务类型来组织进程:Master、Query 和 Data。

  • Master:运行 Coordinator 和 Overlord 进程,管理数据可用和数据写入。
  • Query: 运行 Broker 和可选的 Router 进程,负责处理外部查询请求。
  • Data:运行 Historical 和 MiddleManager 进程,负责执行数据写入任务并存储可查询的数据。

外部依赖(External dependencies)

除了内置的进程类型,Druid 还有三个外部依赖项。

Deep storage

共享文件存储,只要配置成允许 Druid 访问即可。在集群部署中,通常使用分布式存储(如 S3 或 HDFS)或挂载网络文件系统。在单机部署中,通常使用本地磁盘。Druid 使用 Deep Storage 存储写入集群的数据。

Druid 仅将 Deep Storage 用作数据的备份,并作为 Druid进程间在后台的数据传输方式。要响应查询,Historical 进程并不从 Deep Storage 上读取数据,在任何查询之前,先从本地磁盘查询已经存在的数据。这意味着,Druid 在查询时并不需要访问 Deep Storage,这样就可以得到最优的查询延迟。这也意味着,在 Deep Storage 和 Historical 进程间你必须有足够的磁盘空间来存储你计划加载的数据。

Deep Storage 是 Druid 弹性、容错设计的重要组成部分。如果 Druid 单机进程本地数据丢失,可以从 Deep Storage 恢复数据。

Metadata storage

元数据存储,存储各种共享的系统元数据,如 segment 可用性信息和 task 信息。在集群部署中,通常使用传统的 RDBMS,如 PostgreSQL 或 MySQL。在单机部署中,通常使用本地存储,如 Apache Derby 数据库。

Zookeeper

用来进行内部服务发现,协调,和主选举。

架构图(Architecture diagram)

下图可以看出使用官方建议的 Master/Query/Data 服务部署方式,查询和写入数据是如何进行的:

Apache中Druid多进程架构介绍

存储设计(Storage design)

Datasources and segments

Druid 数据存储在"datasources"中,它就像 RDBMS 中的 table。每一个 datasources 通过时间分区,或通过其他属性进行分区。每一个时间范围称之为"chunk"(比如,一天一个,如果你的 datasource 使用 day 分区)。在 chunk 中,数据被分区进一个或多个"segments"中。每一个 segment 是一个单独的文件,通常包含数百万行数据。一旦 segment 被存储进 chunks,其组织方式将如以下时间线所示:

Apache中Druid多进程架构介绍

一个 datasource 也许只有一个,也可能有数十万甚至上百万个 segment。每个 segment 生命周期开始于 MiddleManager 创建时,刚被创建时,segment 是可变和未提交的。segment 构建过程包含以下几步,旨在生成结构紧凑并支持快速查询的数据文件。

  • 转换成列格式
  • 使用 bitmap 创建索引
  • 使用各种算法压缩数据
    • 为 String 列做字典编码,用最小化 id 存储
    • 对 bitmap 索引做 bitmap 压缩
    • 对所有列做类型感知压缩

segment 定时提交和发布。此时,数据被写入 Deep Storage,并且再不可变,并从 MiddleManagers 进程迁移至 Historical 进程中。一个关于 segment 的 entry 将写入 metadata storage。这个 entry 是关于 segment 的元数据的自描述信息,包含如 segment 的数据模式,大小,Deep Storage 地址等信息。这些信息让 Coordinator 知道集群中哪些数据是可用的。

Apache中德鲁伊多进程架构介绍