当前位置: 首页 > web >正文

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

目录

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

前言

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

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

  • 单机版安装:Apache IoTDB(1):时序数据库介绍与单机版安装部署指南
  • 集群版安装:Apache IoTDB(2):时序数据库 IoTDB 集群安装部署的技术优势与适用场景分析
  • Docker集群部署:Apache IoTDB(3):时序数据库 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 集群的基础

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

三、Kubernetes 环境准备

3.1 创建命名空间

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

创建命名空间命令:

kubectl create ns iotdb-ns

查看命名空间命令

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 文件命令

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

举例 pv.yaml:

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

配置命令:

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

查看命令:

kubectl get pv

在这里插入图片描述

  1. 手动创建文件夹
    如果yaml里的hostPath-type未配置,需要手动去创建对应的文件夹

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

创建命令:

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.

取消代理命令:

unset HTTPS_PROXY

4.2 修改 YAML 文件

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

values.yaml 文件示例:

nameOverride: "iotdb"  
fullnameOverride: "iotdb"   #软件安装后的名称image:repository: nexus.infra.timecho.com:8143/timecho/iotdb-enterprisepullPolicy: IfNotPresenttag: 1.3.3.2-standalone    #软件所用的仓库和版本storage:
# 存储类名称,如果使用本地静态存储storageClassName 不用配置,如果使用动态存储必需设置此项className: local-storagedatanode:name: datanodenodeCount: 3        #datanode的节点数量enableRestService: truestorageCapacity: 10Gi       #datanode的可用空间大小resources:requests:memory: 2Gi    #datanode的内存初始化大小cpu: 1000m     #datanode的CPU初始化大小limits:memory: 4Gi    #datanode的最大内存大小cpu: 1000m     #datanode的最大CPU大小confignode:name: confignodenodeCount: 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.RatisConsensusschemaReplicationFactor: 3schemaRegionConsensusProtocolClass: org.apache.iotdb.consensus.ratis.RatisConsensusdataReplicationFactor: 2dataRegionConsensusProtocolClass: org.apache.iotdb.consensus.iot.IoTConsensus

4.3. 配置私库信息

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

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

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

kubectl get secret timecho-nexus -n iotdb-ns

查看并输出为yaml

kubectl get secret timecho-nexus --output=yaml -n iotdb-ns

查看并解密

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

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

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

查看命名空间的该条信息

kubectl get serviceaccounts -n iotdb-ns -o yaml

五、安装 IoTDB

5.1 安装步骤

进入文件夹

cd iotdb-cluster-k8s/helm

安装iotdb

helm install iotdb ./ -n iotdb-ns

5.2 查看 Helm 安装列表

helm list -n iotdb-ns

5.3 查看 Pods

查看 iotdb的pods

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

5.4 排查问题方式

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

5.5 三种方案激活 IoTDB

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

拿到机器码后进行激活

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的容器中激活

拿到机器码后进行激活

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

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

  1. 查看 ConfigNode 详细信息,确定所在节点:
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,确定所在路径:
kubectl get pvc -n iotdb-ns | grep "confignode-0"

也可以查看多个confignode

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 的详细信息,确定物理目录的位置:
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、状态等信息,确定全部运行正常

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. 查看命名空间内的端口映射情况
kubectl get svc -n iotdb-ns
  1. 在任意服务器启动 CLI 脚本验证 IoTDB 集群状态
    端口就是jdbc-balancer的端口,服务器为k8s任意节点的IP都可以
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 下载地址👈(点击下载

http://www.xdnf.cn/news/18307.html

相关文章:

  • 连接远程服务器上的 jupyter notebook,解放本地电脑
  • VSCode 从安装到精通:下载安装与快捷键全指南
  • 11.第11章 开发环境优化
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day7
  • Nacos-6--Naco的QUIC协议实现高可用的工作原理
  • 2025年- H98-Lc206--51.N皇后(回溯)--Java版
  • ARM架构下的cache transient allocation hint以及SMMUv2的TRANSIENTCFG配置详解
  • EasyExcel篇
  • OVS:ovn为什么默认选择Geneve作为二层隧道网络协议?
  • 【CV 目标检测】Fast RCNN模型③——模型训练/预测
  • c++最长上升子序列长度
  • 8.18网络编程——基于UDP的TFTP文件传输客户端
  • 力扣32:最长有效括号
  • 如何解决机器翻译的“幻觉“问题(Hallucination)?
  • 博客项目 Spring + Redis + Mysql
  • 深度研究系统、方法与应用的综述
  • android 实现表格效果
  • 接口文档——前后端分离开发模式下的“契约书“
  • Java原子类详解
  • MySQL的多版本并发控制(MVCC):
  • illustrator插件大全 免费插件介绍 Ai设计插件集合 (4)
  • LeetCode 每日一题 2025/8/11-2025/8/17
  • Windows 安装使用 MySQL
  • C++架构设计原则
  • 监督学习(Supervised Learning)和 无监督学习(Unsupervised Learning)详解
  • MySQL新手教学
  • 之前说的要写的TCP高性能服务器,今天来了
  • Elasticsearch全文检索中文分词:IK分词器详解与Docker环境集成
  • 用 Python 实现一个“小型 ReAct 智能体”:思维链 + 工具调用 + 环境交互
  • 如何使用 React 101 的 Highcharts 包装器