Weaviate 是一个开创性的开源向量数据库,旨在通过利用机器学习模型来增强语义搜索。与依赖关键字匹配的传统搜索引擎不同,Weaviate 采用语义相似性原则。这种创新方法将各种形式的数据(文本、图像等)转换为矢量表示形式,即捕捉数据上下文和含义本质的数字形式。通过分析这些向量之间的相似性,Weaviate提供了真正了解用户意图的搜索结果,从而超越了基于关键字的搜索的局限性。
本指南旨在演示 MinIO 和 Weaviate 的无缝集成,充分利用 Kubernetes 原生对象存储和 AI 驱动的语义搜索功能。本指南利用 Docker Compose 进行容器编排,提供了构建强大、可扩展且高效的数据管理系统的战略方法。针对我们如何存储、访问和管理数据,此设置对于寻求利用现代存储解决方案和 AI 驱动型数据检索功能的开发人员、DevOps 工程师和数据科学家来说是一个游戏规则改变者。
技术堆栈简介
在本演示中,我们将重点介绍如何使用 Docker 备份 Weaviate with MinIO buckets。这种设置确保了我们人工智能增强的搜索和分析项目中的数据完整性和可访问性。
-
用于存储的 MinIO:我们使用 MinIO 作为我们的主要存储平台。MinIO 以其高性能和可扩展性而闻名,擅长安全高效地处理大量数据。在本演示中,您将了解如何使用 MinIO 存储桶来备份 Weaviate 数据,确保我们系统的完整性和性能不受影响。
-
Weaviate 向量数据库:Weaviate 的向量数据库是这种集成的核心,它使 AI 应用程序能够执行语义搜索。通过将非结构化数据转换为有意义的向量表示,它使应用程序能够以细致入微的方式理解数据并与之交互,为更智能、响应更灵敏的 AI 驱动功能铺平道路。
该演示旨在重点介绍使用 Docker 将 MinIO 和 Weaviate 无缝集成,展示一种备份 AI 增强搜索和分析系统的可靠方法。
资源
所有文件都可通过 GitHub minio/blog-assets/minio-weaviate-backups 存储库文件夹获得。
- docker-compose.yaml
- schema.json
- data.json
- s3_backup_module.ipynb
知识渊博的先决条件
-
计算机上安装了 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.minio.org.cn: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:在启用模块和 play.minio.org.cn MinIO 服务器的情况下 backups-s3 部署 Weaviate
配置 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-backups’
- BACKUP_S3_ENDPOINT: ‘play.minio.org.cn: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 存储桶需要事先存在,Weaviate 不会为您创建存储桶。
部署步骤
要使用 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/data 用于 Weaviate)用于持久存储数据,确保您的数据在容器重启和部署中保持不变。
持久性存储允许更稳定的环境,在重新启动容器时不会丢失数据。
部署 docker-compose 后,您可以在浏览器中访问 Weaviate 服务器的 URL,然后 /v1/meta 检查您的部署配置是否正确。
JSON 有效负载的第一 http://localhost:8080/v1/meta 行应如下所示:
{"hostname":"http://[::]:8080","modules":{"backup-s3":{"bucketName":"weaviate-backups","endpoint":"play.minio.org.cn:443","useSSL":true}...[truncated]...}
配置 MinIO:存储桶的访问策略 weaviate-backups
为了将 Weaviate 与 MinIO 集成,MinIO 中的备份存储桶需要指定备份存储桶的访问策略,即 weaviate-backups to Public。此调整对于授予 Weaviate backup-s3 模块成功与 MinIO 存储桶交互以执行备份操作所需的权限是必要的。
注意:在生产环境中,您可能需要将其锁定,这超出了本教程的范围。
在处理此配置时,必须清楚地了解将存储桶设置为“public”的安全隐患。虽然此设置有助于开发环境中的备份过程,但应考虑为生产系统使用替代方法,以保持数据安全性和完整性。采用精细的访问控制,例如 IAM 策略或“预签名”URL。
成功备份到 weaviate-backups 存储桶
在本演示结束时,您将能够看到 Weaviate 在使用该 backup-s3 模块时在整个过程中创建的桶对象。
使用 Python 概述流程
要在 Weaviate 中启用 S3 备份,请在 docker-compose.yaml 文件中设置必要的环境变量。这指示 Weaviate 使用 MinIO 作为备份目的地,包括备份模块的设置和 MinIO 存储桶的详细信息。
在深入探讨技术操作之前,我想声明,我正在 JupyterLab 环境中演示以下步骤,以便将我们的管道封装在笔记本中的额外好处,可在此处获得。
第一步涉及通过使用 pip 安装 python weaviate-client 库来设置环境。这个 Python 包对于以更 Python 的方式与 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 步骤概述:
- Install weaviate-client Library
- Client initialization
- Schema creation
- Data insertion
- Backup initiation
- Data restoration
1. 安装 Weaviate-Client 库
!pip install weaviate-client
2. 导入文章和作者的模式类
本节介绍“Article”和“Author”类的数据结构和架构,为如何组织数据奠定了基础。它演示了如何在 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)
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.minio.org.cn/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.minio.org.cn/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.minio.org.cn/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.minio.org.cn/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)
恢复备份
期望:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}
成功的 Backup-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'}
成功的备份恢复
将 Article 类作为 JSON 对象返回
验证还原成功
最后,为了确认备份和还原过程已成功完成,笔记本包含一个步骤来检索“Article”类的架构。此验证可确保正确还原数据和架构。
client.schema.get("Article")
将 Article 类作为 JSON 对象返回
期望:
{'class': 'Article', 'description': 'A class to store articles'... [Truncated]...}
笔记本的每个部分都提供了贯穿 Weaviate 数据管理生命周期的综合指南,从初始设置和数据填充到备份、恢复和验证,所有这些都使用 Weaviate-client 库在 Python 生态系统中执行。
使用 curl 概述流程
到目前为止,我们已经向您展示了如何以 Python 方式执行此操作。我们认为,在 CURL 内部展示如何在不编写脚本的情况下实现相同的操作会很有帮助。
要与 Weaviate 实例交互以执行创建架构、索引数据、执行备份和恢复数据等任务,可以使用特定的 curl 命令。这些命令向 Weaviate 的 REST API 发出 HTTP 请求。例如,要创建架构,需要将包含架构详细信息的 POST 请求发送到 Weaviate 的架构端点。同样,要为数据编制索引,将向对象端点发出具有数据负载的 POST 请求。
备份是通过对备份端点的 POST 请求触发的,还原是通过对还原端点的 POST 请求完成的。其中每个操作都需要相应的 JSON 有效负载,通常在 curl 命令中使用 @ 符号作为文件引用提供。
为了实现 Weaviate,我们当然需要样本数据来处理,这
-
schema.json 概述了我们要编制索引的数据的结构。
-
data.json 是我们实际数据发挥作用的地方,其结构与schema.json文件中的类一致。
schema.json 和 data.json 文件位于此处的 MinIO blog-assets 存储库中。
{
"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"}
]
}
]
}
文章和作者的示例架构类
schema.json文件概述了要索引的数据的结构,详细说明了类、属性及其数据类型,有效地为如何在 Weaviate 中组织和交互数据奠定了基础。该模式充当 AI 理解和分类传入数据的蓝图,确保向量搜索引擎能够精确和相关地运行。
另一方面,data.json 文件使用实际的数据实例填充此架构,镜像实际应用程序和场景。此示例数据阐明了 Weaviate 搜索功能的潜力,提供了实践经验,展示了如何解决查询以及如何根据 AI 对内容的理解动态生成结果。
data.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.minio.org.cn/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.minio.org.cn/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.minio.org.cn/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.minio.org.cn/from-docker-to-localhost/",
"customEmbeddings": [0.4, 0.1, 0.2, 0.3]
}
}
]
使用 curl 进行设置
架构充当数据管理系统的结构支柱,定义数据的组织、索引和查询方式。
创建 Weaviate Schema
通过一个简单的 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'}
成功的 Backup-S3 响应
此输出的格式为 JSON 对象。它包括使用的后端(在本例中为 ‘s3’ )、备份中包含的类列表 ( ‘Article’ 、 ‘Author’ ‘backup-id’ s3://weaviate-backups/backup-id ‘SUCCESS’
这种结构化的响应不仅确认备份过程已成功完成,而且还提供了可用于将来参考、审核或恢复过程的基本信息。
数据恢复过程
Weaviate 生态系统中数据的恢复是通过结构化的 API 调用来实现的,该调用通过针对 /v1/backups/s3/backup-id/restore 端点的 POST 请求(由 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 ) 可能会解决某些连接问题。
适用于 Weaviate with MinIO 的强大且可扩展的备份解决方案
当我们结束使用 Docker Compose 将 Weaviate 与 MinIO 集成的探索时,很明显,这种组合不仅仅是一种技术解决方案,而是对数据管理的战略性增强。这种集成完全符合 MinIO 的承诺,即提供可扩展、安全和高性能的数据存储解决方案,现在 Weaviate 的 AI 驱动功能进一步增强了这种解决方案。Docker Compose 的使用进一步简化了这种集成,强调了我们对使复杂技术易于访问和管理的关注。
一如既往,MinIO团队始终致力于推动数据管理领域的创新。我们致力于增强和简化数据的存储、访问和分析方式,这是我们使命的核心。
通过将 Weaviate 的高级矢量数据库功能与 MinIO 提供的强大存储解决方案相结合,用户能够释放其数据的全部潜力。这包括利用语义搜索功能,不仅确保数据的可访问性,而且确保数据在基础层面的安全性。
我们真正受到像您这样敬业和热情的开发人员头脑中涌现的非凡创新的启发。我们非常高兴能提供支持,并成为您探索先进解决方案并在您的数据驱动项目中达到新高度的旅程的一部分。