paint-brush
使用 MinIO S3 Buckets 备份 Weaviate,实现数据管理的战略增强by@minio
8,112
8,112

使用 MinIO S3 Buckets 备份 Weaviate,实现数据管理的战略增强

MinIO19m2024/04/04
Read on Terminal Reader
Read this story w/o Javascript

通过将 Weaviate 先进的矢量数据库功能与 MinIO 提供的强大存储解决方案结合起来,用户可以充分发挥其数据的潜力。
featured image - 使用 MinIO S3 Buckets 备份 Weaviate,实现数据管理的战略增强
MinIO HackerNoon profile picture
0-item



Weaviate 是一个开创性的开源矢量数据库,旨在通过利用机器学习模型来增强语义搜索。与依赖关键字匹配的传统搜索引擎不同,Weaviate 采用语义相似性原则。这种创新方法将各种形式的数据(文本、图像等)转换为矢量表示,即捕捉数据上下文和含义本质的数字形式。通过分析这些向量之间的相似性,Weaviate 提供真正理解用户意图的搜索结果,大大超越了基于关键字的搜索的限制。


本指南旨在展示MinIOWeaviate的无缝集成,充分利用 Kubernetes 原生对象存储和 AI 驱动的语义搜索功能。本指南利用Docker Compose进行容器编排,提供了一种构建强大、可扩展且高效的数据管理系统的战略方法。该设置针对我们如何存储、访问和管理数据,对于寻求利用现代存储解决方案和 AI 驱动的数据检索功能的开发人员、DevOps 工程师和数据科学家来说,这是一个改变游戏规则的方法。

技术栈简介

在本演示中,我们将重点介绍如何使用 Docker 备份 Weaviate 和 MinIO 存储桶。此设置可确保我们的 AI 增强搜索和分析项目中的数据完整性和可访问性。


  • MinIO 用于存储我们使用 MinIO 作为主要存储平台。MinIO 以其高性能和可扩展性而闻名,擅长安全高效地处理大量数据。在此演示中,您将看到如何使用 MinIO 存储桶备份 Weaviate 数据,确保我们系统的完整性和性能不受影响。


  • Weaviate矢量数据库此次整合的核心是 Weaviate 的矢量数据库,它为 AI 应用程序提供了执行语义搜索的能力。通过将非结构化数据转换为有意义的矢量表示,它使应用程序能够以深刻细致的方式理解数据并与之交互,为更智能、响应更快的 AI 驱动功能铺平了道路。


本次演示旨在强调使用 Docker 实现 MinIO 与 Weaviate 的无缝集成,展示一种备份 AI 增强搜索和分析系统的可靠方法。

资源

知识先决条件

  • 您的机器上安装了 Docker 和 Docker Compose。
  • 对 Docker 概念和 YAML 语法有基本的了解。
  • 使用 weaviate-client 库的 Python 环境。
  • 用于运行 curl 等命令的命令行访问。

与 Docker Compose 的集成和配置

此处提供的docker-compose.yaml文件旨在为 Weaviate 建立无缝设置,彰显我们对简化和高效数据管理的承诺。此配置可实现一个强大的环境,其中 MinIO 充当安全存储服务,而 Weaviate 利用此存储实现高级向量搜索功能。


docker-compose.yaml下面概述了 Weaviate 的设置。


 version: '3.8' services: weaviate: container_name: weaviate_server image: semitechnologies/weaviate:latest ports: - "8080:8080" environment: AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' ENABLE_MODULES: 'backup-s3' BACKUP_S3_BUCKET: 'weaviate-backups' BACKUP_S3_ENDPOINT: 'play.min.io:443' BACKUP_S3_ACCESS_KEY_ID: 'minioadmin' BACKUP_S3_SECRET_ACCESS_KEY: 'minioadmin' BACKUP_S3_USE_SSL: 'true' CLUSTER_HOSTNAME: 'node1' volumes: - ./weaviate/data:/var/lib/weaviate



