使用 MinIO 和 PostgreSQL 简化数据事件

Streamlining Data Events with MinIO and PostgreSQL

本教程将教你如何设置和管理数据事件(也称为桶或对象事件),以及如何在 MinIO 和 PostgreSQL 之间使用 Docker 和 Docker Compose 进行通信。

您可能已经在利用 MinIO 事件与外部服务通信,现在您将通过使用 PostgreSQL 自动化和简化数据事件管理来增强您的数据处理能力。本文面向那些对 MinIO、PostgreSQL 和 Docker 有基本了解的人,提供了一种动手部署一个协调环境的方法,在该环境中 MinIO 和 PostgreSQL 协同工作。

让我们深入研究如何使用 Docker Compose 部署这些服务,并探索将 MinIO 中的事件发布到 PostgreSQL 的实际应用。

先决条件:

  • 已安装 Docker 和 Docker Compose
  • 对 MinIO、PostgreSQL 和 Docker 的基本了解
  • 可以使用 Docker 访问 MinIO UI 或命令行界面

MinIO 和集成服务

Kubernetes 原生 MinIO 无缝集成 了各种云原生技术。本指南将利用 MinIO 对 Postgres、Redis、Kafka 等服务的原生支持。这些集成对于跨不同云环境的流畅数据管理至关重要。

我们将使用 Docker Compose 创建一个用户友好、配置驱动的设置。本教程提供了一条简单的途径来集成高级通知功能并微调 MinIO 设置,以满足您项目的特定需求。

数据管理中的实际应用

如演示所示,MinIO 与 PostgreSQL 的集成在各个领域开辟了大量实际应用。

  • 数据分析和报告:自动捕获 MinIO 桶中的数据更改,并使用 PostgreSQL 进行分析和生成见解。
  • 备份和恢复:通过跟踪存储在 MinIO 中的数据中的每次更改来实现强大的数据备份解决方案。
  • 事件驱动的应用程序:开发对 MinIO 中的数据更改做出响应的应用程序,例如在上传新数据时触发流程或警报。
  • 合规性和审计:维护数据访问和更改日志,以符合监管标准。

此设置在需要实时数据跟踪的环境中特别有用,例如金融服务、医疗保健和电子商务。

部署 MinIO 和 PostgreSQL 服务

在 MinIO 中设置事件通知

MinIO 中的事件通知可以通过多种方法配置,从使用用户界面,到运行命令行实用程序,再到使用各种编程语言和 SDK 进行脚本编写。让我们看看每种方法的优缺点。

  • MinIO 控制台:这种方法提供了一个用户友好的图形界面,允许您直观地管理 Webhook 设置。
  • MinIO 的 mc 命令行工具:对于那些喜欢命令行界面的人,MinIO 提供了 mc 命令工具,它允许详细且可脚本化的 Webhook 配置。
  • 代码和脚本:使用 Bash 和 Python 脚本,此方法在设置 Webhook 时提供了高度的灵活性和自动化。

以下描述了如何使用两种不同的方法部署和连接 MinIO 和 PostgreSQL:MinIO 控制台和 mc 命令行客户端实用程序。这两种方法都侧重于配置 MinIO 以将桶事件通知直接发送到 PostgreSQL 数据库,确保实时数据同步和简化的工作流程。

使用 Docker-Compose 部署:MinIO + Postgres

我们将首先设置 MinIO 及其环境以及 PostgreSQL 数据库。如果您尚未运行这些服务,则需要部署一个 Docker Compose 文件。

我们将使用下面的 docker-compose YAML 文件来使用 Docker Compose 部署和启动 MinIO 和 PostgreSQL。

version: '3.8'
services:
  minio:
    container_name: minio
    image: minio/minio
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server /data --console-address ":9001"
    ports:
      - "9000:9000"
      - "9001:9001"

    volumes:
      - minio_data:/data

  postgres:
    container_name: postgres
    image: postgres:alpine
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  minio_data:
  postgres_data:

此 docker-compose 结构概述了两个服务及其各自的配置变量,以及每个服务的持久卷和网络端口转发。

在 MinIO 中配置 PostgreSQL 连接时,请在连接字符串中包含用户名和密码。例如,您在 MinIO 配置中的连接字符串可能如下所示:connection_string="user=myuser password=mypassword host=postgres dbname=postgres port=5432 sslmode=disable"。这确保了 MinIO 可以成功连接并验证 PostgreSQL 数据库。

在 PostgreSQL 中创建桶事件表

在设置 Flask 应用程序以记录和处理来自 MinIO 桶的事件通知之前,我们首先需要在 PostgreSQL 中建立适当的数据库结构。这包括创建一个专门的表来记录这些事件。

在 PostgreSQL 中创建“Events”表

