blob: efb60ba205e83f554aceef88c9653631f9387115 [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# 集群版部署指导
本小节描述如何手动部署包括3ConfigNode3DataNode的实例,即通常所说的3C3D集群。
<div align="center">
<img src="/img/cluster01.png" alt="" style="width: 60%;"/>
</div>
## 1. 注意事项
1. 安装前请确认系统已参照[系统配置](../Deployment-and-Maintenance/Environment-Requirements.md)准备完成。
2. 推荐使用`hostname`进行IP配置,可避免后期修改主机ip导致数据库无法启动的问题。设置hostname需要在服务器上配`/etc/hosts`,如本机ip11.101.17.224hostnameiotdb-1,则可以使用以下命令设置服务器的 hostname,并使用hostname配置IoTDB`cn_internal_address``dn_internal_address`
```shell
echo "11.101.17.224 iotdb-1" >> /etc/hosts
```
3. 有些参数首次启动后不能修改,请参考下方的[参数配置](#参数配置)章节来进行设置。
4. 无论是在linux还是windows中,请确保IoTDB的安装路径中不含空格和中文,避免软件运行异常。
5. 请注意,安装部署(包括激活和使用软件)IoTDB时,您可以:
- 使用 root 用户(推荐):可以避免权限等问题。
- 使用固定的非 root 用户:
- 使用同一用户操作:确保在启动、激活、停止等操作均保持使用同一用户,不要切换用户。
- 避免使用 sudo:使用 sudo 命令会以 root 用户权限执行命令,可能会引起权限混淆或安全问题。
6. 在安装部署数据库前,可以使用健康检查工具检测 IoTDB 节点运行环境,并获取详细的检查结果。 IoTDB 健康检查工具使用方法可以参考:[健康检查工具](../Tools-System/Health-Check-Tool.md)。
## 2. 准备步骤
1. 准备IoTDB数据库安装包 apache-iotdb-{version}-all-bin.zip(安装包获取见:[链接](../Deployment-and-Maintenance/IoTDB-Package_apache.md))
2. 按环境要求配置好操作系统环境(系统环境配置见:[链接](../Deployment-and-Maintenance/Environment-Requirements.md))
### 2.1 前置检查
为确保您获取的 IoTDB 安装包完整且正确,在执行安装部署前建议您进行SHA512校验。
#### 准备工作:
- 获取官方发布的 SHA512 校验码:请到 IoTDB 开源官网[发行版本](https://iotdb.apache.org/zh/Download/)页面获取
#### 校验步骤(以 linux 为例):
1. 打开终端,进入安装包所在目录(如`/data/iotdb`):
```Bash
cd /data/iotdb
```
2. 执行以下命令计算哈希值:
```Bash
sha512sum apache-iotdb-{version}-all-bin.zip
```
3. 终端输出结果(左侧为SHA512 校验码,右侧为文件名):
![img](/img/sha512-07.png)
4. 对比输出结果与官方 SHA512 校验码,确认一致后,即可按照下方流程执行 IoTDB 的安装部署操作。
#### 注意事项:
- 若校验结果不一致,请重新获取安装包
- 校验过程中若出现"文件不存在"提示,需检查文件路径是否正确或安装包是否完整下载
## 3. 安装步骤
假设现在有3linux服务器,IP地址和服务角色分配如下:
| 节点ip | 主机名 | 服务 |
| ------------- | ------- | -------------------- |
| 11.101.17.224 | iotdb-1 | ConfigNodeDataNode |
| 11.101.17.225 | iotdb-2 | ConfigNodeDataNode |
| 11.101.17.226 | iotdb-3 | ConfigNodeDataNode |
### 3.1 设置主机名
3台机器上分别配置主机名,设置主机名需要在目标服务器上配置/etc/hosts,使用如下命令:
```shell
echo "11.101.17.224 iotdb-1" >> /etc/hosts
echo "11.101.17.225 iotdb-2" >> /etc/hosts
echo "11.101.17.226 iotdb-3" >> /etc/hosts
```
### 3.2 参数配置
解压安装包并进入安装目录
```shell
unzip apache-iotdb-{version}-all-bin.zip
cd apache-iotdb-{version}-all-bin
```
#### 3.2.1 环境脚本配置
- ./conf/confignode-env.sh配置
| **配置项** | **说明** | **默认值** | **推荐值** | 备注 |
| :---------- | :------------------------------------- | :--------- | :----------------------------------------------- | :----------- |
| MEMORY_SIZE | IoTDB ConfigNode节点可以使用的内存总量 | 根据系统内存自动计算,默认为系统内存的30% | 可按需填写,填写后系统会根据填写的数值来分配内存 | 修改后保存即可,无需执行;重启服务后生效 |
- ./conf/datanode-env.sh配置
| **配置项** | **说明** | **默认值** | **推荐值** | 备注 |
| :---------- | :----------------------------------- |:-----------------------| :----------------------------------------------- | :----------- |
| MEMORY_SIZE | IoTDB DataNode节点可以使用的内存总量 | 根据系统内存自动计算,默认为系统内存的50% | 可按需填写,填写后系统会根据填写的数值来分配内存 | 修改后保存即可,无需执行;重启服务后生效 |
#### 3.2.2 通用配置(./conf/iotdb-system.properties)
- 集群配置
| 配置项 | 说明 | 11.101.17.224 | 11.101.17.225 | 11.101.17.226 |
| ------------------------- | ---------------------------------------- | -------------- | -------------- | -------------- |
| cluster_name | 集群名称 | defaultCluster | defaultCluster | defaultCluster |
| schema_replication_factor | 元数据副本数,DataNode数量不应少于此数目 | 3 | 3 | 3 |
| data_replication_factor | 数据副本数,DataNode数量不应少于此数目 | 2 | 2 | 2 |
#### 3.2.3 ConfigNode 配置
| 配置项 | 说明 | 默认 | 推荐值 | 11.101.17.224 | 11.101.17.225 | 11.101.17.226 | 备注 |
| ------------------- | ------------------------------------------------------------ | --------------- | ------------------------------------------------------- | ------------- | ------------- | ------------- | ------------------ |
| cn_internal_address | ConfigNode在集群内部通讯使用的地址 | 127.0.0.1 | 所在服务器的IPV4地址或hostname,推荐使用hostname | iotdb-1 | iotdb-2 | iotdb-3 | 首次启动后不能修改 |
| cn_internal_port | ConfigNode在集群内部通讯使用的端口 | 10710 | 10710 | 10710 | 10710 | 10710 | 首次启动后不能修改 |
| cn_consensus_port | ConfigNode副本组共识协议通信使用的端口 | 10720 | 10720 | 10720 | 10720 | 10720 | 首次启动后不能修改 |
| cn_seed_config_node | 节点注册加入集群时连接的ConfigNode 的地址,cn_internal_address:cn_internal_port | 127.0.0.1:10710 | 第一个CongfigNodecn_internal_address:cn_internal_port | iotdb-1:10710 | iotdb-1:10710 | iotdb-1:10710 | 首次启动后不能修改 |
#### 3.2.4 DataNode 配置
| 配置项 | 说明 | 默认 | 推荐值 | 11.101.17.224 | 11.101.17.225 | 11.101.17.226 | 备注 |
| ------------------------------- | ------------------------------------------------------------ | --------------- | ------------------------------------------------------- | ------------- | ------------- | ------------- | ------------------ |
| dn_rpc_address | 客户端 RPC 服务的地址 | 127.0.0.1 | 默认本机可直接访问。非本机访问,请修改此配置项为所在服务器的IPV4地址或hostname,推荐使用所在服务器的IPV4地址。 | iotdb-1 |iotdb-2 | iotdb-3 | 重启服务生效 |
| dn_rpc_port | 客户端 RPC 服务的端口 | 6667 | 6667 | 6667 | 6667 | 6667 | 重启服务生效 |
| dn_internal_address | DataNode在集群内部通讯使用的地址 | 127.0.0.1 | 所在服务器的IPV4地址或hostname,推荐使用hostname | iotdb-1 | iotdb-2 | iotdb-3 | 首次启动后不能修改 |
| dn_internal_port | DataNode在集群内部通信使用的端口 | 10730 | 10730 | 10730 | 10730 | 10730 | 首次启动后不能修改 |
| dn_mpp_data_exchange_port | DataNode用于接收数据流使用的端口 | 10740 | 10740 | 10740 | 10740 | 10740 | 首次启动后不能修改 |
| dn_data_region_consensus_port | DataNode用于数据副本共识协议通信使用的端口 | 10750 | 10750 | 10750 | 10750 | 10750 | 首次启动后不能修改 |
| dn_schema_region_consensus_port | DataNode用于元数据副本共识协议通信使用的端口 | 10760 | 10760 | 10760 | 10760 | 10760 | 首次启动后不能修改 |
| dn_seed_config_node | 节点注册加入集群时连接的ConfigNode地址,即cn_internal_address:cn_internal_port | 127.0.0.1:10710 | 第一个CongfigNodecn_internal_address:cn_internal_port | iotdb-1:10710 | iotdb-1:10710 | iotdb-1:10710 | 首次启动后不能修改 |
> ❗️注意:VSCode Remote等编辑器无自动保存配置功能,请确保修改的文件被持久化保存,否则配置项无法生效
### 3.3 启动ConfigNode节点
先启动第一个iotdb-1confignode, 保证种子confignode节点先启动,然后依次启动第2和第3confignode节点
```shell
# Unix/OS X
cd sbin
./start-confignode.sh -d #“-d”参数将在后台进行启动
# Windows
# V2.0.4.x 版本之前
.\start-confignode.bat
# V2.0.4.x 版本及之后
.\windows\start-confignode.bat
```
如果启动失败,请参考下[常见问题](#常见问题)
### 3.4 启动DataNode 节点
分别进入iotdbsbin目录下,依次启动3datanode节点:
```shell
# Unix/OS X
cd sbin
./start-datanode.sh -d #-d参数将在后台进行启动
# Windows
# V2.0.4.x 版本之前
.\start-datanode.bat
# V2.0.4.x 版本及之后
.\windows\start-datanode.bat
```
### 3.5 启动 CLI
表模型 CLI 进入命令:
```SQL
# Linux或MACOS系统
./start-cli.sh -sql_dialect table
# Windows
# V2.0.4.x 版本之前
.\start-cli.bat -sql_dialect table
# V2.0.4.x 版本及之后
.\windows\start-cli-table.bat
```
### 3.6 一键启停集群
#### 3.6.1 概述
IoTDB 的根目录中,`sbin` 子目录包含的 `start-all.sh` `stop-all.sh` 脚本,与 `conf` 子目录中的 `iotdb-cluster.properties` 配置文件协同工作,可通过单一节点实现一键启动或停止集群所有节点的功能。通过这种方式,可以高效地管理 IoTDB 集群的生命周期,简化了部署和运维流程。
下文将介绍`iotdb-cluster.properties` 文件中的具体配置项。
#### 3.6.2 配置项
> 注意:
>
> * 当集群变更时,需要手动更新此配置文件。
> * 如果在未配置 `iotdb-cluster.properties` 配置文件的情况下执行 `start-all.sh` 或者 `stop-all.sh` 脚本,则默认会启停当前脚本所在 IOTDB\_HOME 目录下的 ConfigNode DataNode 节点。
> * 推荐配置 ssh 免密登录:如果未配置,启动脚本后会提示输入服务器密码以便于后续启动/停止/销毁操作。如果已配置,则无需在执行脚本过程中输入服务器密码。
* confignode\_address\_list
| 名字 | confignode\_address\_list |
| :--------------: | :------------------------------------------------------------------------------ |
| 描述 | 待启动/停止的 ConfigNode 节点所在主机的 IP 或主机名列表,如果有多个需要用“,”分隔。 |
| 类型 | String |
| 默认值 | |
| 改后生效方式 | 重启服务生效 |
* datanode\_address\_list
| 名字 | datanode\_address\_list |
| :----------------: | :---------------------------------------------------------------------------- |
| 描述 | 待启动/停止的 DataNode 节点所在主机的 IP 或主机名列表,如果有多个需要用“,”分隔。 |
| 类型 | String |
| 默认值 | |
| 改后生效方式 | 重启服务生效 |
* ssh\_account
| 名字 | ssh\_account |
| :----------------: | :------------------------------------------------------------- |
| 描述 | 通过 SSH 登陆目标主机的用户名,需要所有的主机的用户名都相同 |
| 类型 | String |
| 默认值 | root |
| 改后生效方式 | 重启服务生效 |
* ssh\_port
| 名字 | ssh\_port |
| :----------------: | :--------------------------------------------------------- |
| 描述 | 目标主机对外暴露的 SSH 端口,需要所有的主机的端口都相同 |
| 类型 | int |
| 默认值 | 22 |
| 改后生效方式 | 重启服务生效 |
* confignode\_deploy\_path
| 名字 | confignode\_deploy\_path |
| :----------------: | :---------------------------------------------------------------------------------------------------------------- |
| 描述 | 待启动/停止的所有 ConfigNode 所在目标主机的路径,需要所有待启动/停止的 ConfigNode 节点在目标主机的相同目录下。例如:`/data/demo/apache-iotdb-1.3.1-all-bin` |
| 类型 | String |
| 默认值 | |
| 改后生效方式 | 重启服务生效 |
* datanode\_deploy\_path
| 名字 | datanode\_deploy\_path |
| :----------------: | :------------------------------------------------------------------------------------------------------------ |
| 描述 | 待启动/停止的所有 DataNode 所在目标主机的路径,需要所有待启动/停止的 DataNode 节点在目标主机的相同目录下。例如:`/data/demo/apache-iotdb-1.3.1-all-bin` |
| 类型 | String |
| 默认值 | |
| 改后生效方式 | 重启服务生效 |
#### 3.6.3 简单示例
1. 配置文件 `iotdb-cluster.properties`
```properties
# Configure ConfigNodes machine addresses separated by ,
confignode_address_list=172.xx.xx.16,172.xx.xx.17,172.xx.xx.18
# Configure DataNodes machine addresses separated by ,
datanode_address_list=172.xx.xx.16,172.xx.xx.17,172.xx.xx.18
# User name for logging in to the deployment machine using ssh
ssh_account=root
# ssh login port
ssh_port=22
# iotdb deployment directory (iotdb will be deployed to the target node in this folder)
confignode_deploy_path=/data/demo/apache-iotdb-1.3.1-all-bin
datanode_deploy_path=/data/demo/apache-iotdb-1.3.1-all-bin
```
2. 执行 ./start-all.sh 命令验证启动结果,在 cli 中执行 show cluster,可看到类似如下结果
```SQL
IoTDB> show cluster
+------+----------+-------+---------------+------------+--------------+-----------+
|NodeID| NodeType| Status|InternalAddress|InternalPort| Version| BuildInfo|
+------+----------+-------+---------------+------------+--------------+-----------+
| 0|ConfigNode|Running| 172.xx.xx.16| 10710| 1.3.1| 0xxxxxx|
| 1|ConfigNode|Running| 172.xx.xx.18| 10710| 1.3.1| 0xxxxxx|
| 2|ConfigNode|Running| 172.xx.xx.17| 10710| 1.3.1| 0xxxxxx|
| 3| DataNode|Running| 172.xx.xx.18| 10730| 1.3.1| 0xxxxxx|
| 4| DataNode|Running| 172.xx.xx.17| 10730| 1.3.1| 0xxxxxx|
| 5| DataNode|Running| 172.xx.xx.16| 10730| 1.3.1| 0xxxxxx|
+------+----------+-------+---------------+------------+--------------+-----------+
```
## 4. 节点维护步骤
### 4.1 ConfigNode节点维护
ConfigNode节点维护分为ConfigNode添加和移除两种操作,有两个常见使用场景:
- 集群扩展:如集群中只有1ConfigNode时,希望增加ConfigNode以提升ConfigNode节点高可用性,则可以添加2ConfigNode,使得集群中有3ConfigNode
- 集群故障恢复:1ConfigNode所在机器发生故障,使得该ConfigNode无法正常运行,此时可以移除该ConfigNode,然后添加一个新的ConfigNode进入集群。
> ❗️注意,在完成ConfigNode节点维护后,需要保证集群中有1或者3个正常运行的ConfigNode2ConfigNode不具备高可用性,超过3ConfigNode会导致性能损失。
#### 4.1.1 添加ConfigNode节点
脚本命令:
```shell
# Linux / MacOS
# 首先切换到IoTDB根目录
sbin/start-confignode.sh
# Windows
# 首先切换到IoTDB根目录
# V2.0.4.x 版本之前
sbin\start-confignode.bat
# V2.0.4.x 版本及之后
sbin\windows\start-confignode.bat
```
#### 4.1.2 移除ConfigNode节点
首先通过CLI连接集群,通过`show confignodes`确认想要移除ConfigNodeNodeID
```shell
IoTDB> show confignodes
+------+-------+---------------+------------+--------+
|NodeID| Status|InternalAddress|InternalPort| Role|
+------+-------+---------------+------------+--------+
| 0|Running| 127.0.0.1| 10710| Leader|
| 1|Running| 127.0.0.1| 10711|Follower|
| 2|Running| 127.0.0.1| 10712|Follower|
+------+-------+---------------+------------+--------+
Total line number = 3
It costs 0.030s
```
然后使用SQLConfigNode移除,SQL命令:
```Bash
remove confignode [confignode_id]
```
### 4.2 DataNode节点维护
DataNode节点维护有两个常见场景:
- 集群扩容:出于集群能力扩容等目的,添加新的DataNode进入集群
- 集群故障恢复:一个DataNode所在机器出现故障,使得该DataNode无法正常运行,此时可以移除该DataNode,并添加新的DataNode进入集群
> ❗️注意,为了使集群能正常工作,在DataNode节点维护过程中以及维护完成后,正常运行的DataNode总数不得少于数据副本数(通常为2),也不得少于元数据副本数(通常为3)。
#### 4.2.1 添加DataNode节点
脚本命令:
```Bash
# Linux / MacOS
# 首先切换到IoTDB根目录
sbin/start-datanode.sh
#Windows
# 首先切换到IoTDB根目录
# V2.0.4.x 版本之前
sbin\start-datanode.bat
# V2.0.4.x 版本及之后
sbin\windows\start-datanode.bat
```
说明:在添加DataNode后,随着新的写入到来(以及旧数据过期,如果设置了TTL),集群负载会逐渐向新的DataNode均衡,最终在所有节点上达到存算资源的均衡。
#### 4.2.2 移除DataNode节点
首先通过CLI连接集群,通过`show datanodes`确认想要移除的DataNodeNodeID
```Bash
IoTDB> show datanodes
+------+-------+----------+-------+-------------+---------------+
|NodeID| Status|RpcAddress|RpcPort|DataRegionNum|SchemaRegionNum|
+------+-------+----------+-------+-------------+---------------+
| 1|Running| 0.0.0.0| 6667| 0| 0|
| 2|Running| 0.0.0.0| 6668| 1| 1|
| 3|Running| 0.0.0.0| 6669| 1| 0|
+------+-------+----------+-------+-------------+---------------+
Total line number = 3
It costs 0.110s
```
然后使用SQLDataNode移除,SQL命令:
```Bash
remove datanode [datanode_id]
```
### 4.3 集群维护
更多关于集群维护的介绍可参考:[集群维护](../User-Manual/Load-Balance_apache.md)
## 5. 常见问题
1. Confignode节点启动失败
- 步骤 1: 请查看启动日志,检查是否修改了某些首次启动后不可改的参数。
- 步骤 2: 请查看启动日志,检查是否出现其他异常。
- 步骤 3: 如果是首次部署或者数据可删除,也可按下述步骤清理环境,重新部署后,再次启动。
- 清理环境:
1. 结束所有 ConfigNode DataNode 进程。
```Bash
# 1. 停止 ConfigNode 和 DataNode 服务
# Unix/OS X
sbin/stop-standalone.sh
# Windows
# V2.0.4.x 版本之前
sbin\stop-standalone.bat
# V2.0.4.x 版本及之后
sbin\windows\stop-standalone.bat
# 2. 检查是否还有进程残留
jps
# 或者
ps -ef|grep iotdb
# 3. 如果有进程残留,则手动kill
kill -9 <pid>
# 如果确定机器上仅有1个iotdb,可以使用下面命令清理残留进程
ps -ef|grep iotdb|grep -v grep|tr -s ' ' ' ' |cut -d ' ' -f2|xargs kill -9
```
2. 删除 data logs 目录。
- 说明:删除 data 目录是必要的,删除 logs 目录是为了纯净日志,非必需。
```shell
cd /data/iotdb rm -rf data logs
```
## 6. 附录
### 6.1 Confignode节点参数介绍
| 参数 | 描述 | 是否为必填项 |
| :--- | :------------------------------- | :----------- |
| -d | 以守护进程模式启动,即在后台运行 | |
### 6.2 Datanode节点参数介绍
| 缩写 | 描述 | 是否为必填项 |
| :--- | :--------------------------------------------- | :----------- |
| -v | 显示版本信息 | |
| -f | 在前台运行脚本,不将其放到后台 | |
| -d | 以守护进程模式启动,即在后台运行 | |
| -p | 指定一个文件来存放进程ID,用于进程管理 | |
| -c | 指定配置文件夹的路径,脚本会从这里加载配置文件 | |
| -g | 打印垃圾回收(GC)的详细信息 | |
| -H | 指定Java堆转储文件的路径,当JVM内存溢出时使用 | |
| -E | 指定JVM错误日志文件的路径 | |
| -D | 定义系统属性,格式为 key=value | |
| -X | 直接传递 -XX 参数给 JVM | |
| -h | 帮助指令 | |