Docker-Compose:部署启用backups-s3模块的 Weaviate 和play.min.io MinIO 服务器

配置 Weaviate 进行 S3 备份

使用上述 docker-compose.yaml,Weaviate 经过精心配置,可使用 MinIO 进行备份,确保数据完整性和可访问性。此设置涉及基本环境变量,例如将ENABLE_MODULES设置为backup-s3 ,以及 S3 存储桶、端点、访问密钥和 SSL 使用的各种设置。此外,还设置了PERSISTENCE_DATA_PATH以确保数据持久存储,并CLUSTER_NAME以进行节点识别。


值得注意的环境变量包括

  • ENABLE_MODULES :'backup-s3'
  • BACKUP_S3_BUCKET : 'weaviate-备份'
  • BACKUP_S3_ENDPOINT :'play.min.io:443'
  • BACKUP_S3_ACCESS_KEY_ID : ‘minioadmin’
  • BACKUP_S3_SECRET_ACCESS_KEY :'minioadmin'
  • BACKUP_S3_USE_SSL :'true'
  • PERSISTENCE_DATA_PATH :'/var/lib/weaviate'
  • CLUSTER_NAME :'node1'


此 docker-compose 中的 Weaviate 服务设置为利用已挂载的卷来实现数据持久性;这可确保您的数据在会话和操作之间持久存在。


注意: MinIO bucket 需要预先存在,Weaviate 不会为您创建 bucket。


部署步骤

要使用 Docker Compose 将 MinIO 和 Weaviate 集成到您的项目中,请遵循以下详细步骤:


保存或更新 Docker Compose 文件


  • 新设置:如果这是新设置,请将提供的 docker-compose.yaml 文件直接保存到项目的工作目录中。此文件对于正确配置服务至关重要。


  • 现有设置如果您要更新现有生产环境,请修改当前的 docker-compose.yaml 以反映上述设置。确保准确复制这些设置以连接到您的服务。


运行Docker Compose文件

一旦 docker-compose.yaml 文件到位,请在终端或命令提示符中使用以下命令来启动部署:


docker-compose up -d --build


此命令将以分离模式启动 Weaviate 服务,并在系统后台运行它们。


了解持久目录

  • 在构建和执行过程中,Docker Compose 将创建一个持久目录,如 docker-compose.yaml 文件中所指定。此目录 Weaviate 为./weaviate/data )用于持久存储数据,确保您的数据在容器重启和部署期间保持完整。


持久性存储可以提供更稳定的环境,当容器重新启动时数据不会丢失。


部署 docker-compose 后,您可以在浏览器中访问 Weaviate 服务器的 URL,然后访问/v1/meta来检查您的部署配置是否正确。