首先访问您的 PostgreSQL 容器。这可以通过执行“docker exec”命令来完成。接下来,您需要创建“events”表。此表旨在存储有关每个事件的各种详细信息。在 PostgreSQL 容器中执行此命令

docker exec postgres psql -U myuser -d postgres -c "DROP TABLE IF EXISTS events; CREATE TABLE events (key TEXT PRIMARY KEY, value JSONB);"

创建表后,通过在命令提示符中键入 exit 退出 PostgreSQL 容器

我们准备使用事件记录和分析与 MinIO 桶的交互,以系统地跟踪桶内文件上传、修改或删除等事件。

设置与本地 PostgreSQL 服务器的事件通知

要在 Docker 环境中使用主机上的 PostgreSQL 服务器在 MinIO 中设置事件通知,请在连接字符串中使用host.docker.internal作为主机。此特殊 DNS 名称解析为主机使用的内部 IP 地址。此设置在我的上一篇文章从 Docker 到本地主机中详细介绍。

如果 postgres 运行在 localhost 上,您的连接字符串将是

connection_string="user=myuser password=mypassword host=host.docker.internal dbname=postgres port=5432 sslmode=disable"

此方法对于确保 Docker 容器中的 MinIO 可以有效地与您的主机上运行的 PostgreSQL 通信至关重要。

MinIO UI 和mc:增强数据管理的双重方法

在云存储和数据管理领域,灵活性和控制至关重要。MinIO 通过其双重方法满足了这一需求:直观的MinIO 控制台 (UI)和强大的mc (MinIO 客户端) 命令行界面 (CLI)。本教程包含使用这两者的说明,因此您可以选择您喜欢的此多功能且全面的工具集的任何部分。

MinIO UI:图形用户界面用户友好,非常适合那些喜欢使用可视化方法进行配置和管理的人员。它允许您轻松浏览桶、设置事件通知和监控存储。对于快速设置以及更习惯于点击环境的用户来说,UI 特别有用。

mc 命令行工具:另一方面,mc CLI 提供了对 MinIO 实例的细粒度控制。它是一个用于脚本编写、自动化和详细配置的强大工具。此界面非常适合需要精确控制存储、网络和数据管理任务的高级用户。CLI 促进复杂任务,如批处理操作、用于自动备份的脚本以及跨各种环境直接操作对象。

通过利用 UI 和 CLI,MinIO 用户可以同时享受两者的优势:易用性和高级控制,从而确保高效灵活的数据管理体验。

让我们看看管理数据事件的不同方法。

使用 MinIO UI

在 MinIO 用户界面中配置 PostgreSQL

打开浏览器并转到“http://localhost:9001”。使用安装期间创建的 MinIO 凭据登录。导航到 MinIO 控制台中的事件通知设置,点击添加事件目标并选择 PostgreSQL 作为服务。

如下面的屏幕截图所示,为我们想要创建的桶事件输入标识符“minio-postgres-demo”,然后继续配置所需的参数。

通过分配“连接字符串”(如我们之前概述的),我们能够将我们的 Postgres 容器设置为主机;同样,将“table”名称“events”添加为目标的表名。

Configuring MinIO S3 Bucket Event notifications for PostgreSQL

设置 PostgreSQL 服务端点的过程涉及使用环境变量或设置运行时配置。指定这些设置后,需要重新启动 MinIO 服务器才能使它们生效。这是因为 MinIO 在启动时加载其配置,并且在 UI 中进行的更改需要重新启动才能被系统识别和实现。

重启 MinIO 服务器

需要注意的是,仅在 UI 中配置设置不会自动触发 MinIO 服务的重启。因此,在完成 PostgreSQL 事件通知的 UI 配置后,您应该使用带有 **docker exec minio** 前缀的命令手动重启您的 MinIO 部署。此步骤确保您的配置更改被获取,并且事件通知按预期开始工作。

docker exec minio mc admin service restart

创建 Bucket

为了有效地使用 MinIO 与 PostgreSQL 的事件通知,首先在 MinIO 部署中创建一个 Bucket。此 Bucket 是您希望监视的所有事件发生的地方。在本指南中,我们将此 Bucket 命名为 **“test”**。此名称应与事件通知配置中使用的名称一致,以确保功能正常。

订阅 Bucket 通知事件

成功创建 Bucket 事件后,我们可以继续操作要订阅事件的 Bucket。以下屏幕截图将名为 **“test”** 的 Bucket 订阅到 **“minio-postgres-demo”** 事件,该事件将针对我们的 PostgreSQL 部署。在这里,您可以指定任何前缀或后缀,以及选择要订阅的事件类型。

在 MinIO UI 的下一个屏幕截图中,我们可以看到 **“test”** Bucket 已成功订阅到我们之前创建的“事件”。

使用 mc 命令行工具

