Apache IoTDB(4):深度解析时序数据库 IoTDB 在Kubernetes 集群中的部署与实践指南

目录

    • 前言
    • [一、Apache IoTDB产品解析](#一、Apache IoTDB产品解析)
      • [1.1 核心特性](#1.1 核心特性)
      • [1.2 架构设计](#1.2 架构设计)
    • 二、版本要求
    • [三、Kubernetes 环境准备](#三、Kubernetes 环境准备)
      • [3.1 创建命名空间](#3.1 创建命名空间)
      • [3.2 创建 PV 配置文件](#3.2 创建 PV 配置文件)
      • [3.3 安装 Helm](#3.3 安装 Helm)
    • [四、IoTDB的Helm Chart 的配置](#四、IoTDB的Helm Chart 的配置)
      • [4.1 克隆 IoTDB Kubernetes 部署代码](#4.1 克隆 IoTDB Kubernetes 部署代码)
      • [4.2 修改 YAML 文件](#4.2 修改 YAML 文件)
      • [4.3. 配置私库信息](#4.3. 配置私库信息)
    • [五、安装 IoTDB](#五、安装 IoTDB)
      • [5.1 安装步骤](#5.1 安装步骤)
      • [5.2 查看 Helm 安装列表](#5.2 查看 Helm 安装列表)
      • [5.3 查看 Pods](#5.3 查看 Pods)
      • [5.4 排查问题方式](#5.4 排查问题方式)
      • [5.5 三种方案激活 IoTDB](#5.5 三种方案激活 IoTDB)
      • [5.6 验证 IoTDB](#5.6 验证 IoTDB)
    • 六、结语

前言

Apache IoTDB 凭借其高吞吐量、低存储成本和灵活查询能力,在工业物联网、智能家居等领域得到广泛应用。本文将结合版本(IoTDB v1.3.3.2与Kubernetes 1.24),详细讲明白如何在Kubernetes集群中实现IoTDB的高可用部署,并分享实际的优化经验

虚拟机测试节点【单机版安装】和【集群版安装】和【Docker部署】学习之前文章

一、Apache IoTDB产品解析

1.1 核心特性

  • 极致时序数据处理:支持每秒百万级数据点写入,通过列式存储和时间分区技术实现5-10倍压缩率。
  • 灵活查询能力:提供类SQL语法,支持时间窗口分析、降采样及多设备数据对齐。
  • 边缘-云端协同:轻量级设计支持边缘设备部署,同时可通过分布式集群实现水平扩展。
  • 生态集成:内置MQTT服务器、支持Kafka/Spark集成,提供Java/Python客户端。

1.2 架构设计

架构图

  • 存储组(Storage Group):逻辑隔离单元,类似传统数据库的"库"概念。
  • 设备层(Device):对应传统数据库的"表",存储具体传感器数据。
  • 时间序列(Timeseries):最小数据单元,支持FLOAT、TEXT、VECTOR等数据类型。

二、版本要求

需要在本地有一个可用的 Kubernetes 集群,作为部署 IoTDB 集群的基础

组件 版本要求
Kubernetes 1.24 以上
IoTDB(点击下载) v1.3.3.2 以上
存储类 local-storage
节点配置 4核8G起

三、Kubernetes 环境准备

3.1 创建命名空间

需注意:博主踩过的坑(在执行命名空间创建操作之前,需验证所指定的命名空间名称在 Kubernetes 集群中尚未被使用。如果命名空间已存在,创建命令将无法执行,可能导致部署过程中的错误)

创建命名空间命令:

bash 复制代码
kubectl create ns iotdb-ns

查看命名空间命令

bash 复制代码
kubectl get ns

3.2 创建 PV 配置文件

PV用于持久化存储IoTDB的ConfigNode 和 DataNode的数据,集群中有几个节点就要创建几个PV

需注意:1个ConfigNode和1个DataNode 也算2个节点,要2个PV

博主这边以 3ConfigNode、3DataNode 为例:

  1. 创建 pv.yaml 文件,并复制六份,分别重命名为 pv01.yaml 到 pv06.yaml

新建文件夹放yaml文件

创建 pv.yaml 文件命令

bash 复制代码
touch pv.yaml
  1. 修改每个文件中的 name 和 path 以确保一致性

举例 pv.yaml:

yaml 复制代码
# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: iotdb-pv-01
spec:
  capacity:
    storage: 10Gi # 存储容量
  accessModes: # 访问模式
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain # 回收策略
  # 存储类名称,如果使用本地静态存储storageClassName 不用配置,如果使用动态存储必需设置此项
  storageClassName: local-storage 
  # 根据你的存储类型添加相应的配置
  hostPath: # 如果是使用本地路径
    path: /data/k8s-data/iotdb-pv-01
    type: DirectoryOrCreate  # 这行不配置就要手动创建文件夹
  1. 应用 PV 配置(pv-01.yaml 到 pv-06.yaml 都要应用)

配置命令:

bash 复制代码
kubectl apply -f pv-01.yaml
kubectl apply -f pv-02.yaml
# 这里一直到pv-06.yaml
  1. 配置完成后进行查看

查看命令:

bash 复制代码
kubectl get pv
  1. 手动创建文件夹
    如果yaml里的hostPath-type未配置,需要手动去创建对应的文件夹

需注意:要在所有 Kubernetes 节点上创建对应的文件夹

创建命令:

bash 复制代码
mkdir -p /data/k8s-data/iotdb-pv-01
mkdir -p /data/k8s-data/iotdb-pv-02
# 这里一直到pv-06.yaml

3.3 安装 Helm

需要参考Helm官网,此处不做过多叙述了

Helm 官方安装链接(点击进入)

四、IoTDB的Helm Chart 的配置

4.1 克隆 IoTDB Kubernetes 部署代码

需要联系工作人员获取IoTDB的Helm Chart

如果谁遇到代理问题,可以取消代理设置来解决:

git clone报错如下,说明是配置了代理,需要把代理关掉 fatal: unable to access 'https://gitlab.timecho.com/r-d/db/iotdb-cluster-k8s.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.

取消代理命令:

bash 复制代码
unset HTTPS_PROXY

4.2 修改 YAML 文件

跟随博主一步步操作,一文就可以完成配置,下面来看文件的配置

values.yaml 文件示例:

yaml 复制代码
nameOverride: "iotdb"  
fullnameOverride: "iotdb"   #软件安装后的名称

image:
  repository: nexus.infra.timecho.com:8143/timecho/iotdb-enterprise
  pullPolicy: IfNotPresent
  tag: 1.3.3.2-standalone    #软件所用的仓库和版本

storage:
# 存储类名称,如果使用本地静态存储storageClassName 不用配置,如果使用动态存储必需设置此项
  className: local-storage

datanode:
  name: datanode
  nodeCount: 3        #datanode的节点数量
  enableRestService: true
  storageCapacity: 10Gi       #datanode的可用空间大小
  resources:
    requests:
      memory: 2Gi    #datanode的内存初始化大小
      cpu: 1000m     #datanode的CPU初始化大小
    limits:
      memory: 4Gi    #datanode的最大内存大小
      cpu: 1000m     #datanode的最大CPU大小

confignode:
  name: confignode
  nodeCount: 3      #confignode的节点数量
  storageCapacity: 10Gi      #confignode的可用空间大小
  resources:
    requests:
      memory: 512Mi    #confignode的内存初始化大小
      cpu: 1000m      #confignode的CPU初始化大小
    limits:
      memory: 1024Mi   #confignode的最大内存大小
      cpu: 2000m     #confignode的最大CPU大小
  configNodeConsensusProtocolClass: org.apache.iotdb.consensus.ratis.RatisConsensus
  schemaReplicationFactor: 3
  schemaRegionConsensusProtocolClass: org.apache.iotdb.consensus.ratis.RatisConsensus
  dataReplicationFactor: 2
  dataRegionConsensusProtocolClass: org.apache.iotdb.consensus.iot.IoTConsensus

4.3. 配置私库信息

  1. 创建secret 使k8s可访问iotdb-helm的私有仓库

"xxxxxx"是IoTDB私有仓库的账号、密码、邮箱。

bash 复制代码
kubectl create secret docker-registry timecho-nexus \
  --docker-server='nexus.infra.timecho.com:8143' \
  --docker-username='xxxxxx' \
  --docker-password='xxxxxx' \
  --docker-email='xxxxxx' \
  -n iotdb-ns

查看secret

bash 复制代码
kubectl get secret timecho-nexus -n iotdb-ns

查看并输出为yaml

bash 复制代码
kubectl get secret timecho-nexus --output=yaml -n iotdb-ns

查看并解密

bash 复制代码
kubectl get secret timecho-nexus --output="jsonpath={.data.\.dockerconfigjson}" -n iotdb-ns | base64 --decode
  1. 加载到命名空间iotdb-ns

添加一个patch,使该命名空间增加登陆nexus的登陆信息

bash 复制代码
kubectl patch serviceaccount default -n iotdb-ns -p '{"imagePullSecrets": [{"name": "timecho-nexus"}]}'

查看命名空间的该条信息

bash 复制代码
kubectl get serviceaccounts -n iotdb-ns -o yaml

五、安装 IoTDB

5.1 安装步骤

进入文件夹

bash 复制代码
cd iotdb-cluster-k8s/helm

安装iotdb

bash 复制代码
helm install iotdb ./ -n iotdb-ns

5.2 查看 Helm 安装列表

bash 复制代码
helm list -n iotdb-ns

5.3 查看 Pods

查看 iotdb的pods

bash 复制代码
kubectl get pods -n iotdb-ns -o wide
  1. 执行命令后,输出了带有confignode和datanode标识的各3个Pods,,总共6个Pods,即表明安装成功;
  2. 需要注意的是,并非所有Pods都处于Running状态,未激活的datanode可能会持续重启,但在激活后将恢复正常

5.4 排查问题方式

  1. 查看k8s的创建log
bash 复制代码
kubectl get events -n iotdb-ns 
watch kubectl get events -n iotdb-ns
  1. 获取详细信息
bash 复制代码
kubectl describe pod confignode-0 -n iotdb-ns
kubectl describe pod datanode-0 -n iotdb-ns
  1. 查看confignode日志
bash 复制代码
kubectl logs -n iotdb-ns confignode-0 -f

5.5 三种方案激活 IoTDB

方案1:直接在 Pod 中激活(最简单)

拿到机器码后进行激活

bash 复制代码
kubectl exec -it -n iotdb-ns confignode-0 -- /iotdb/sbin/start-activate.sh
kubectl exec -it -n iotdb-ns confignode-1 -- /iotdb/sbin/start-activate.sh
kubectl exec -it -n iotdb-ns confignode-2 -- /iotdb/sbin/start-activate.sh

方案2:进入confignode的容器中激活

拿到机器码后进行激活

bash 复制代码
kubectl exec -it -n iotdb-ns confignode-0 -- /bin/bash
cd /iotdb/sbin
/bin/bash start-activate.sh

方案3:手动激活(博主采用的这个方案)

  1. 查看 ConfigNode 详细信息,确定所在节点:
bash 复制代码
kubectl describe pod confignode-0 -n iotdb-ns | grep -e "Node:" -e "Path:"

结果示例:

复制代码
Node:          a87/172.20.31.87
Path:          /data/k8s-data/env/confignode/.env
  1. 查看 PVC 并找到 ConfigNode 对应的 Volume,确定所在路径:
bash 复制代码
kubectl get pvc -n iotdb-ns | grep "confignode-0"

也可以查看多个confignode

bash 复制代码
for i in {0..2}; do echo confignode-$i;kubectl describe pod confignode-${i} -n iotdb-ns | grep -e "Node:" -e "Path:"; echo "----"; done
  1. 查看对应 Volume 的详细信息,确定物理目录的位置:
bash 复制代码
kubectl describe pv iotdb-pv-04 | grep "Path:"

结果示例:

复制代码
Path:          /data/k8s-data/iotdb-pv-04
  1. 从对应节点的对应目录下找到 system-info 文件,使用该 system-info 作为机器码生成激活码,并在同级目录新建文件 license,将激活码写入到文件里面

5.6 验证 IoTDB

  1. 查看命名空间内的 Pods 状态

查看iotdb-ns命名空间内的IP、状态等信息,确定全部运行正常

bash 复制代码
kubectl get pods -n iotdb-ns -o wide

结果示例:

复制代码
# NAME           READY   STATUS    RESTARTS         AGE   IP             NODE   NOMINATED NODE   READINESS GATES
# confignode-0   1/1     Running   0                75m   10.20.187.14   a87    <none>           <none>
# confignode-1   1/1     Running   0                75m   10.20.191.75   a88    <none>           <none>
# confignode-2   1/1     Running   0                75m   10.20.187.16   a87    <none>           <none>
# datanode-0     1/1     Running   10 (5m54s ago)   75m   10.20.191.74   a88    <none>           <none>
# datanode-1     1/1     Running   10 (5m42s ago)   75m   10.20.187.15   a87    <none>           <none>
# datanode-2     1/1     Running   10 (5m55s ago)   75m   10.20.191.76   a88    <none>           <none>
  1. 查看命名空间内的端口映射情况
bash 复制代码
kubectl get svc -n iotdb-ns
  1. 在任意服务器启动 CLI 脚本验证 IoTDB 集群状态
    端口就是jdbc-balancer的端口,服务器为k8s任意节点的IP都可以
bash 复制代码
start-cli.sh -h 172.20.31.86 -p 31895
start-cli.sh -h 172.20.31.87 -p 31895
start-cli.sh -h 172.20.31.88 -p 31895

结果示例:

通过以上任意一种验证,出现博主这种结果样例的就已经部署完成了~

六、结语

本文详细介绍了Kubernetes与IoTDB数据库的集成部署,跟着博主一步步做,有问题可以联系博主帮忙,可以远程帮小伙伴解决问题的!通过Kubernetes的容器编排能力,IoTDB可以快速部署,并实现高可用性

官方获取 :👉Apache IoTDB 下载地址👈(点击下载

相关推荐
少男的脸红藏不住心事12 小时前
GD32入门到实战35--485实现OTA
数据库·mongodb·nosql
清寒敲代码12 小时前
k8s核心技术-Helm
运维·容器·kubernetes
魏 无羡12 小时前
k8s 获取真实ip地址
tcp/ip·容器·kubernetes
爬山算法12 小时前
Redis(50) Redis哨兵如何与客户端进行交互?
数据库·redis·交互
007php00712 小时前
某大厂MySQL面试之SQL注入触点发现与SQLMap测试
数据库·python·sql·mysql·面试·职场和发展·golang
西猫雷婶13 小时前
scikit-learn/sklearn学习|广义线性回归损失函数的基本表达式
深度学习·神经网络·学习·机器学习·线性回归·scikit-learn·概率论
YS_Geo13 小时前
Redis 深度解析:数据结构、持久化与集群
数据结构·数据库·redis
IMER SIMPLE13 小时前
人工智能-python-深度学习-神经网络-MobileNet V1&V2
人工智能·python·深度学习
IvanCodes13 小时前
六、Docker 核心技术:Dockerfile 指令详解
java·数据库·docker
盼小辉丶13 小时前
TensorFlow深度学习实战(37)——深度学习的数学原理
人工智能·深度学习·tensorflow