跳转到主要内容

集群部署

Apache Druid 旨在部署为可扩展、容错的集群。

在本文档中,我们将建立一个简单的集群,并讨论如何对其进行进一步配置以满足您的需求。

此简单集群将包含:

  • 一台主 (Master) 服务器,用于托管 Coordinator 和 Overlord 进程
  • 两台可扩展、容错的数据 (Data) 服务器,运行 Historical 和 Middle Manager 进程
  • 一台查询 (Query) 服务器,托管 Druid Broker 和 Router 进程

在生产环境中,我们建议根据您的具体容错需求,采用多主服务器和多查询服务器的容错配置。但您可以先从一台主服务器和一台查询服务器快速入门,稍后再添加更多服务器。

选择硬件

全新部署

如果您尚无现有的 Druid 集群,并希望开始以集群方式运行 Druid,本指南提供了包含预设配置的集群部署示例。

Master 服务器

Coordinator 和 Overlord 进程负责处理集群的元数据和协调需求。它们可以共置在同一台服务器上。

在此示例中,我们将部署相当于一台 AWS m5.2xlarge 的实例。

此硬件提供:

  • 8 个 vCPU
  • 32 GiB 内存

为该硬件调整大小的主服务器配置示例可在 conf/druid/cluster/master 下找到。

Data 服务器

Historical 和 Middle Manager 可以共置在同一台服务器上,以处理集群中的实际数据。这些服务器非常依赖 CPU、内存和 SSD。

在此示例中,我们将部署相当于两台 AWS i3.4xlarge 的实例。

此硬件提供:

  • 16 个 vCPU
  • 122 GiB 内存
  • 2 * 1.9TB SSD 存储

为该硬件调整大小的数据服务器配置示例可在 conf/druid/cluster/data 下找到。

Query 服务器

Druid Broker 负责接收查询并将其分发到集群的其余部分。它们还可以选择性地维护内存查询缓存。这些服务器非常依赖 CPU 和内存。

在此示例中,我们将部署相当于一台 AWS m5.2xlarge 的实例。

此硬件提供:

  • 8 个 vCPU
  • 32 GiB 内存

您可以考虑将任何开源 UI 或查询库与 Broker 运行在同一台服务器上。

为该硬件调整大小的查询服务器配置示例可在 conf/druid/cluster/query 下找到。

其他硬件规格

上述集群示例只是配置 Druid 集群的多种可能方式之一。

您可以根据自己的特定需求和限制选择更小/更大的硬件,或更少/更多的服务器。

如果您的用例有复杂的扩展需求,您也可以选择不共置 Druid 进程(例如,使用独立的 Historical 服务器)。

基本集群调优指南中的信息可以帮助您进行决策并调整配置规模。

从单服务器部署迁移

如果您已有现有的单服务器部署(例如单服务器部署示例中的内容),并希望迁移到规模相似的集群部署,以下部分提供了使用主/数据/查询服务器组织方式选择等效硬件的指南。

主服务器

主服务器的主要考虑因素是 Coordinator 和 Overlord 堆所需的 CPU 和内存资源。

汇总单服务器部署中为 Coordinator 和 Overlord 分配的堆大小,选择具有足够内存来容纳这些合并堆的主服务器硬件,并为机器上的其他进程预留一些额外内存。

对于 CPU 核心数,您可以选择拥有单服务器部署约 1/4 核心数的硬件。

数据服务器

在为集群选择数据服务器硬件时,主要考虑因素是可用的 CPU 和内存,以及尽可能使用 SSD 存储。

在集群部署中,为了容错,拥有多台数据服务器是一个好主意。

选择数据服务器硬件时,您可以选择一个拆分因子 N,将单服务器部署的原始 CPU/内存除以 N,并在新集群中部署 N 台缩减规格的数据服务器。

本指南后续章节将介绍调整 Historical/Middle Manager 配置以适应这种拆分的说明。

查询服务器

