备份 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 来测试,成功备份数据库


浙公网安备 33010602011771号