Skip to content

myysophia/iotdbtool

Repository files navigation

iotdbtool

项目简介

iotdbtool 是一个使用 Go 语言编写的命令行工具,基于 Kubernetes 环境,提供了 IoTDB 数据的备份功能。它可以从 Kubernetes 集群中的 IoTDB Pod 中提取数据,并将其上传到阿里云 OSS 存储桶中。

iotdbtool 支持 iotDB 单机、集群,备份与恢复,备份文件存储在 oss 上,主要实现了 k8s 部署的有状态服务的备份恢复

croba

cobra,它是一个非常流行的 Go 库,主要用于创建命令行程序(CLI)。它提供了强大的命令行解析功能,帮助开发者快速构建功能丰富、结构化的命令行工具。

常见使用场景:

  • 开发复杂的命令行工具和应用程序。
  • 结合 viper 用于解析配置文件。
  • kubectl 等工具就是基于 cobra 开发的。

痛点

  • 备份步骤相当繁琐,比较耗时,备份业务全部环境大约1-2H
  1. 准备kubeconfig文件连接k8s集群
  2. 使用kubectl命令行进入iotdb pod ,使用iotdb客户端连接iotdb
  3. 在iotdb数据库中执行flush 保证memory table中的数据落盘
  4. 压缩iotdb 的数据目录
  5. 下载ossutil、配置AK/SK。
  6. 等待步骤4执行完后执行ossutil cp命令将备份上传到oss上
  7. 循环步骤2-6备份iotdb其他数据节点
  8. 重复步骤1-6备份备份其他iotdb集群
  9. 备份完成
  • 严重依赖kubectl、iotdb-cli、ossutil等其他命令

功能特性

  • 支持 iotdb 单机、集群的备份和恢复
  • goroutine 原生支持并发备份
  • 借助ali-oss-sdk 实现分片上传、进度条等功能
  • 不依赖 kubectl 命令,使用 client-go 直接调用 api 操作 pod,安全高效
  • 支持任意 Pod 任意容器中的指定目录
  • 支持 prehook,备份前flush on cluster强刷盘
  • 将备份文件上传到阿里云 OSS,默认保存 3 天
  • 支持多种日志输出级别,便于调试和监控。

系统要求

go mod依赖

aliyun-oss-go-sdk v3.0.2+incompatible

github.com/spf13/cobra v1.7.0

k8s.io/api v0.27.3

k8s.io/client-go v0.27.3

阿里云oss 上传文件权限 <可选>

k8s集群访问权限

安装

从源码构建

首先,确保你已经安装了 Go 1.21 开发环境。然后,克隆项目并编译二进制文件:

