druid-docs-cn/tutorials/cluster.md

444 lines
22 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 集群方式部署
Apache Druid 被设计部署为可扩展和容错的集群部署方式。
在本文档中,我们将会设置一个示例集群,并且进行一些讨论,你可以进行那些修改来满足你的需求。
这个简单的集群包括有下面的特性:
- 主服务器Master Server将会运行 Coordinator 和 Overlord 进程
- 2 个可扩展和容错的数据服务器将会运行 Historical 和 MiddleManager 进程
- 一个查询服务器Query Server将会运行 Broker 和 Router 进程
在生产环境中,我们建议你部署多个 Master 服务器和多个 Query 服务器服务器的高可用性fault-tolerant配置与你的数据特性和容错性要求息息相关。
但是你可以使用一个主服务器Master Server 和 一个查询服务器Query Server来启动服务随着需求的增加你可以随时增加更多的服务器节点。
## 选择硬件
### 全新部署
如果你没有已经存在的 Druid 集群,但是你希望开始在你的环境中使用集群方式部署 Druid本文档将会使用预配置pre-made configurations内容来帮助你开始部署 Druid 的集群。
#### 主服务器Master Server
Coordinator 和 Overlord 进程将会负责处理 metadata 数据和在你集群中进行协调。这 2 个进程可以合并在同一个服务器上。
在本示例中,我们将会在 AWS [m5.2xlarge](https://aws.amazon.com/ec2/instance-types/m5/) 部署一个评估的服务器和实例。
AWS 上面硬件的配置为:
- 8 vCPUs
- 31 GB RAM
有关本服务器的配置信息和有关硬件大小的建议,可以在文件 `conf/druid/cluster/master` 中找到。
#### 数据服务器Data server
Historicals 和 MiddleManagers 可以合并到同一个服务器上,这个 2 个进程在你的集群中用于处理实际的数据。通常来说越大 CPU, RAM, SSDs硬盘越好。
在本示例中,我们将会在 [i3.4xlarge](https://aws.amazon.com/ec2/instance-types/i3/) 部署一个评估的服务器和实例。
AWS 上面硬件的配置为:
- 16 vCPUs
- 122 GB RAM
- 2 * 1.9TB SSD storage
有关本服务器的配置信息和有关硬件大小的建议,可以在文件 `conf/druid/cluster/data` 中找到。
#### 查询服务器Query server
Druid Brokers 可以接受查询,并且将接受的查询发送到集群中处理。同时他们也负责维护内存中的查询缓存, 常来说越大的 CPU, RAM 越好。
在本示例中,我们将会在 [m5.2xlarge](https://aws.amazon.com/ec2/instance-types/m5/) 部署一个评估的服务器和实例。
AWS 上面硬件的配置为:
- 8 vCPUs
- 31 GB RAM
你也可以考虑在运行 Broker 进程的查询服务器上部署任何开源的 UI 或者查询库。
有关本服务器的配置信息和有关硬件大小的建议,可以在文件,可以在文件 `conf/druid/cluster/query` 中找到。
#### 其他硬件大小
上面的示例集群配置是从多种确定 Druid 集群可能的配置方式中选择的一个示例。
您可以根据自己的特定需求和要求来选择 较小/较大的硬件配置或 较少/更多的服务器数量。
如果你的使用实例有比较复杂的可扩展性要求,你也可以选择不将进程合并到服务器上的配置方案,而针对每一个进程配置一台服务器(例如,你可以配置一个独立的 Historical 服务器)。
有关更多的配置信息,请参考页面 [basic cluster tuning guide](../operations/basic-cluster-tuning.md) 中的内容,能够帮助你如何对你的配置进行配置和扩展。
### 从独立服务器部署上合并到集群
如果你已经有一个已经存在并且独立运行的独立服务器部署的话,例如在页面 [single-server deployment examples](../operations/single-server.md) 中部署的服务器,
现在你希望将这个独立部署的服务器合并到集群的部署方式中的话,下面的这部分内容将会帮助你完成这个切换和合并的过程。
这个过程包括有如何对硬件进行的选择和针对 Master/Data/Query 服务器应该如何进行组织。
#### 主服务器Master Server
针对主服务器主要需要考虑的就是 Coordinator 和 Overlord 进程的 CPU 使用和 RAM 内存的 heaps。
从单独服务器部署的实例中找到 Coordinator 和 Overlord 进程的总计 heap 内存使用大小,然后在新的集群服务上选择硬件时候的 RAM 内存选择,需要有这 2 个进程合并 heap 的大小。
同时还需要准备为这台服务器留够足够的内存供其他进程使用。
针对服务器使用的 CPU 内核,你可以只选择在单独部署情况下的 1/4 即可。
#### 数据服务器Data server
当对数据服务器进行选择的时候,主要考虑的是 CPU 数量和 RAM 内存数量,同时如果能够使用 SSD 固态硬盘就更好了。
在针对集群的部署中,如果能够使用多台服务器来部署数据服务器就更好了,因为这样能够让集群拥有更多的冗余来保障持续运行。
当针对数据服务器选择硬件的时候,你可以选择分裂因子 'N',针对原始独立服务器部署的时候的 CPU/RAM 的数量除以 N 然后按照除以 'N' 后的结果来确定集群服务器的硬件要求。
针对 Historical/MiddleManager 的配置调整和分离将会在本页面后部分的指南中进行说明。
#### 查询服务器Query server
当对数据服务器进行选择的时候,主要考虑的是 CPU 数量RAM 内存数量和 Broker 进程的的 heap 内存加上直接内存direct memory以及 Router 进程的 heap 内存。
将 Broker 和 Router 进程在独立服务器上使用的内存数量相加,然后选择的查询服务器的内存需要足够大的内存来覆盖 Broker/Router 进程使用内存相加的结果。
同时还需要准备为这台服务器留够足够的内存供其他进程使用。
针对服务器使用的 CPU 内核,你可以只选择在单独部署情况下的 1/4 即可。
请参考 [basic cluster tuning guide](../operations/basic-cluster-tuning.md) 页面中的内容,来确定如何计算 Broker/Router 进程使用的内存。
## 选择操作系统
我们推荐你使用任何你喜欢的 Linux 操作系统。同时你需要安装:
* **Java 8 或者更新的版本**
> **警告:** Druid 目前只能官方的支持 Java 8。如果你使用其他的 JDK 版本,那么很多功能可能是实践性的的。
>
> 如果需要的话,你可以在你的系统环境中定义环境变量 `DRUID_JAVA_HOME` 或 `JAVA_HOME`,来告诉 Druid 到哪里可以找到需要的 JDK 版本。
> 可以运行 Druid 程序中的 `bin/verify-java` 脚本来查看当前运行的 Java 版本。
你的操作系统包管理工具应该能够帮助你在操作系统中安装 Java。
如果你使用的是基于 Ubuntu 的操作系统,但是这个操作系统没有提供的最新版本的 Java 的话,请尝试访问 WebUpd8 页面中的内容: [packages for those
OSes](http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html) 。
## 下载发行版本
首先,需要下载并且解压缩相关的归档文件。
最好先在单台计算机上进行相关操作。因为随后你需要在解压缩的包内对配置进行修改,然后将修改后的配置发布到所有的其他服务器上。
[apache-druid-0.21.1 下载地址](https://www.apache.org/dyn/closer.cgi?path=/druid/apache-druid-0.21.1/apache-druid-apache-druid-0.21.1-bin.tar.gz)
在控制台中使用下面的命令来进行解压:
```bash
tar -xzf apache-druid-apache-druid-0.21.1-bin.tar.gz
cd apache-druid-apache-druid-0.21.1
```
在解压后的包中,你应该能够看到:
* `LICENSE``NOTICE` 文件
* `bin/*` - 启动或停止的脚本,这是针对独立服务器进行部署的,请参考页面: [独立服务器部署快速指南](../tutorials/index.md)
* `conf/druid/cluster/*` - 针对集群部署的配置和设置文件
* `extensions/*` - Druid 核心扩展
* `hadoop-dependencies/*` - Druid Hadoop 依赖
* `lib/*` - Druid 核心库和依赖
* `quickstart/*` - 独立服务器配置的相关文件,这是针对独立服务器进行部署的,请参考页面: [独立服务器部署快速指南](../tutorials/index.md)
如果你需要让你的集群能够启动的话,我们将会对 `conf/druid/cluster/` 中的内容进行编辑。
### 从独立服务器部署上进行合并
如果需要完成后续页面的部署和配置的话,你需要对 `conf/druid/cluster/` 中的内容进行编辑。
如果你已经有一个正在运行的独立服务器部署的话,请拷贝你已经存在的配置文件到 `conf/druid/cluster` 文件夹中,以保证你已有的配置文件不丢失。
## 配置 metadata 存储和深度存储deep storage
### 从独立服务器部署上合并到集群
如果您已经有一个独立服务器的部署实例,并且希望在整个迁移过程中保留数据,请在对元数据进行迁移之前先阅读:
* [metadata migration](../operations/metadata-migration.md)
* [deep storage migration](../operations/deep-storage-migration.md)
本指南中的元数据迁移是针对你将原数据存储在 Derby 数据库中,同时你的深度存储也是使用的 Derby 数据库。
如果你在单实例部署的服务器上已经使用了非 Derby 的数据库存储元数据或者分布式深度存储的那,那么你可以在新的集群环境中使用已经存在并且使用的存储方案。
本指南还提供了从本地深度存储中进行段合并的信息。
集群环境的部署是需要配置深度存储的,例如 S3 或 HDFS。
如果单实例部署已在使用分布式深度存储,则可以在新集群中继续使用当前的深度存储。
### 元数据存储
`conf/druid/cluster/_common/common.runtime.properties` 配置文件中,替换 "metadata.storage.*" 的的属性来确定元数据存储的服务器地址。
元数据通常是存储在数据库中的,因此你可以在这里配置你的数据库服务器地址。
- `druid.metadata.storage.connector.connectURI`
- `druid.metadata.storage.connector.host`
在实际的生产环境中,我们推荐你使用独立的元数据存储数据库例如 MySQL 或者 PostgreSQL 来增加冗余性。
这个配置将会在 Druid 服务器外部配置一个数据库连接来保留一套元数据的配置信息,以增加数据冗余性。
[MySQL extension](../development/extensions-core/mysql.md) 和 [PostgreSQL extension](../development/extensions-core/postgresql.md)
页面中有如何对扩展进行配置和对数据库如何进行初始化的说明,请参考上面页面中的内容。
### 深度存储
Druid 依赖分布式文件系统或者一个大对象blob存储来对数据进行存储。
最常用的深度存储的实现通常使用的是 S3 (如果你使用的是 AWS 的话)或者 HDFS如果你使用的是 Hadoop 部署的话)。
#### S3
在文件 `conf/druid/cluster/_common/common.runtime.properties`
- 添加 "druid-s3-extensions" 到 `druid.extensions.loadList`
- 在 "Deep Storage" 和 "Indexing service logs" 部分的配置中,注释掉本地存储的配置。
- 在 "Deep Storage" 和 "Indexing service logs" 部分的配置中,取消注释 "For 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 extension](../development/extensions-core/s3.md) 页面中的内容来获得更多的信息。
#### HDFS
在文件 `conf/druid/cluster/_common/common.runtime.properties`
- 添加 "druid-hdfs-storage" 到 `druid.extensions.loadList`
- 在 "Deep Storage" 和 "Indexing service logs" 部分的配置中,注释掉本地存储的配置。
- 在 "Deep Storage" 和 "Indexing service logs" 部分的配置中,取消注释 "For 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
```
同时,
- 在你 Druid 启动进程的的 classpath 中,请替换掉你的 Hadoop 配置 XMLs 文件(core-site.xml, hdfs-site.xml, yarn-site.xml,
mapred-site.xml),或者你可以直接拷贝上面的文件到 `conf/druid/cluster/_common/` 中。
请参考 [HDFS extension](../development/extensions-core/hdfs.md) 页面中的内容来获得更多的信息。
## Hadoop 连接配置(可选)
如果你希望从 Hadoop 集群中加载数据,那么你需要对你的 Druid 集群进行下面的一些配置:
- 更新 `conf/druid/cluster/middleManager/runtime.properties` 文件中的 `druid.indexer.task.hadoopWorkingPath` 配置选项。
将 HDFS 配置路径文件更新到一个你期望使用的临时文件存储路径。`druid.indexer.task.hadoopWorkingPath=/tmp/druid-indexing` 为通常的配置。
- 将你的 Hadoop XMLs配置文件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` 拷贝到 `conf/druid/cluster/_common` 目录中。
请注意,你不需要为了从 Hadoop 中载入数据而使用 HDFS 深度存储。
例如,如果您的集群在 Amazon Web Services 上运行,即使已经使用 Hadoop 或 Elastic MapReduce 加载数据,我们也建议使用 S3 进行深度存储。
有关更多的信息,请参考 [Hadoop-based ingestion](../ingestion/hadoop.md) 页面中的内容。
## 配置 Zookeeper 连接
在实际的生产环境中,我们建议你使用专用的 ZK 集群来进行部署。ZK 的集群与 Druid 的集群部署是分离的。
`conf/druid/cluster/_common/common.runtime.properties` 配置文件中,设置
`druid.zk.service.host` 为 [connection string](https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html)。
在连接配置中使用的是逗号分隔符host:port 对),每一个对应的是一个 ZK 的服务器,(例如, "127.0.0.1:4545" or "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002")。
你也可以选择在 Master 服务器上运行 ZK而不使用专用的 ZK 集群。
如果这样做的话,我们建议部署 3 个 Master 服务服务器,以便具有 ZK 仲裁(因为 Zookeeper 的部署至少需要 3 个服务器,并且服务器的总数量为奇数)。
## 配置调整
### 从一个单独部署服务器上进行合并
#### Master 服务
如果你已经有一个已经存在并且独立运行的独立服务器部署的话,例如在页面 [single-server deployment examples](../operations/single-server.md) 中部署的服务器,
下面的这个示例将会帮助你将 Coordinator 和 Overlord 合并到一个进程上面
`conf/druid/cluster/master/coordinator-overlord` 下面的示例,显示例如如何同时合并 Coordinator 和 Overlord 进程。
你可以从已经部署的独立服务器上拷贝已经存在 `coordinator-overlord` 配置文件,并部署到 `conf/druid/cluster/master/coordinator-overlord`
#### Data 服务
假设我们将要从一个 32 CPU 和 256GB 内存的独立服务器上进行合并。
在老的部署中,下面的配置是针对 Historicals 和 MiddleManagers 进程的:
Historical独立服务器部署
```
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 个服务,这 2 个服务器的配置为 16CPU 和 128GB RAM 。
我们将会按照下面的配置方式进行配置:
Historical
- `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`: 保持不变
在完成上面配置后的结果如下:
集群 Historical (使用 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 服务
你可以将已经在独立服务器部署中存在的配置文件拷贝到 `conf/druid/cluster/query` 目录中完成部署。
如果新的服务器的硬件配置和独立服务器的配置是相对的话,新的部署不需要做修改。
### 刷新部署 deployment
如果你使用下面的服务器配置环境为示例的话:
- 1 Master server (m5.2xlarge)
- 2 Data servers (i3.4xlarge)
- 1 Query server (m5.2xlarge)
`conf/druid/cluster` 文件夹中的配置文件已经针对上面的硬件环境进行了优化,针对基本情况的使用来说,你不需要针对上面的配置进行修改。
如果你选择使用不同的硬件的话,页面 [basic cluster tuning guide](../operations/basic-cluster-tuning.md) 中的内容能够帮助你对你的硬件配置做一些选择。
## 打开端口(如果你使用了防火墙的话)
如果你的服务使用了防火墙,或者一些网络配置中限制了端口的访问的话。那么你需要在你的服务器上开放下面的端口,并运行数据进行访问:
### Master 服务器
- 1527 Derby 原数据存储;如果你使用的是其他的数据库,例如 MySQL 或 PostgreSQL 的话就不需要)
- 2181 ZooKeeper如果你使用的是分布式 ZooKeeper 集群部署的话就不需要)
- 8081 Coordinator 服务)
- 8090 Overlord 服务)
### Data 服务器
- 8083 Historical 服务)
- 8091, 8100–8199 Druid Middle Manager 服务,如果你使用了比较高的 `druid.worker.capacity` 配置的话,那么你需要的端口可能会高于 8199
### Query 服务器
- 8082 Broker 服务)
- 8088 Router 服务,如果使用的话)
> 在生产环境中,我们推荐你部署 ZooKeeper 和你的元数据存储到他们自己的硬件上(独立部署)。不要和 Master server 混合部署在一起。
## 启动 Master 服务器
拷贝 Druid 的分发包和你修改过的配置到 Master 服务器上。
如果你已经在你的本地计算机上修改了配置,你可以使用 *rsync* 来进行拷贝。
```bash
rsync -az apache-druid-apache-druid-0.21.1/ MASTER_SERVER:apache-druid-apache-druid-0.21.1/
```
### Master 没有 Zookeeper 的启动
从分发包的 root 节点中,运行下面的命令来启动 Master 服务器:
```
bin/start-cluster-master-no-zk-server
```
### Master 有 Zookeeper 的启动
如果你计划在 Master 服务器上还同时运行 ZK 的话,首先需要更新 `conf/zoo.cfg` 中的配置来确定你如何运行 ZK。
然后你可以选择在启动 ZK 的同时启动 Master 服务器。
使用下面的命令行来进行启动:
```
bin/start-cluster-master-with-zk-server
```
> 在生产环境中,我们推荐你部署 ZooKeeper 在独立的集群上面。
## 启动 Data 服务器
拷贝 Druid 的分发包和你修改过的配置到 Data 服务器上。
从分发包的 root 节点中,运行下面的命令来启动 Data 服务器:
```
bin/start-cluster-data-server
```
如果需要的话,你还可以为你的数据服务器添加更多的节点。
> 针对集群环境中更加复杂的应用环境和需求,你可以将 Historicals 和 MiddleManagers 服务分开部署,然后分别进行扩容。
> 上面的这种分开部署方式,能够给代理 Druid 已经构建并且实现的 MiddleManager 自动扩容功能。
## 启动 Query 服务器
拷贝 Druid 的分发包和你修改过的配置到 Query 服务器上。
从分发包的 root 节点中,运行下面的命令来启动 Query 服务器:
```
bin/start-cluster-query-server
```
针对你查询的负载情况,你可以为你的查询服务器增加更多的节点。
如果为你的查询服务器增加了更多的节点的话,请确定同时为你的 Historicals 服务增加更多的连接池。
请参考页面 [basic cluster tuning guide](../operations/basic-cluster-tuning.md) 中描述的内容。
## 载入数据
恭喜你,我们现在有了配置成功并且运行的 Druid 集群了!
下一步就是根据根据你的使用情况来用推荐的方法将数据载入到 Druid 集群中了。
请参考页面 [loading data](../ingestion/index.md) 中的内容。