查询服务器的主要考虑因素是用于 Broker 堆(+ 直接内存)和 Router 堆的 CPU 和内存资源。

汇总单服务器部署中为 Broker 和 Router 分配的内存大小,选择具有足够内存来覆盖这些进程的查询服务器硬件,并为机器上的其他进程预留一些额外内存。

对于 CPU 核心数,您可以选择拥有单服务器部署约 1/4 核心数的硬件。

基本集群调优指南中提供了如何计算 Broker/Router 内存使用量的信息。

选择操作系统

我们建议运行您熟悉的 Linux 发行版。您还需要:

信息

如有需要,您可以使用环境变量 DRUID_JAVA_HOMEJAVA_HOME 指定 Java 路径。有关更多详细信息,请运行 bin/verify-java 脚本。

有关安装 Java 的信息,请参阅您的操作系统包管理器文档。如果您的 Ubuntu 系统中没有足够新的 Java 版本,Linux Uprising 提供了适用于这些系统的软件包

下载发行版

首先,下载并解压发布包。最好先在单台机器上进行此操作,因为您需要编辑配置,然后再将修改后的发行版复制到所有服务器上。

下载 37.0.0 版本。

通过在终端中运行以下命令来解压 Druid:

tar -xzf apache-druid-37.0.0-bin.tar.gz
cd apache-druid-37.0.0