.
|-- Makefile
|-- bin
|   `-- iotdbtools
|-- cmd
|   |-- backup.go
|   |-- oss_config.go
|   |-- restore.go
|   `-- root.go
|-- command.log
|-- go.mod
|-- go.sum
|-- iotdbtool-architecture.svg
|-- main.go
`-- readME.md

git clone http://git/iotdbtool.git
cd iotdbtool
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags "-w" -o bin/iotdbtools

-a:

  • 作用:强制重新编译所有依赖包,不论这些包是否已经被编译过或者是否存在缓存。Go 编译器会缓存依赖包以提高编译速度,默认情况下只重新编译必要的包。加上 -a 标志后,所有依赖包都会重新编译,适用于在编译时需要避免使用缓存的场景。

-installsuffix cgo:

  • 作用:为编译过程生成的目标文件(object files)加上一个后缀(这里是 cgo)。
  • -ldflags 传递链接器的选项给 Go 编译器的链接器。。-w:此标志告诉 Go 编译器的链接器不要生成调试信息(例如符号表、调试符号等),这样可以减小二进制文件的大小

直接下载二进制

wget https://nova-software-download.oss-cn-hangzhou.aliyuncs.com/iotdbtools && chmod +x iotdbtools && mv iotdbtools /usr/local/bin

使用指南

backup

 iotdbtools backup --config /opt/kubeconfig/cce-yx --namespace ems-uat --pods iotdb-datanode-0 --bucketname iotdb-backup \
--outname emsyx --uploadoss true --keep-local true --verbose 2

backup

restore

 iotdbtools restore --config /opt/kubeconfig/eks-config-ems-eu-newaccount --namespace iotdb --pods iotdb-datanode-0 \
--bucketname iotdb-backup --file emsyx_iotdb-datanode-0_20240906154128.tar.gz --verbose 1

restore

基本用法

iotdbtools is a CLI tool to backup and restore IoTDB data in Kubernetes.

Usage:
  iotdbtools [command]

Available Commands:
  backup      Backup IoTDB data
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  restore     restore iotdb data from OSS

Flags:
  -b, --bucketname string     oss bucket name (default "iotdb-backup")
  -s, --chunksize string      default chunksize is 10MB (default "10485760")
  -m, --cluster-name string   k8s clusterName
  -c, --config string         Path to the kubeconfig file (default "/root/.kube/config")
  -t, --containers string     default container (default "iotdb-datanode")
  -d, --datadir string        iotdb data dir (default "/iotdb/data")
  -h, --help                  help for iotdbbackuprestore
  -k, --keep-local string     keep file to local (default "true")
  -l, --label string          backup by pod label (default "statefulset.kubernetes.io/pod-name=iotdb-datanode-0")
  -n, --namespace string      Kubernetes namespace (default "iotdb")
  -o, --outname string        backup file name (default "iotdb-datanode-back")
  -p, --pods string           backup by pod name (default "iotdb-datanode-0")
      --uploadoss string      uploadoss flag,default is true (default "yes")
  -v, --verbose string        backup log level (default "0")

Use "iotdbtools [command] --help" for more information about a command.

命令行参数

命令行选项以及默认值

参数 描述 默认值
--namespace Kubernetes 命名空间名称 default
--podName Kubernetes Pod 名称 iotdb-datanode
--dataDir 容器中要备份的数据目录路径 /data/iotdb
--outname 备份文件的输出名称。 backup.tar.gz
--config 指定 Kubernetes 配置文件路径。 ~/.kube/config
--bucketName 阿里云 OSS 存储桶名称 my-bucket
-fileName OSS 存储桶中的文件名称 backup/backup.tar.gz
--kubeconfig Kubernetes 配置文件路径 ~/.kube/config
--verbose 日志输出详细级别(0、1、2) 1
--keepLocal keepLocal 设置为 false(不保留本地文件) false
--chunkSize 指定分片下载、上传的大小 10MB
--uploadoss

命令行补全

corba

# zsh
source <(iotdbtools completion zsh)
# bash
source <(iotdbtools completion bash)

示例

备份 iotdb

iotdbtools backup --config /opt/kubeconfig/cce-ems-plusuat.kubeconfg  --namespace ems-uat --pods=iotdb-datanode-0 --bucketname iotdb-backup  --outname emsuat --uploadoss=true --keep-local=true --datadir /iotdb/data/datanode --containers=iotdb-confignode --verbose=2

备份其他 pod 的指定文件

备份指定 pod、container 中指定目录到本地或 oss,使用场景: 定时任务上传pod中的文件

  • 配置中心
  • coredump文件定时上传
 iotdbtools backup --config /opt/kubeconfig/eks-config-ems-eu-newaccount --namespace ems-eu --pods vnnox-middle-configcenter-7459fcfb5b-6x8gz --datadir /tmp --containers vnnox-middle-configcenter --uploadoss true --bucketname iotdb-backup --keep-local false  --verbose 2

恢复备份

iotdbtools restore --config .config --namespace ems-uat --pods=iotdb-datanode-0 --bucketname iotdb-backup --verbose 2 --file emseu-workstaaa_iotdb-datanode-0_iotdb-datanode_20240822094200.tar.gz

配置

默认将备份文件上传到 oss,可以通过 uploadoss 关闭

OSS 的访问凭证保存到本地的 .credentials 文件中,请妥善保存

AK=your-access-key
SK=your-secret-key
ENDPOINT=your-oss-endpoint

日志输出

日志详细级别可以通过 --verbose 标志来设置。 日志级别 0 将不输出任何日志,适合静默执行。 日志级别 1 将输出基本操作日志。 日志级别 2 将输出详细日志,适合调试和问题排查。

其他

  • 企微通知

替换为自己的key即可发送企微通知

7. Release Note

2.3

1. 新增hook判断逻辑,提升适配性。可备份任何pod中的文件
2. fix issue: 失败时也发送成功通知的
3. 增加性能记录函数trackStepDuration
4. 适配多级bucketname
5. 新增iotdbtools 命令行补全功能

2.2

1. 增加企业微信通知
2. 新增分片上传参数chunksize
3. 增加集群备份并行逻辑

2.1

1. 新增keep-local参数
2. 新增uploadoss 参数控制上传逻辑
keep-local为true时备份先落到从本地上传到OSS,使用oss-go-sdk,否则使用ossutil上传.

2.0

1. 新增恢复iotdb备份逻辑

展望与鸣谢

这个工具刚开始叫iotdbbackuprestore 后来改成了iotdbtool。 有些运维操作都可以集成进来,例如iotdb部署、迁移(单机到集群、集群到单机、跨云/IDC迁移)、数据比对、监控与告警....

例如

  • iotdbtool create cluster 1c3d.yaml 通过声明式的方式创建集群,背后由iotdb operator驱动
  • iotdbtool data diff 数据比较

特别感谢chatgpt 和通义千问