Druid被设计成可扩展、高容错的集群。
在本文档中,我们将搭建一个简单的集群,并讨论如何进一步配置以满足您的需求。 这个简单的集群将为Historicals和MiddleManagers提供可扩展的容错服务器,以及一个单一的coordination服务器来承载协调器和Overlord进程。在生产中,我们建议部署Coordinator和Overlord也采用多机容错配置。
硬件要求
Coordinator和Overlord进程可以共同部署在同一台服务器上,该服务器负责处理集群的元数据和协调需求。硬件要求如下:
- 4核CPU
- 15GB内存
- 80GB SSD存储
Historicals和MiddleManagers可以共同部署在同一台服务器上,该服务器负责处理集群中的实际数据。主要需要CPU、内存和硬盘,硬件要求如下:
- 8核CPU
- 61GB内存
- 160GB SSD存储
Druid Brokers接受查询请求并将请求发送到集群的其余部分。它们还可选地保存查询的高速缓存。主要需要CPU和内存。
- 8核CPU
- 61GB内存
- 160GB SSD存储
您可以考虑在Broker服务器上运行Druid相关开源UI程序或者查询库。
更大的集群就需要更好配置的服务器。
操作系统
最好Linux,java版本1.7及其以上
下载集群
首先,下载和解压最新的Druid包。最好是在单个机器上操作,因为可以修改完配置文件后分发复制到所有机器。
curl -O http://static.druid.io/artifacts/releases/druid-0.9.2-bin.tar.gz
tar -xzf druid-0.9.2-bin.tar.gz
cd druid-0.9.2
在druid包下,有以下内容:
- LICENSE - license文件
- bin/ - 对此quickstart有用的脚本
- conf/ - 集群设置的配置模板
- conf-quickstart/ - 此quickstart的配置
- extensions/ - Druid的所有扩展
- haddop-dependencies/ - Druid haddop的依赖
- lib/ - 所有Druid核心包含的包
- quickstart/ - 对此quickstart有用的文件
需要修改conf文件夹下的配置文件
配置deep storage
Druid用分布式文件系统或大对象(blob)存储来进行数据存储。最常用的是亚马逊S3和HDFS。
S3
在conf/druid/_common/common.runtime.properties配置文件中,将设置druid.extensions.loadList=["druid-s3-extensions"],然后注释掉本地存储相关配置,放开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
HDFS
在conf/druid/_common/common.runtime.properties配置文件中,将设置druid.extensions.loadList=["io.druid.extensions:druid-hdfs-storage"],然后注释掉本地存储相关配置,放开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节点的classpath上。你可以通过将它们复制到conf/druid/_common/中来实现。
配置Tranquility服务器 (可选)
通过Tranquility服务器的http接口能够将数据流发送到Druid。如果想使用这种方法就需要配置Tranquility服务器。
配置Tranquility Kafka (可选)
Druid能够通过Tranquility Kafka从kafka消费获取数据流。如果想使用这种方法就需要配置Tranquility kafka。
配置Hadoop (可选)
如果需要通过hadoop集群加载数据,在Druid集群中需要如下配置:
更新conf/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节点的classpath路径里,可以copy到conf/druid/_common/core-site.xml, conf/druid/_common/hdfs-site.xml等等。
请注意,您不需要为了从Hadoop加载数据而使用HDFS深存储。例如,如果您的集群在Amazon Web Services上运行,我们建议使用S3进行深度存储,即使您正在使用Hadoop或Elastic MapReduce加载数据。
配置Druid coordination
在这个简单的集群示例中,可以在同一台服务器上,部署单个Druid Coordinator、Druid Overlord、一个ZooKeeper实例和一个嵌入式Derby元数据数据库。
修改conf/druid/_common/common.runtime.properties配置文件中druid.zk.service.host参数,指向zookeeper服务器地址。修改druid.metadata.storage.connector.connectURI和druid.metadata.storage.connector.host参数执行元数据存储地址。
生产上建议运行两个服务器,每个服务器运行一个Druid Coordinator和一个Druid Overlord。同时将ZooKeeper运行在一个独立的环境,元数据存储也用MySQL或者PostgreSQL运行在独立环境上。
调整服务查询Druid进程
Druid Historicals和MiddleManagers节点可以通过以下参数分配调整硬件资源:
-Xmx and -Xms
druid.server.http.numThreads
druid.processing.buffer.sizeBytes
druid.processing.numThreads
druid.query.groupBy.maxIntermediateRows
druid.query.groupBy.maxResults
druid.server.maxSize and druid.segmentCache.locations on Historical Nodes
druid.worker.capacity on MiddleManagers
保证 -XX:MaxDirectMemory >= numThreads*sizeBytes, 否则Druid会启动失败。
有关配置选项的详细说明请参考configuration documentation 。
调整Druid Brokers
Druid Brokers的主要配置如下:
-Xmx and -Xms
druid.server.http.numThreads
druid.cache.sizeInBytes
druid.processing.buffer.sizeBytes
druid.processing.numThreads
druid.query.groupBy.maxIntermediateRows
druid.query.groupBy.maxResults
保证 -XX:MaxDirectMemory >= numThreads*sizeBytes, 否则Druid会启动失败。
有关配置选项的详细说明请参考configuration documentation 。
端口开通
- 1527 (Derby on your Coordinator; not needed if you are using a separate metadata store like MySQL or PostgreSQL)
- 2181 (ZooKeeper; not needed if you are using a separate ZooKeeper cluster)
- 8081 (Coordinator)
- 8082 (Broker)
- 8083 (Historical)
- 8084 (Standalone Realtime, if used)
- 8088 (Router, if used)
- 8090 (Overlord)
- 8091, 8100–8199 (Druid Middle Manager; you may need higher than port 8199 if you have a very high druid.worker.capacity)
- 8200 (Tranquility Server, if used)
在生产上,建议将ZooKeeper和元数据存储独立部署,不要和Coordinator部署在同一个服务器上。
启动Coordinator, Overlord, Zookeeper, metadata store
将配置好的配置copy到协调服务器,如果本机已经配置好了也可以通过rsync来进行同步copy:
rsync -az druid-0.9.2/ COORDINATION_SERVER:druid-0.9.2/
安装Zookeeper:
curl http://www.gtlib.gatech.edu/pub/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz -o zookeeper-3.4.6.tar.gz
tar -xzf zookeeper-3.4.6.tar.gz
cd zookeeper-3.4.6
cp conf/zoo_sample.cfg conf/zoo.cfg
./bin/zkServer.sh start
在协调服务器上,cd进入Druid根目录,并启动协调服务(可以在不同的窗口执行或者将日志输出到文件中)。
java `cat conf/druid/coordinator/jvm.config | xargs` -cp conf/druid/_common:conf/druid/coordinator:lib/* io.druid.cli.Main server coordinator
java `cat conf/druid/overlord/jvm.config | xargs` -cp conf/druid/_common:conf/druid/overlord:lib/* io.druid.cli.Main server overlord
每一个服务启动后应该都有log信息输出,在var/log/druid目录可以查看更详细的日志信息。
启动Historicals和MiddleManagers
将配置好的Druid连同配置全目录拷贝到Druid Historicals和MiddleManagers服务器上。
登录服务器进入Druid根目录,执行以下指令:
java `cat conf/druid/historical/jvm.config | xargs` -cp conf/druid/_common:conf/druid/historical:lib/* io.druid.cli.Main server historical
java `cat conf/druid/middleManager/jvm.config | xargs` -cp conf/druid/_common:conf/druid/middleManager:lib/* io.druid.cli.Main server middleManager
按照需要也可以添加更多的Historicals和MiddleManagers节点。
For clusters with complex resource allocation needs, you can break apart Historicals and MiddleManagers and scale the components individually. This also allows you take advantage of Druid's built-in MiddleManager autoscaling facility.
如果您正在使用Kafka或通过HTTP进行基于推送的数据流加载,则还可以在MiddleManagers和Historicals的同一服务器上启动Tranquility Server。 对于大规模生产环境,MiddleManagers和Tranquility仍然可以位于同一服务器。 如果您使用流处理器运行Tranquility(而不是服务器),则可以将Tranquility与流处理器共存,而不需要单独的Tranquility服务器。
curl -O http://static.druid.io/tranquility/releases/tranquility-distribution-0.8.0.tgz
tar -xzf tranquility-distribution-0.8.0.tgz
cd tranquility-distribution-0.8.0
bin/tranquility <server or kafka> -configFile <path_to_druid_distro>/conf/tranquility/<server or kafka>.json
启动Druid Broker
进入Druid目录,执行以下指令启动Druid Broker:
java `cat conf/druid/broker/jvm.config | xargs` -cp conf/druid/_common:conf/druid/broker:lib/* io.druid.cli.Main server broker
根据查询负载也可以添加更多的Brokers。
加载数据
一个简单的Druid就搭建好了,下一步就需要学习如何按照需求进行数据加载了。
详情参考loading data.