使用 mc 的以 CLI 为中心的方法提供了一种强大且高效的方式来将 MinIO 与 PostgreSQL 集成,从而增强云存储操作中整体的数据工作流程和管理。对于那些希望在管理云存储和数据流程时结合自动化/脚本和手动控制的人来说,它尤其有用。

在部署上面概述的 **docker-compose.yaml** 后,继续使用 MinIO 客户端 mc 命令行工具。此设置涉及在 MinIO 中创建别名、配置 PostgreSQL 端点以及设置 Bucket 通知。

我们将使用 **“minio”** 容器的交互式终端进行操作,我们可以通过运行单个命令来启动它。

docker exec -it minio /bin/sh

从这个 Shell 中运行我们的 mc 命令的原因是,Docker **minio/minio** 镜像已经安装了 **mc** 并准备就绪。

配置 MinIO 将事件通知直接发送到 PostgreSQL 数据库(在 MinIO 容器内)

进入容器后,我们可以访问 mc 实用程序,从而可以继续执行将 MinIO 配置为将事件直接发送到 PostgreSQL 的步骤。

为您的 MinIO 实例设置别名。这简化了以后的命令。

mc alias set myminio http://localhost:9000 minio minio123

创建要监视的“test”Bucket。

mc mb myminio/test


配置 MinIO 实例以连接到您的 PostgreSQL 数据库以进行事件通知。

mc admin config set myminio notify_postgres:minio-postgres-demo connection_string="user=myuser password=mypassword host=postgres dbname=postgres port=5432 sslmode=disable" table="events" format="namespace"

重新启动 MinIO 服务以应用新的配置。

mc admin service restart myminio

为特定的 Bucket 操作(如 PUT、GET 和 DELETE)设置事件通知。

mc event add myminio/test arn:minio:sqs::minio-postgres-demo:postgresql --event put,get,delete

有关更详细的说明和信息,您可以参考 MinIO 文档中的 Bucket 通知监视 Bucket 和对象事件

验证设置

在 MinIO 中设置事件通知并在 PostgreSQL 中创建必要的 **"events"** 表后,至关重要的是要验证一切是否正常运行,例如,MinIO 是否在指定 Bucket 上执行操作(如 PUT、GET、DELETE)时正确地将事件数据发送到 PostgreSQL。

让我们确认事件数据是否按预期记录。

首先,创建一个应该触发事件通知的场景。例如,将文件上传到您为通知设置的 MinIO Bucket。此操作应生成一个将发送到 PostgreSQL 数据库的事件。

创建“sample.txt”文件并将其复制到“myminio/test”Bucket。

echo "Sample Content" > sample.txt
mc cp sample.txt myminio/test/

使用“exit”退出“docker exec”交互式 Shell。

exit

使用“docker exec postgres”连接到您的 PostgreSQL 容器,以使用 psql 查询events表。

docker exec postgres psql -U myuser -d postgres -c "SELECT * FROM events;"

此 SQL 命令将显示 **"events"** 表的内容。查找与文件上传事件相对应的最近条目。输出应显示一行,其中包含有关您在 MinIO 中触发的事件的详细信息。检查 **"test/sample.txt"**、**"eventName"**、**"bucket"**、**"object"**、**"key"** 等字段,以及确认事件已正确记录的任何其他相关详细信息。如果您看到预期的数据,则确认 MinIO 正成功地将事件通知发送到 PostgreSQL。

如果在 PostgreSQL 表中没有看到预期的事件数据,请确保 MinIO Bucket 事件通知已正确设置,PostgreSQL 表架构与 MinIO 发送的架构匹配,并且 MinIO 和 PostgreSQL 之间的网络连接正常工作。

通过遵循这些步骤,您可以有效地验证 MinIO 与 PostgreSQL 的集成是否按预期工作。此过程对于确保您的数据事件管理准确可靠至关重要。

数据事件和数据管理

设置和利用 MinIO 和 PostgreSQL 集成的过程展示了 MinIO 在处理云存储和数据管理方面的稳健性和多功能性。无论是通过 MinIO UI 的图形化简易性,还是通过 mc CLI 提供的全面控制,MinIO 都确保您的数据管理策略不仅高效,而且与 PostgreSQL 等现代数据库解决方案无缝集成。

在您继续探索 MinIO 的功能时,请记住,系统的灵活性旨在满足各种用例和场景。对于那些希望深入了解技术细节或探索更高级配置的人员,MinIO 文档中的 Bucket 通知和监视 Bucket 和对象事件是一个宝贵的资源。利用 MinIO 和 PostgreSQL 的强大功能来增强您的云存储解决方案和数据管理实践。

祝您在项目中顺利实施这些策略,请记住,MinIO 团队始终在支持您在数据事件管理方面的旅程!