Weaviate 是一个开创性的开源矢量数据库,旨在通过利用机器学习模型来增强语义搜索。与依赖关键字匹配的传统搜索引擎不同,Weaviate 采用语义相似性原则。这种创新方法将各种形式的数据(文本、图像等)转换为矢量表示,即捕捉数据上下文和含义本质的数字形式。通过分析这些向量之间的相似性,Weaviate 提供真正理解用户意图的搜索结果,大大超越了基于关键字的搜索的限制。
本指南旨在展示MinIO和Weaviate的无缝集成,充分利用 Kubernetes 原生对象存储和 AI 驱动的语义搜索功能。本指南利用Docker Compose进行容器编排,提供了一种构建强大、可扩展且高效的数据管理系统的战略方法。该设置针对我们如何存储、访问和管理数据,对于寻求利用现代存储解决方案和 AI 驱动的数据检索功能的开发人员、DevOps 工程师和数据科学家来说,这是一个改变游戏规则的方法。
在本演示中,我们将重点介绍如何使用 Docker 备份 Weaviate 和 MinIO 存储桶。此设置可确保我们的 AI 增强搜索和分析项目中的数据完整性和可访问性。
本次演示旨在强调使用 Docker 实现 MinIO 与 Weaviate 的无缝集成,展示一种备份 AI 增强搜索和分析系统的可靠方法。
此处提供的docker-compose.yaml
文件旨在为 Weaviate 建立无缝设置,彰显我们对简化和高效数据管理的承诺。此配置可实现一个强大的环境,其中 MinIO 充当安全存储服务,而 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 服务器
使用上述 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 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]...}
weaviate-backups
桶的访问策略为了将 Weaviate 与 MinIO 集成,MinIO 中的备份存储桶需要将指定备份存储桶(即weaviate-backups
)的访问策略适当地设置为 Public。此调整是必要的,以授予 Weaviate backup-s3 模块所需的权限,以便成功与 MinIO 存储桶交互以进行备份操作。
注意:在生产环境中,您可能需要锁定它,这超出了本教程的范围。
在进行此配置时,必须清楚了解将存储桶设置为“公共”的安全隐患。虽然此设置有助于在开发环境中完成备份过程,但对于生产系统,应考虑采用替代方法来维护数据的安全性和完整性。采用细粒度的访问控制,例如 IAM 策略或“预签名”URL。
在本演示结束时,您将能够看到 Weaviate 在使用backup-s3
模块的整个过程中创建的存储桶对象。
要在 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(`
此消息为警告横幅,可以忽略,如需更多信息,请访问此
!pip install weaviate-client
本节介绍“文章”和“作者”类的数据结构和架构,为数据的组织方式奠定基础。它演示了如何在 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:创建模式类
定义架构后,笔记本将指导您初始化 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:按类别索引数据
索引完数据后,重点将转移到通过备份保存数据库的状态。本部分笔记本展示了如何触发 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'}
成功备份响应
在继续恢复之前,有时需要清除现有架构。本节介绍干净恢复过程的步骤。这可确保恢复的数据不会与数据库中的现有架构或数据冲突。
client.schema.delete_class("Article") client.schema.delete_class("Author")
本节介绍如何恢复以前备份的数据,使数据库恢复到已知的良好状态。
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 客户端库执行。
到目前为止,我们已经向您展示了如何以 Pythonic 方式执行此操作。我们认为通过CURL
在内部展示如何在不编写脚本的情况下实现相同的操作会很有帮助。
要与 Weaviate 实例交互以执行创建架构、索引数据、执行备份和恢复数据等任务,可以使用特定的 curl 命令。这些命令会向 Weaviate 的 REST API 发出 HTTP 请求。例如,要创建架构,会向 Weaviate 的架构端点发送包含架构详细信息的 POST 请求。同样,要索引数据,会向对象端点发送包含数据有效负载的 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"} ] } ] }
文章和作者的示例架构类
这
另一方面,
[ { "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 命令,并将我们的示例文件本地克隆到我们当前的工作目录;我们可以将我们的 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:索引
我们需要分配一个唯一标识符,即“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)和配置。
通过在 Git 中编码所有内容,团队可以轻松跟踪更改、回滚到以前的状态并确保跨环境的一致性。GitOps 工作流可以与持续集成/持续部署 (CI/CD) 工具和 Kubernetes 集成,从而进一步简化容器化应用程序和基础设施管理的编排。我们将在以后的文章中详细介绍如何使用 GitOps 实现自动化。
Weaviate 允许备份或恢复特定类,这对于部分数据迁移或开发测试等情况很有用。
多节点备份:对于多节点设置,尤其是在 Kubernetes 环境中,确保您的配置正确指定了备份模块(如 MinIO 的 backup-s3)和相关的环境变量。
如果您在备份或恢复期间遇到问题,请检查环境变量配置,尤其是与 S3 兼容存储(如 MinIO)的 SSL 设置相关的配置。禁用 SSL( BACKUP_S3_USE_SSL: false
)可能会解决某些连接问题。
当我们结束使用 Docker Compose 将 Weaviate 与 MinIO 集成的探索时,很明显,这种组合不仅仅是一种技术解决方案,而且是对数据管理的战略增强。这种集成完全符合 MinIO 致力于提供可扩展、安全和高性能数据存储解决方案的承诺,现在通过 Weaviate 的 AI 驱动功能得到了进一步的增强。Docker Compose 的使用进一步简化了这种集成,强调了我们专注于使复杂技术变得易于访问和易于管理。
与往常一样,MinIO 团队始终致力于推动数据管理领域的创新。我们致力于增强和简化数据存储、访问和分析的方式,这是我们使命的核心。
通过将 Weaviate 的高级矢量数据库功能与 MinIO 提供的强大存储解决方案相结合,用户能够充分发挥其数据的潜力。这包括利用语义搜索功能,不仅可以确保数据的可访问性,还可以确保基础级别的安全性。
我们真正受到像您这样敬业而热情的开发人员的卓越创新的启发。我们很高兴能提供支持,并成为您探索高级解决方案和在数据驱动项目中达到新高度的旅程的一部分。请随时通过以下方式与我们联系