Qdrant 向量数据库- 快照 snapshots

       引子:数据库应用,备份还原很重要,Qdrant提供了快照功能,用于存档数据或复制现有部署,另外,Qdrant Cloud上还提供了 Backups 管理备份。

        参考官网:Snapshots - Qdrant

        API:List all snapshots (collection) — Qdrant | API Reference

这里简单整理下关于快照的使用,本地环境

1 准备:本地docker快启一个Qdrant实例, 打开localhost:6333/dashboard,创建个test集合,写点测试数据
docker pull qdrant/qdrant:v1.9.7

docker run -d \
-v /home/pet/qdrant/storage:/qdrant/storage \
-v /home/pet/qdrant/snapshots:/qdrant/snapshots \
--name pet-qdrant \
--restart=always \
--network host \
--memory="2048m" \
--cpus="1" \
qdrant/qdrant:v1.9.7

docker logs -f pet-qdrant

2 创建快照
# 1 调用 REST API 创建快照
curl -X POST http://localhost:6333/collections/collection_name/snapshots


# 2 使用 python 驱动创建
from qdrant_client import QdrantClient
client = QdrantClient(url="http://localhost:6333")
client.create_snapshot(collection_name="{collection_name}")

# ... 其他驱动参考官网
       快照文件所在目录:

       创建成功后会在挂载的 “/home/pet/qdrant/snapshots“ 目录下看到 “collection_name” 目录,在其中可以看到快照文件

3 快照列表
# 快照列表
curl http://localhost:6333/collections/collection_name/snapshots
3 下载快照文件
# 使用API
curl http://localhost:6333/collections/{collection_name}/snapshots/{snapshot_name}

# 可以直接ssh到服务器上,到挂载的目录 “/home/pet/qdrant/snapshots” 把文件拷贝出来
4 快照删除 
# 删除 API
curl -X DELETE http://localhost:6333/collections/collection_name/snapshots/snapshot_name

# 还可以直接在服务器上在挂载的快照目录,手动把文件rm掉
5 恢复快照
# 从 URL 或本地文件恢复

# 1 从 URL 恢复
curl -s -X PUT \"http://localhost:6333/collections/$collection_name/snapshots/recover\" \
                -H 'Content-Type: application/json' \
                -d '{\"location\": \"http://localhost:8080/collections/my_collection/snapshots/$collection_name\"}'")


# 2 从file location 恢复
curl -s -X PUT \"http://localhost:6333/collections/$collection_name/snapshots/recover\" \
                -H 'Content-Type: application/json' \
                -d '{\"location\": \"file:///qdrant/copied_data/qdrant/snapshots/$collection_name/$latest_snapshot_name\"}'")


# 3 还可以直接把文件拷贝到挂载的快照目录,刷新dashboard上对应的集合的快照列表,即可看到刚拷贝的快照,然后在UI或console里还原
        注意 url 和 file 的区别:

1 用url还原,存在文件上传的过程,速度会比较慢, 在脚本中需要考虑timeout

2 用本地文件时恢复时,这个快照文件要放在docker挂载的目录里,file location 也是指的在qdrant docker里的文件路径。

实例:

在team的测试项目中,考虑到运维等问题,采取了以下方案:

1,在 server1 上使用 docker 部署 qdrant;
2,在 server1 上执行定时任务,每天固定时间调用创建API创建备份,直接从挂载的快照目录把快照文件拷贝到临时的 copy_snapshots 目录;
3,不用调删除API, 直接冲进去快照目录 rm 掉3天以前的快照文件;
4,开发人员直接从copy_snapshots目录把快照文件拷贝到本地还原用于开发调查;

#!/bin/bash
set -ex

# docker快照目录, 副本快照目录
docker_snapshot_directory="/home/pet/qdrant/snapshots"
copied_snapshot_directory="/home/pet/copied_snapshots/qdrant/snapshots"
tarbak_snapshot_directory="/home/pet/copied_snapshots/qdrant/tarbak"

