Apache Druid被设计为作为可水平拓展、容错的集群进行部署。
在本文档中,我们将设置一个简单的集群,并讨论如何对其进行进一步配置以满足您的需求。
这个简单的集群将具有以下特点:
在生产中,我们建议根据您的特定容错需求部署多个主服务器和多个查询服务器实现容错配置,但是您可以使用一台主服务器和一台Query服务器先上手,并在以后添加更多服务器实现拓展。
如果您没有现有的Druid集群,并希望在集群部署中运行Druid,则本指南提供了一个示例,其中包含预先配置的集群部署。
Master server
Coordinator 和Overlord进程负责处理集群的元数据和协调需求。它们可以一起部署在同一台服务器上。
在此示例中,我们将部署一个等效的AWS m5.2xlarge实例。
配置如下:
针对该硬件适配的示例master服务器配置可以在 Druid安装目录/conf/druid/cluster/master下面找到
。
data server
Historicals and MiddleManagers可以部署在同一服务器上,以处理集群中的实际数据。这些服务器受益于CPU,RAM和SSD。
在此示例中,我们将部署两个等效的AWS i3.4xlarge实例。
配置如下:
针对该硬件适配的示例data服务器配置可以在 Druid安装目录/conf/druid/cluster/data下面找到
。
Query server
Druid Brokers接受查询并将它们转发给集群的其余部分。它们还可以选择在内存中维护查询缓存。这些服务器受益于CPU和RAM。
在此示例中,我们将部署一个等效的AWS m5.2xlarge实例。
配置如下:
您可以考虑将所有开源UI或查询库共置于Broker运行所在的同一服务器上。
针对该硬件适配的示例data服务器配置可以在 Druid安装目录/conf/druid/cluster/query下面找到
。
上面的示例集群是从多种确定Druid集群大小的可能方式中选择的一个示例。
您可以根据自己的特定需求和限制选择较小/较大的硬件或较少/更多的服务器。
如果您的用例具有复杂的扩展要求,则还可以选择不将Druid进程并置(例如,独立的Historical Server)。
基本集群优化指南会对你的决策和调整配置有帮助。
如果您已有现有的单服务器部署,例如单服务器部署示例中的部署,并且希望迁移到类似规模的集群部署,则以下部分包含使用主服务器/数据/服务器选择等效硬件的准则查询服务器的组织。
Master server
主服务器的主要注意事项是Coordinator 和Overlord 堆的可用CPU和RAM。
汇总单机部署中为Coordinator 和Overlord 分配的堆大小,然后选择具有足够RAM用于堆总和的Master 服务器硬件,并为计算机上的其他进程提供一些额外的RAM。
对于CPU核数,您可以选择大约占单机部署核数1/4的硬件。
Data server
在为集群选择Data server硬件时,主要考虑因素是可用的CPU和RAM,并在可行时使用SSD存储。
在群集部署中,出于容错目的,最好拥有多个Data server。
选择Data server硬件时,可以选择一个拆分因子N
,将单服务器部署的原始CPU / RAM除以N
,然后在新集群中部署N台Data server。
本指南后面的部分介绍了针对拆分调整Historical / MiddleManager配置的说明。
Query server
Query server的主要注意事项是Broker 堆+直接内存和Router 堆的可用CPU和RAM。
汇总单机部署中为Broker和Router分配的内存大小,然后选择Query Server硬件,该RAM具有足够的RAM来覆盖Broker / Router,并为计算机上的其他进程提供一些额外的RAM。
对于CPU内核,您可以选择大约占单服务器部署内核的1/4的硬件。
基本集群调谐引导有如何计算经纪人/路由器存储器使用情况的信息。
我们建议运行您喜欢的Linux发行版。您还需要:
警告:运行Druid需要Java 8。虽然Druid可以在更高版本的Java上运行,但无法正常工作。
如果需要,您可以使用环境变量
DRUID_JAVA_HOME
或指定在哪里找到JavaJAVA_HOME
。有关更多详细信息,请运行verify-java脚本。
您的OS软件包管理器应该能够为这两种Java提供帮助。如果基于Ubuntu的OS没有足够新的Java版本,则WebUpd8将为这些OS提供软件包。
首先,下载并解压缩发行版。最好首先在单台计算机上执行此操作,因为您需要编辑配置,然后将修改后的分发复制到所有服务器上。
下载 0.17.0版本。
通过在终端中运行以下命令来提取Druid:
tar -xzf apache-druid-0.17.0-bin.tar.gz
cd apache-druid-0.17.0
在安装包中,您将找到:
LICENSE
和NOTICE
文件bin/*
-与单机快速入门相关的脚本conf/druid/cluster/*
-集群设置的模板配置extensions/*
-核心德鲁伊扩展hadoop-dependencies/*
-Druid Hadoop依赖项lib/*
-核心Druid的库和依赖项quickstart/*
-与单机快速入门相关的文件我们将编辑文件conf/druid/cluster/
以使一切正常运行。
为了保证运行,我们将修改conf/druid/cluster目录下的配置
。
如果您已经有一个单机部署的Druid,请复制您现有的配置到conf/druid/cluster
以保留所做的任何配置更改。
如果您已经有一个单机部署,并且希望保留整个迁移过程中的数据,请在更新元数据/深层存储配置之前,按照元数据迁移和深层存储迁移中的说明进行操作。
这个指南对使用Derby metadata store或者本地深度存储的单机部署。如果您已经在单机群集中使用非Derb metadata store,则可以将现有 metadata store重新用于新群集。
这个指南还提供有关从本地深层存储迁移段的信息。集群部署需要分布式深度存储,例如S3或HDFS。如果单服务器部署已在使用分布式深度存储,则可以将现有的深度存储重新用于新集群。
在中conf/druid/cluster/_common/common.runtime.properties
,将“ metadata.storage.*”替换为将用作metadata store的计算机的地址:
druid.metadata.storage.connector.connectURI
druid.metadata.storage.connector.host
在生产部署中,我们建议运行专用的metadata store,例如具有复制功能的MySQL或PostgreSQL,与Druid服务器分开部署。
该MySQL扩展和PostgreSQL的扩展文档具有扩展配置和初始数据库安装说明。
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
同时,
conf/druid/cluster/_common/
中来完成此操作。请参阅HDFS扩展文档以获取更多信息。
如果要从Hadoop集群加载数据,则此时应配置Druid以获取集群信息:
更新conf/druid/cluster/middleManager/runtime.properties 中的druid.indexer.task.hadoopWorkingPath属性为
使用索引过程所需的临时文件在HDFS上的路径。 druid.indexer.task.hadoopWorkingPath=/tmp/druid-indexing
是一个常见的选择。
将您的Hadoop配置XML(core-site.xml,hdfs-site.xml,yarn-site.xml,mapred-site.xml)放在Druid进程的类路径上。您可以通过将它们复制到 conf/druid/cluster/_common/core-site.xml
,conf/druid/cluster/_common/hdfs-site.xml
等等完成。
请注意,您无需使用HDFS深度存储即可从Hadoop加载数据。例如,如果您的集群在Amazon Web Services上运行,即使您使用Hadoop或Elastic MapReduce加载数据,我们也建议使用S3进行深度存储。
有关更多信息,请参见基于Hadoop的提取页面。
在生产集群中,我们建议在投票中使用专用的ZK集群,该集群与Druid服务器分开部署。
在conf/druid/cluster/_common/common.runtime.properties中
,将 druid.zk.service.host
设置为包含用逗号分隔的host:port对列表的连接字符串,与ZooKeeper服务器相对应。(例如“ 127.0.0.1:4545”或“ 127.0.0.1:3000,127.0.0.1:3001、127.0.0.1:3002”)
您也可以选择在master服务器上运行ZK,而不使用专用的ZK群集。如果这样做,我们建议部署3个主服务器,以便您具有ZK投票功能。
如果您使用的是单机部署示例中的示例配置,则这些示例将Coordinator和Overlord进程合并为一个合并的进程。
conf/druid/cluster/master/coordinator-overlord
下的示例配置同样结合了Coordinator进程和Overlord进程。
您可以将现有coordinator-overlord
配置从单机部署复制到conf/druid/cluster/master/coordinator-overlord
。
Data
假设我们正在从具有32个CPU和256GB RAM的单服务器部署中迁移。在旧的部署中,应用了Historicals和MiddleManager的以下配置:
Historicals(单服务器)
druid.processing.buffer.sizeBytes=500000000
druid.processing.numMergeBuffers=8
druid.processing.numThreads=31
MiddleManager(单服务器)
druid.worker.capacity=8
druid.indexer.fork.property.druid.processing.numMergeBuffers=2
druid.indexer.fork.property.druid.processing.buffer.sizeBytes=100000000
druid.indexer.fork.property.druid.processing.numThreads=1
在集群部署中,我们可以选择一个拆分因子(在此示例中为2),并部署2个数据服务器,每个服务器分别具有16CPU和128GB RAM。要扩展的领域如下:
Historicals
druid.processing.numThreads
:设置为(num_cores - 1)
基于新硬件druid.processing.numMergeBuffers
:将单服务器部署中的旧值除以拆分因子druid.processing.buffer.sizeBytes
:保持不变MiddleManager:
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
:保持不变分割后产生的配置:
新Historicals(在2个数据服务器上)
druid.processing.buffer.sizeBytes=500000000
druid.processing.numMergeBuffers=8
druid.processing.numThreads=31
新的MiddleManager(在2个数据服务器上)
druid.worker.capacity=4
druid.indexer.fork.property.druid.processing.numMergeBuffers=2
druid.indexer.fork.property.druid.processing.buffer.sizeBytes=100000000
druid.indexer.fork.property.druid.processing.numThreads=1
Query
您可以将现有的Broker和Router配置复制到下的目录中conf/druid/cluster/query
,无需更改,只要相应地调整了新硬件的大小即可。
如果您使用的是上述示例集群:
conf/druid/cluster
下面的配置已经为此硬件确定了尺寸,并且您无需针对一般使用情况进行进一步的修改。
如果您选择了其他硬件,则基本的群集调整指南可以帮助您调整配置大小。
如果您使用的防火墙或其他仅允许特定端口上的流量的系统,请在以下端口上允许入站连接:
druid.worker.capacity
很高,则可能需要高于端口8199 )在生产中,我们建议将ZooKeeper和元数据存储部署在其专用硬件上,而不是在Master服务器上。
将Druid发行版和您编辑的配置复制到主服务器。
如果您一直在本地计算机上编辑配置,则可以使用rsync复制它们:
rsync -az apache-druid-0.17.0/ MASTER_SERVER:apache-druid-0.17.0/
在根目录中,运行以下命令以启动Master:
bin/start-cluster-master-no-zk-server
如果您计划在主服务器上运行ZK,请首先将conf/zoo.cfg
更新为你期望ZK运行的配置。然后,您可以使用以下命令与ZK一起启动主服务器进程:
bin/start-cluster-master-with-zk-server
在生产中,我们还建议在自己的专用硬件上运行ZooKeeper群集。
将Druid和您编辑的配置复制到您的数据服务器。
在根目录中,运行以下命令以启动数据服务器:
bin/start-cluster-data-server
您可以根据需要添加更多数据服务器。
对于具有复杂资源分配需求的集群,您可以将Historys和MiddleManager分开,并分别扩展组件。这也使您能够利用Druid的内置MiddleManager自动缩放功能。
将Druid分发和您编辑的配置复制到查询服务器。
在分发根目录中,运行以下命令以启动查询服务器:
bin/start-cluster-query-server
您可以根据查询负载,根据需要添加更多查询服务器。如果增加了查询服务器的数量,请确保按照基本集群调优指南中的说明调整“历史记录”和“任务”上的连接池。
恭喜,您现在有了Druid集群!下一步是根据用例了解将数据加载到Druid的推荐方法。阅读有关加载数据的更多信息。