http://localhost:8080/v1/meta处的 JSON 有效负载的第一行应如下所示:


 {"hostname":"http://[::]:8080","modules":{"backup-s3":{"bucketName":"weaviate-backups","endpoint":"play.min.io:443","useSSL":true}...[truncated]...}


配置 MinIO: weaviate-backups桶的访问策略

为了将 Weaviate 与 MinIO 集成,MinIO 中的备份存储桶需要将指定备份存储桶(即weaviate-backups )的访问策略适当地设置为 Public。此调整是必要的,以授予 Weaviate backup-s3 模块所需的权限,以便成功与 MinIO 存储桶交互以进行备份操作。


配置 weaviate-backups 存储桶访问策略


注意:在生产环境中,您可能需要锁定它,这超出了本教程的范围。


在进行此配置时,必须清楚了解将存储桶设置为公共的安全隐患。虽然此设置有助于在开发环境中完成备份过程,但对于生产系统,应考虑采用替代方法来维护数据的安全性和完整性。采用细粒度的访问控制,例如 IAM 策略或“预签名”URL。



成功备份至 weaviate-backups bucket



在本演示结束时,您将能够看到 Weaviate 在使用backup-s3模块的整个过程中创建的存储桶对象。

使用 Python 概述流程

要在 Weaviate 中启用 S3 备份,请在 docker-compose.yaml 文件中设置必要的环境变量。这会指示 Weaviate 使用 MinIO 作为备份目标,包括备份模块和 MinIO 存储桶详细信息的设置。


在深入介绍技术操作之前,我想说明一下,我在 JupyterLab 环境中演示了以下步骤,以便将我们的管道封装在笔记本中,以便于后续操作。该笔记本可在此处查阅。


第一步是使用pip安装适用于 Python 的weaviate-client库来设置环境。此 Python 包对于以更 Pythonic 的方式与 Weaviate 的 RESTful API 交互至关重要,允许与数据库无缝交互以执行模式创建、数据索引、备份和恢复等操作。为了演示,我们将使用 Weaviate Python 客户端库进行说明。


在此演示中,我们使用 Weaviate V3 API,因此当您运行 Python 脚本时,您可能会看到如下消息:


 `DeprecationWarning: Dep016: You are using the Weaviate v3 client, which is deprecated. Consider upgrading to the new and improved v4 client instead! See here for usage: https://weaviate.io/developers/weaviate/client-libraries/python warnings.warn(`


此消息为警告横幅,可以忽略,如需更多信息,请访问此文章在 Weaviate 博客上。


Python 步骤概述


  1. 安装 weaviate-client 库
  2. 客户端初始化
  3. 架构创建
  4. 数据插入
  5. 备份启动
  6. 数据恢复


1.Weaviate-Client库的安装

!pip install weaviate-client


2. 导入文章和作者的架构类

本节介绍“文章”“作者”类的数据结构和架构,为数据的组织方式奠定基础。它演示了如何在 Weaviate 中以编程方式定义和管理架构,展示了 Weaviate 适应各种针对特定应用需求定制的数据模型的灵活性和强大功能。


 import weaviate client = weaviate.Client("http://localhost:8080") # Schema classes to be created schema = { "classes": [ { "class": "Article", "description": "A class to store articles", "properties": [ {"name": "title", "dataType": ["string"], "description": "The title of the article"}, {"name": "content", "dataType": ["text"], "description": "The content of the article"}, {"name": "datePublished", "dataType": ["date"], "description": "The date the article was published"}, {"name": "url", "dataType": ["string"], "description": "The URL of the article"}, {"name": "customEmbeddings", "dataType": ["number[]"], "description": "Custom vector embeddings of the article"} ] }, { "class": "Author", "description": "A class to store authors", "properties": [ {"name": "name", "dataType": ["string"], "description": "The name of the author"}, {"name": "articles", "dataType": ["Article"], "description": "The articles written by the author"} ] } ] } client.schema.delete_class('Article') client.schema.delete_class('Author') client.schema.create(schema)

Python:创建模式类


3. 架构和数据的设置

定义架构后,笔记本将指导您初始化 Weaviate 客户端、在 Weaviate 实例中创建架构以及索引数据。此过程使用初始数据集填充数据库,从而探索 Weaviate 的矢量搜索功能。它说明了开始利用 Weaviate 以矢量格式存储和查询数据所需的实际步骤。


 # JSON data to be Ingested data = [ { "class": "Article", "properties": { "title": "LangChain: OpenAI + S3 Loader", "content": "This article discusses the integration of LangChain with OpenAI and S3 Loader...", "url": "https://blog.min.io/langchain-openai-s3-loader/", "customEmbeddings": [0.4, 0.3, 0.2, 0.1] } }, { "class": "Article", "properties": { "title": "MinIO Webhook Event Notifications", "content": "Exploring the webhook event notification system in MinIO...", "url": "https://blog.min.io/minio-webhook-event-notifications/", "customEmbeddings": [0.1, 0.2, 0.3, 0.4] } }, { "class": "Article", "properties": { "title": "MinIO Postgres Event Notifications", "content": "An in-depth look at Postgres event notifications in MinIO...", "url": "https://blog.min.io/minio-postgres-event-notifications/", "customEmbeddings": [0.3, 0.4, 0.1, 0.2] } }, { "class": "Article", "properties": { "title": "From Docker to Localhost", "content": "A guide on transitioning from Docker to localhost environments...", "url": "https://blog.min.io/from-docker-to-localhost/", "customEmbeddings": [0.4, 0.1, 0.2, 0.3] } } ] for item in data: client.data_object.create( data_object=item["properties"], class_name=item["class"] )

Python:按类别索引数据


4.创建备份

索引完数据后,重点将转移到通过备份保存数据库的状态。本部分笔记本展示了如何触发 MinIO 的备份操作。


 result = client.backup.create( backup_id="backup-id", backend="s3", include_classes=["Article", "Author"], # specify classes to include or omit this for all classes wait_for_completion=True, ) print(result)

Python:创建备份


预计:

 {'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id-2', 'path': 's3://weaviate-backups/backup-id-2', 'status': 'SUCCESS'}

成功备份响应


5. 删除架构类以进行恢复

在继续恢复之前,有时需要清除现有架构。本节介绍干净恢复过程的步骤。这可确保恢复的数据不会与数据库中的现有架构或数据冲突。


 client.schema.delete_class("Article") client.schema.delete_class("Author")


6.恢复备份

本节介绍如何恢复以前备份的数据,使数据库恢复到已知的良好状态。

 result = client.backup.restore( backup_id="backup-id", backend="s3", wait_for_completion=True, ) print(result)

Python:恢复备份


预计:

 {'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}

成功的备份 S3 响应


恢复过程中的错误处理

本笔记本的这一部分提供了在备份恢复过程中实现错误处理的示例。它提供了对数据恢复操作期间意外问题的见解。


 from weaviate.exceptions import BackupFailedError try: result = client.backup.restore( backup_id="backup-id", backend="s3", wait_for_completion=True, ) print("Backup restored successfully:", result) except BackupFailedError as e: print("Backup restore failed with error:", e) # Here you can add logic to handle the failure, such as retrying the operation or logging the error.



预计:

 Backup restored successfully: {'backend': 's3', 'classes': ['Author', 'Article'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}

备份恢复成功


验证恢复成功


最后,为了确认备份和恢复过程已成功完成,笔记本包含一个检索“文章”类的架构的步骤。此验证可确保数据和架构正确恢复。


 client.schema.get("Article")

将 Article 类作为 JSON 对象返回


预计:

 {'class': 'Article', 'description': 'A class to store articles'... [Truncated]...}


笔记本的每个部分都提供了 Weaviate 数据管理生命周期的全面指南,从初始设置和数据填充到备份、恢复和验证,所有这些都在 Python 生态系统中使用 Weaviate 客户端库执行。


使用 curl 概述流程

到目前为止,我们已经向您展示了如何以 Pythonic 方式执行此操作。我们认为通过CURL在内部展示如何在不编写脚本的情况下实现相同的操作会很有帮助。


要与 Weaviate 实例交互以执行创建架构、索引数据、执行备份和恢复数据等任务,可以使用特定的 curl 命令。这些命令会向 Weaviate 的 REST API 发出 HTTP 请求。例如,要创建架构,会向 Weaviate 的架构端点发送包含架构详细信息的 POST 请求。同样,要索引数据,会向对象端点发送包含数据有效负载的 POST 请求。


备份通过向备份端点发送 POST 请求触发,恢复通过向恢复端点发送 POST 请求完成。这些操作中的每一个都需要适当的 JSON 负载,通常使用@符号在 curl 命令中作为文件引用提供。


为了实现 Weaviate,我们当然需要样本数据,


我已经包含了以下内容:


  1. schema.json概述了我们想要索引的数据的结构。

  2. data.json是我们实际数据发挥作用的地方,其结构与 schema.json 文件中的类一致。


schema.json 和 data.json 文件位于以下位置的 MinIO blog-assets存储库中:这里


架构.json


 { "classes": [ { "class": "Article", "description": "A class to store articles", "properties": [ {"name": "title", "dataType": ["string"], "description": "The title of the article"}, {"name": "content", "dataType": ["text"], "description": "The content of the article"}, {"name": "datePublished", "dataType": ["date"], "description": "The date the article was published"}, {"name": "url", "dataType": ["string"], "description": "The URL of the article"}, {"name": "customEmbeddings", "dataType": ["number[]"], "description": "Custom vector embeddings of the article"} ] }, { "class": "Author", "description": "A class to store authors", "properties": [ {"name": "name", "dataType": ["string"], "description": "The name of the author"}, {"name": "articles", "dataType": ["Article"], "description": "The articles written by the author"} ] } ] }

文章和作者的示例架构类


架构.json文件概述了要索引的数据的结构,详细说明了类、属性及其数据类型,有效地为如何在 Weaviate 中组织和交互数据奠定了基础。此架构充当了 AI 理解和分类传入数据的蓝图,确保矢量搜索引擎能够精确且相关地运行。


另一方面, 数据.json文件用实际的数据实例填充此模式,反映了现实世界的应用程序和场景。此示例数据阐明了 Weaviate 搜索功能的潜力,提供了亲身体验,展示了如何解决查询以及如何根据 AI 对内容的理解动态生成结果。


数据.json


 [ { "class": "Article", "properties": { "title": "LangChain: OpenAI + S3 Loader", "content": "This article discusses the integration of LangChain with OpenAI and S3 Loader...", "url": "https://blog.min.io/langchain-openai-s3-loader/", "customEmbeddings": [0.4, 0.3, 0.2, 0.1] } }, { "class": "Article", "properties": { "title": "MinIO Webhook Event Notifications", "content": "Exploring the webhook event notification system in MinIO...", "url": "https://blog.min.io/minio-webhook-event-notifications/", "customEmbeddings": [0.1, 0.2, 0.3, 0.4] } }, { "class": "Article", "properties": { "title": "MinIO Postgres Event Notifications", "content": "An in-depth look at Postgres event notifications in MinIO...", "url": "https://blog.min.io/minio-postgres-event-notifications/", "customEmbeddings": [0.3, 0.4, 0.1, 0.2] } }, { "class": "Article", "properties": { "title": "From Docker to Localhost", "content": "A guide on transitioning from Docker to localhost environments...", "url": "https://blog.min.io/from-docker-to-localhost/", "customEmbeddings": [0.4, 0.1, 0.2, 0.3] } } ]

包含文章的样本数据


使用 curl 设置

该模式是我们数据管理系统的结构支柱,定义了数据的组织、索引和查询方式。


创建 Weaviate 模式

通过一个简单的 curl 命令,并将我们的示例文件本地克隆到我们当前的工作目录;我们可以将我们的 schema.json 直接发布到 Weaviate,规定我们的数据将遵循的规则和关系。


 curl -X POST -H "Content-Type: application/json" \ --data @schema.json http://localhost:8080/v1/schema

CURL:创建


填充架构:索引数据

有了架构后,下一步就是用实际数据填充它。使用另一个 curl 命令,我们将 data.json 索引到架构中。


 curl -X POST -H "Content-Type: application/json" \ --data @data.json http://localhost:8080/v1/objects

CURL:索引


确保数据持久性:使用 MinIO 备份

我们需要分配一个唯一标识符,即“backup-id”。此标识符不仅有助于精确跟踪和检索备份集,还可以确保每个数据集都受到版本控制。


 curl -X POST 'http://localhost:8080/v1/backups/s3' -H 'Content-Type:application/json' -d '{ "id": "backup-id", "include": [ "Article", "Author" ] }'

CURL:备份-s3


预计:

 {'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}

成功的备份 S3 响应


此输出的格式为 JSON 对象。它包括使用的后端(在本例中为's3' )、备份中包含的类列表( 'Article''Author' )、分配给备份的唯一标识符 id ( 'backup-id' )、指示备份在 S3 存储桶中存储位置的路径( s3://weaviate-backups/backup-id )以及操作的状态( 'SUCCESS' )。


这种结构化的响应不仅确认备份过程成功完成,而且还提供了可用于将来参考、审计或恢复过程的重要信息。


数据恢复过程

通过结构化 API 调用,可以通过 POST 请求恢复 Weaviate 生态系统中的数据,该请求针对 /v1/backups/s3/backup-id/restore 端点(由 backup-id 标识)。此 curl 调用不仅可以恢复丢失或存档的数据,还可以让您保持连续性。


 curl -X POST 'http://localhost:8080/v1/backups/s3/backup-id/restore' \ -H 'Content-Type:application/json' \ -d '{ "id": "backup-id", "exclude": ["Author"] }'

CURL:恢复


预计:

 { "backend": "s3", "classes": ["Article"], "id": "backup-id", "path": "s3://weaviate-backups/backup-id", "status": "SUCCESS" }

成功恢复响应


这些命令中的每一个都应根据您的特定设置和要求进行调整。您可能需要根据需要修改端点 URL、数据文件路径和其他参数。此外,请确保您的环境中有必要的文件(schema.json、data.json)和配置。

关于 Weaviate 的附加说明

使用 GitOps 实现自动化

通过在 Git 中编码所有内容,团队可以轻松跟踪更改、回滚到以前的状态并确保跨环境的一致性。GitOps 工作流可以与持续集成/持续部署 (CI/CD) 工具和 Kubernetes 集成,从而进一步简化容器化应用程序和基础设施管理的编排。我们将在以后的文章中详细介绍如何使用 GitOps 实现自动化。

部分备份和恢复

Weaviate 允许备份或恢复特定类,这对于部分数据迁移或开发测试等情况很有用。


多节点备份:对于多节点设置,尤其是在 Kubernetes 环境中,确保您的配置正确指定了备份模块(如 MinIO 的 backup-s3)和相关的环境变量。

故障排除

如果您在备份或恢复期间遇到问题,请检查环境变量配置,尤其是与 S3 兼容存储(如 MinIO)的 SSL 设置相关的配置。禁用 SSL( BACKUP_S3_USE_SSL: false )可能会解决某些连接问题。

使用 MinIO 为 Weaviate 提供强大且可扩展的备份解决方案

当我们结束使用 Docker Compose 将 Weaviate 与 MinIO 集成的探索时,很明显,这种组合不仅仅是一种技术解决方案,而且是对数据管理的战略增强。这种集成完全符合 MinIO 致力于提供可扩展、安全和高性能数据存储解决方案的承诺,现在通过 Weaviate 的 AI 驱动功能得到了进一步的增强。Docker Compose 的使用进一步简化了这种集成,强调了我们专注于使复杂技术变得易于访问和易于管理。


与往常一样,MinIO 团队始终致力于推动数据管理领域的创新。我们致力于增强和简化数据存储、访问和分析的方式,这是我们使命的核心。


通过将 Weaviate 的高级矢量数据库功能与 MinIO 提供的强大存储解决方案相结合,用户能够充分发挥其数据的潜力。这包括利用语义搜索功能,不仅可以确保数据的可访问性,还可以确保基础级别的安全性。


我们真正受到像您这样敬业而热情的开发人员的卓越创新的启发。我们很高兴能提供支持,并成为您探索高级解决方案和在数据驱动项目中达到新高度的旅程的一部分。请随时通过以下方式与我们联系松弛,无论您有疑问还是只是想打个招呼。