# 创建副本快照目录,处理目录权限
initialize_directories() {
    echo "[INFO] Recreate copied_snapshot_directory..."
    rm -rf "$copied_snapshot_directory"
    mkdir -p "$copied_snapshot_directory"
}

# 处理单个集合的函数
process_collection() {
    local collection_name=$1

    echo "[INFO] Start process collection: $collection_name."

    # 调用API创建快照
    create_url="http://localhost:6333/collections/$collection_name/snapshots"
    create_response=$(curl -s -X POST "$create_url")
    create_response_status=$(echo $create_response | jq -r '.status')

    if [ "$create_response_status" != "ok" ]; then
        echo "[ERROR] Snapshot creation failed for $collection_name."
        exit 1
    else
        echo "[INFO] Snapshot creation successful for $collection_name."
    fi

    # 找到docker里最新的快照文件
    latest_snapshot_name=$(ls -t "$docker_snapshot_directory/$collection_name"/*.snapshot 2>/dev/null | head -1 | xargs -r basename)

    if [[ -z $latest_snapshot_name ]]; then
        echo "[ERROR] No snapshot found for $collection_name."
        exit 1
    else
        echo "[INFO] Snapshot found for $collection_name."
    fi

    # 拷贝快照文件到备份目录
    mkdir -p "$copied_snapshot_directory/$collection_name"
    cp "$docker_snapshot_directory/$collection_name/$latest_snapshot_name" "$copied_snapshot_directory/$collection_name/"
    chgrp pet"$copied_snapshot_directory/$collection_name/$latest_snapshot_name"
    chown pet"$copied_snapshot_directory/$collection_name/$latest_snapshot_name"
    echo "[INFO] Snapshot copy successful for $collection_name."

    # 清理现场:docker快照目录_仅需保留最新的3份快照
    cd "$docker_snapshot_directory/$collection_name"
    ls -t *.snapshot | sed -e '1,3d' | xargs -d '\n' rm -f
    ls -t *.snapshot.checksum | sed -e '1,3d' | xargs -d '\n' rm -f
    echo "[INFO] Remove overdue snapshots in docker successful for $collection_name."

    echo "[INFO] End process collection: $collection_name."
}

mydate()
{
    date "+%Y%m%d%H%M%S"
}

# 上边在定义各种参量,函数,下边开始处理
echo "[INFO] Starting ..."

# 初始化目录
initialize_directories

# 定义集合数组
collections=("facegroup1" "facegroup2")

# 循环处理每个集合
for collection_name in "${collection_names[@]}"; do
    process_collection "$collection_name"
done

echo "[INFO] All collections has been processed."

# 时间戳,用于备份文件命名
backupdate=$(mydate)
# 创建并存储压缩文件在 tarbak_snapshot_directory 目录
tar -zcf "${tarbak_snapshot_directory}/qdrantbak.${backupdate}.tar.gz" -C "$copied_snapshot_directory" .
# 删除 tarbak_snapshot_directory 目录下超过7天的压缩文件
find "${tarbak_snapshot_directory}" -mtime +7 -name "qdrantbak.*.tar.gz" -exec rm -rf {} \;


echo "[INFO] create today.tar.gz successful."

echo "[INFO] Backup all process successful."


#grep CRON /var/log/syslog
#sudo crontab -e
# 每5分钟执行一次
#*/5 * * * * /home/leyserkids/backup_qdrant_task.sh >> /home/leyserkids/backup_qdrant_task_log/logfile_$(date +\%Y-\%m-\%d).log 2>&1
# 每天凌晨2点执行
#* 2 * * * /home/leyserkids/backup_qdrant_task.sh >> /home/leyserkids/backup_qdrant_task_log/logfile_$(date +\%Y-\%m-\%d).log 2>&1
补充:
官网上还有用于集群等的api介绍,大家可参考

Recover from a snapshot (collection) — Qdrant | API Reference

------------------------------------习惯打个分割线---------------------------------------------------------

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值