备份 TDengine 集群数据

背景

因为 TDengine 集群是在单服务器上使用 docker-compose 启动的,使用 tdengine 二进制客户端来备份无法解决 FQDN 问题。所以开启一个docker容器加入 TDengine 集群的网络来进行备份操作。
搭建 TDengine 的步骤:https://www.cnblogs.com/klvchen/articles/18515409

创建目录

mkdir -p /data/docker-compose/tdengine-backup
cd /data/docker-compose/tdengine-backup

创建 entrypoint.sh 脚本

该脚本用于替换原来镜像的启动脚本

# 注意事项:
# 修改 td 的用户名和密码
# tdengine IP 会由 cron_backup_td.sh 脚本自动修改

vi entrypoint.sh 
#!/bin/bash

# tdengine IP
HOST=172.22.0.3

# 用户名
USER=root

# 密码
PASS=xxxxxx

DATE=$(date +%F)

DB_LIST=$(taos -h${HOST} -u${USER} -p${PASS} -s "show databases;" 2>/dev/null |egrep -vw "information_schema|performance_schema|log|Query OK" | awk 'NR>6 && NF>0 {print $1}' | head -n -1)

for DB in ${DB_LIST} 
do
#  echo ${DB} 
  mkdir -p /mnt/${DATE}/${DB}
  taosdump -h ${HOST} -u ${USER} -p${PASS} -o /mnt/${DATE}/${DB} -D ${DB}
  cd /mnt/${DATE}/ && tar zcf ${DB}.tgz ${DB} && rm -rf ${DB}
done

exit 0

创建 docker-compose.yml

# 注意事项
# td的备份路径
# 需要手动指定网络,可以通过 docker network ls 查看

vi docker-compose.yml 
version: "3"
services:
  taosnode-bak:
    image: tdengine/tdengine:3.3.3.0
    hostname: taosnode-bak
    container_name: taosnode-bak
    environment:
      TAOS_FQDN: "taosnode-bak"
      TAOS_FIRST_EP: "taosnode-bak"
      TZ: "Asia/Shanghai"
      TAOS_NUM_OF_COMMIT_THREADS: "30"
      TAOS_LOCALE: "zh_CN.UTF-8"
      TAOS_SML_CHILD_TABLE_NAME: "tname"
      TAOS_ADAPTER_UPLOAD_KEEPER_ENABLE: "false"
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 8G
    privileged: true
    volumes:
      - /data/backup/tdengine_backup/:/mnt    # 注意这个td备份路径
      - ./entrypoint.sh:/usr/bin/entrypoint.sh  # 替换原来的 entrypoint.sh 脚本
    networks:
      - tdengine-cluster_default              # 需要指定到 td 集群的网络
networks:
  tdengine-cluster_default:
    external: true

定时任务的脚本

# 注意事项
# td 备份的文件夹与 docker-compose.yml需要一致
# 需要指定 td 集群中任意一个容器的名称
# 需要指定新的 entrypoint.sh 的路径
# 需要指定备份程序的路径

vi cron_backup_td.sh

#!/bin/bash
source /etc/profile

# 定义容器名称,该名称可以是 td 集群中任意一个
CONTAINER_NAME="taosnode1"

# 定义entrypoint.sh的路径
ENTRYPOINT_FILE="/data/docker-compose/tdengine-backup/entrypoint.sh"

# td 备份的文件夹
TD_BACKUP="/data/backup/tdengine_backup"

# 数据库备份保留多少天
BDAY=2

# 保存多少天的数据
find ${TD_BACKUP} -maxdepth 1 -type d  -mtime +${BDAY}  -exec rm -rf {} \;

# 获取容器的IP地址
CONTAINER_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${CONTAINER_NAME})

# 检查是否成功获取到了IP地址
if [ -z "${CONTAINER_IP}" ]; then
    echo "未能获取容器 ${CONTAINER_NAME} 的IP地址,请检查容器名称是否正确。"
    exit 1
fi

# 使用sed命令修改entrypoint.sh中的HOST变量
sed -i "s/^HOST=.*/HOST=${CONTAINER_IP}/" ${ENTRYPOINT_FILE}

# 创建备份文件夹
mkdir -p ${TD_BACKUP}

# 启动备份程序
cd /data/docker-compose/tdengine-backup && docker-compose --compatibility up && docker-compose --compatibility down

测试

使用 cron 来测试,成功备份数据库

posted @ 2024-11-19 17:01  klvchen  阅读(30)  评论(0)    收藏  举报