在包中,您应该能找到:

  • LICENSENOTICE 文件
  • bin/* - 与单机快速入门相关的脚本
  • conf/druid/cluster/* - 集群设置的模板配置
  • extensions/* - 核心 Druid 扩展
  • lib/* - 核心 Druid 的库和依赖项
  • quickstart/* - 与单机快速入门相关的文件

我们将编辑 conf/druid/cluster/ 中的文件以使其运行。

从单服务器部署迁移

在以下章节中,我们将编辑 conf/druid/cluster 下的配置。

如果您有现有的单服务器部署,请将现有配置复制到 conf/druid/cluster,以保留您所做的任何配置更改。

配置元数据存储和深度存储

从单服务器部署迁移

如果您有现有的单服务器部署并希望在迁移过程中保留数据,请在更新元数据/深度存储配置之前,按照元数据迁移深度存储迁移中的说明进行操作。

这些指南针对使用 Derby 元数据存储和本地深度存储的单服务器部署。如果您在单服务器集群中已经使用非 Derby 元数据存储,则可以在新集群中重用现有的元数据存储。

这些指南还提供了关于从本地深度存储迁移分段的信息。集群部署需要分布式深度存储,例如 S3 或 HDFS。如果您的单服务器部署已经在使用分布式深度存储,则可以在新集群中重用现有的深度存储。

元数据存储 (Metadata storage)

conf/druid/cluster/_common/common.runtime.properties 中,将 "metadata.storage.*" 替换为您将用作元数据存储的机器地址:

  • druid.metadata.storage.connector.connectURI
  • druid.metadata.storage.connector.host

在生产部署中,我们建议运行专用的元数据存储(如 MySQL 或 PostgreSQL),并配置副本,与 Druid 服务器分开部署。

MySQL 扩展PostgreSQL 扩展文档中包含有关扩展配置和初始数据库设置的说明。

深度存储 (Deep storage)

Druid 依赖分布式文件系统或大对象 (Blob) 存储进行数据持久化。最常用的深度存储实现是 S3(AWS 用户常用)和 HDFS(如果您已有 Hadoop 部署,则常用)。

S3

conf/druid/cluster/_common/common.runtime.properties 中:

  • 将 "druid-s3-extensions" 添加到 druid.extensions.loadList

  • 注释掉“深度存储”和“索引服务日志”下有关本地存储的配置。

  • 取消注释并配置“深度存储”和“索引服务日志”中“针对 S3”部分的相应值。

完成这些步骤后,您应该已经进行了以下更改:

druid.extensions.loadList=["druid-s3-extensions"]

#druid.storage.type=local
#druid.storage.storageDirectory=var/druid/segments

druid.storage.type=s3
druid.storage.bucket=your-bucket
druid.storage.baseKey=druid/segments
druid.s3.accessKey=...
druid.s3.secretKey=...

#druid.indexer.logs.type=file
#druid.indexer.logs.directory=var/druid/indexing-logs

druid.indexer.logs.type=s3
druid.indexer.logs.s3Bucket=your-bucket
druid.indexer.logs.s3Prefix=druid/indexing-logs

请参阅 S3 扩展文档以获取更多信息。

HDFS

conf/druid/cluster/_common/common.runtime.properties 中:

  • 将 "druid-hdfs-storage" 添加到 druid.extensions.loadList

  • 注释掉“深度存储”和“索引服务日志”下有关本地存储的配置。

  • 取消注释并配置“深度存储”和“索引服务日志”中“针对 HDFS”部分的相应值。

完成这些步骤后,您应该已经进行了以下更改:

druid.extensions.loadList=["druid-hdfs-storage"]

#druid.storage.type=local
#druid.storage.storageDirectory=var/druid/segments

druid.storage.type=hdfs
druid.storage.storageDirectory=/druid/segments

#druid.indexer.logs.type=file
#druid.indexer.logs.directory=var/druid/indexing-logs

druid.indexer.logs.type=hdfs
druid.indexer.logs.directory=/druid/indexing-logs

此外:

  • 将您的 Hadoop 配置 XML 文件(core-site.xml, hdfs-site.xml, yarn-site.xml, mapred-site.xml)放置在 Druid 进程的类路径中。您可以通过将它们复制到 conf/druid/cluster/_common/ 来实现。

请参阅 HDFS 扩展文档以获取更多信息。

配置 Zookeeper 连接

在生产集群中,我们建议使用专用 ZK 集群的法定人数 (quorum),与 Druid 服务器分开部署。

conf/druid/cluster/_common/common.runtime.properties 中,将 druid.zk.service.host 设置为包含逗号分隔的主机列表的连接字符串:端口对,每一对对应于 ZK 法定人数中的一个 ZooKeeper 服务器。(例如 "127.0.0.1:4545" 或 "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002")

您也可以选择在主服务器上运行 ZK,而不是拥有专用的 ZK 集群。如果这样做,我们建议部署 3 台主服务器,以便拥有一个 ZK 法定人数。

配置调优

从单服务器部署迁移

主服务器

如果您使用的是单服务器部署示例中的示例配置,这些示例将 Coordinator 和 Overlord 进程合并为一个进程。

conf/druid/cluster/master/coordinator-overlord 下的示例配置同样合并了 Coordinator 和 Overlord 进程。

您可以将单服务器部署中现有的 coordinator-overlord 配置复制到 conf/druid/cluster/master/coordinator-overlord

数据服务器

假设我们正从拥有 32 CPU 和 256GiB 内存的单服务器部署进行迁移。在旧部署中,Historical 和 Middle Manager 应用了以下配置:

Historical(单服务器)

druid.processing.buffer.sizeBytes=500MiB
druid.processing.numMergeBuffers=8
druid.processing.numThreads=31

Middle Manager(单服务器)

druid.worker.capacity=8
druid.indexer.fork.property.druid.processing.numMergeBuffers=2
druid.indexer.fork.property.druid.processing.buffer.sizeBytes=100MiB
druid.indexer.fork.property.druid.processing.numThreads=1

在集群部署中,我们可以选择一个拆分因子(本例中为 2),并部署 2 台数据服务器,每台配备 16 CPU 和 128GiB 内存。需要扩展的区域如下:

Historical

  • druid.processing.numThreads:根据新硬件设置为 (num_cores - 1)
  • druid.processing.numMergeBuffers:将单服务器部署中的旧值除以拆分因子
  • druid.processing.buffer.sizeBytes:保持不变

Middle Manager

  • druid.worker.capacity:将单服务器部署中的旧值除以拆分因子
  • druid.indexer.fork.property.druid.processing.numMergeBuffers:保持不变
  • druid.indexer.fork.property.druid.processing.buffer.sizeBytes:保持不变
  • druid.indexer.fork.property.druid.processing.numThreads:保持不变

拆分后的最终配置:

新 Historical(位于 2 台数据服务器上)

druid.processing.buffer.sizeBytes=500MiB
druid.processing.numMergeBuffers=4
druid.processing.numThreads=15

新 Middle Manager(位于 2 台数据服务器上)

druid.worker.capacity=4
druid.indexer.fork.property.druid.processing.numMergeBuffers=2
druid.indexer.fork.property.druid.processing.buffer.sizeBytes=100MiB
druid.indexer.fork.property.druid.processing.numThreads=1

查询服务器

您可以将现有的 Broker 和 Router 配置复制到 conf/druid/cluster/query 下的目录中,只要新硬件规模相应,无需修改。

全新部署

如果您使用上述示例集群:

  • 1 台主服务器 (m5.2xlarge)
  • 2 台数据服务器 (i3.4xlarge)
  • 1 台查询服务器 (m5.2xlarge)

conf/druid/cluster 下的配置已针对此硬件调整大小,对于一般用例,无需进行进一步修改。

如果您选择了不同的硬件,基本集群调优指南可以帮助您调整配置规模。

打开端口(如果使用防火墙)

如果您使用防火墙或其他仅允许特定端口流量的系统,请允许以下入站连接:

主服务器

  • 1527(Derby 元数据存储;如果您使用 MySQL 或 PostgreSQL 等独立元数据存储,则不需要)
  • 2181(ZooKeeper;如果您使用独立的 ZooKeeper 集群,则不需要)
  • 8081(Coordinator)
  • 8090(Overlord)

数据服务器

  • 8083(Historical)
  • 8091, 8100–8199(Druid Middle Manager;如果您有极高的 druid.worker.capacity,可能需要高于 8199 的端口)

查询服务器

  • 8082(Broker)
  • 8088(Router,如果使用)
信息

在生产环境中,我们建议将 ZooKeeper 和元数据存储部署在各自的专用硬件上,而不是主服务器上。

启动主服务器

将 Druid 发行版和您编辑后的配置复制到主服务器。

如果您一直在本地机器上编辑配置,可以使用 rsync 复制它们:

rsync -az apache-druid-37.0.0/ MASTER_SERVER:apache-druid-37.0.0/

主服务器上没有 Zookeeper

从发行版根目录运行以下命令以启动主服务器:

bin/start-cluster-master-no-zk-server

主服务器上有 Zookeeper

如果您计划在主服务器上运行 ZK,请先更新 conf/zoo.cfg 以反映您的 ZK 运行计划。然后,您可以使用以下命令将主服务器进程与 ZK 一起启动:

bin/start-cluster-master-with-zk-server
信息

在生产环境中,我们同样建议在专用硬件上运行 ZooKeeper 集群。

启动数据服务器

将 Druid 发行版和您编辑后的配置复制到数据服务器。

从发行版根目录运行以下命令以启动数据服务器:

bin/start-cluster-data-server

您可以根据需要添加更多数据服务器。

信息

对于资源分配需求复杂的集群,您可以将 Historical 和 Middle Manager 拆分并单独扩展组件。这也允许您利用 Druid 内置的 Middle Manager 自动伸缩功能。

启动查询服务器

将 Druid 发行版和您编辑后的配置复制到查询服务器。

从发行版根目录运行以下命令以启动查询服务器:

bin/start-cluster-query-server

您可以根据查询负载添加更多查询服务器。如果您增加了查询服务器的数量,请确保按照基本集群调优指南中的说明调整 Historical 和任务上的连接池。

加载数据

恭喜,您现在拥有一个 Druid 集群了!下一步是根据您的用例了解将数据加载到 Druid 的推荐方式。阅读更多关于加载数据的内容。