iotdbtool

项目简介

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

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

痛点

  • 开源版本 iotdb 没有现成的冷备方案,exporttsfile 基本不可用,引用几十个 jar 导出全库需要巨量内存。
  • 业务核心组件,iotdb down = 业务不可用 down。 每天 2 次冷备,以备不时之需
  • 多个 iotdb 节点,备份恢复没有一个 all in one 简单的工具

功能特性

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

系统要求

Go 1.16 或更高版本
Kubernetes 集群
阿里云 OSS 存储桶和相应的访问权限

安装

从源码构建

首先,确保你已经安装了 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

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 编译器的链接器不要生成调试信息(例如符号表、调试符号等),这样可以减小二进制文件的大小

交叉编译(在 Windows 上编译 Linux 二进制文件)

set CGO_ENABLED=0
set GOOS=linux
set GOARCH=amd64
go build -o iotdbbackup

设置为 0,可以避免对系统上 C 库的依赖,从而生成更加通用的二进制文件。

编译完成后,你将获得一个 iotdbtools 二进制文件。可以到处运行

使用指南

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

在这里插入图片描述

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

在这里插入图片描述

基本用法

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 "iotdbbackuprestore [command] --help" for more information about a command.

命令行参数

命令行选项以及默认值

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

命令行补全

corba

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

示例

备份 uat 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
备份 cn/eu iotdb
# CN 集群并行备份
iotdbtools backup --config /opt/kubeconfig/cce-ems-plusuat.kubeconfg  --namespace iotdb-bigdata  --pods=iotdb-datanode-0,iotdb-datanode-1,iotdb-datanode-2 --bucketname iotdb-backup  --outname emscn --uploadoss=true --keep-local=true --datadir /iotdb/data/datanode  --containers=iotdb-confignode --verbose=2

#EU
iotdbtools backup --namespace ems-eu --pods=iotdb-datanode-0 --bucketname="iotdb-backup" --outname=emseu  --uploadoss=true --keep-local=true --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
恢复 cn 的备份
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 将输出详细日志,适合调试和问题排查。

其他

  • 统计代码行数
`find . -name "*.go"  | xargs -I GG echo "wc -l GG" | bash | awk '{sum+=$1} END {print sum}'
1725

Release

2.0

1. 新增恢复iotdb备份逻辑

2.1

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

2.2

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

2.3

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

2.3

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


Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