利用对象存储管理企业遗留数据

Leveraging Object Storage for Enterprise Legacy Data

MinIO 以速度和弹性为首要目标构建,无论您选择在何种环境中运行它。无论是多云、裸机、云实例,还是本地部署,MinIO 都设计为可在 AWS、GCP、Azure、共址裸机服务器和 Kubernetes 发行版(如 Red Hat OpenShift)上运行。MinIO 在开发人员笔记本电脑上的运行效果与在商品服务器上一样出色。

话虽如此,但并非所有环境都是平等的。在之前的博文中,我们讨论了使用哪种最佳驱动器组合才能获得最佳性能和容量,我们还展示了如何在总体上设计和构建您的硬件以部署 MinIO,并且很快将在未来的博文中详细介绍如何根据您尝试部署的应用程序调整硬件并配置性能设置,以便您物尽其用。

今天,我们将重点介绍如何利用 MinIO 支持企业传统数据。在大型银行和零售商中,每天都会发生数十亿计的交易,并非所有内容都存储在使用现代协议的最新系统上。很多时候,由于各种原因,他们需要继续使用这些传统系统。

为什么有人希望传统数据也存在于现代的云原生对象存储中?为什么不只是将传统数据归档到一些磁带或 HDD 上,而只将新数据保存到对象存储中?因为访问数据就是力量——同时他们需要维护一个用于运营事务的系统,并在内部共享有价值的信息,用于 KubeFlow 的 AI/ML 训练、Power BI 或 Dremio 等分析和报告,以及大量 21 世纪云原生应用程序。

MinIO 使共享传统数据变得更容易,提供了连接传统系统与 MinIO 并利用数据为其他现代应用程序提供服务的功能和集成?我们可以使用多种工具和协议将 MinIO 与传统系统连接起来,尽管它们各自在性能、安全或弹性方面都存在一些注意事项。

MinIO 基于此理念构建的原因是,我们相信未来是云原生的——包括本地裸机和 Kubernetes。我们希望确保不会因为数据不符合最新技术的标准而被遗忘。正如我们很快就会发现的那样,它们陷入了需要传统应用程序进行操作的世界,但它们希望使用云原生软件及其数据。在这些情况下,MinIO 是 Microsoft Windows 和办公生产力应用程序以及大型机数据的完美伴侣。一旦数据位于具有行业领先性能和可扩展性的后端,它就可以公开给业务所需的云原生分析、AI/ML 和自定义应用程序。MinIO 的性能让每个数据密集型工作负载触手可及。MinIO 能够实现惊人的性能——最近的基准测试 在仅使用 32 个现成的 NVMe SSD 节点的 GET 上实现了 325 GiB/s(349 GB/s),在 PUT 上实现了 165 GiB/s(177 GB/s)。

让我们开始在 MinIO 和 Microsoft Windows 之间以及 MinIO 和大型机之间来回传输数据,包括了解我们在此过程中使用的工具。

设置 MinIO

在我们能够连接到这些资源之前,我们需要一个 MinIO 实例。这可能是已经运行的实例,或者我们可以使用以下步骤快速设置一个实例。更详细的步骤可以在文档中找到。

为了尽可能简单,我们将使用 4 个磁盘启动一个 MinIO 节点。MinIO 可以在任何地方运行——物理机、虚拟机或容器——在本概述中,我们将使用 Docker 创建的容器。

对于这 4 个磁盘,请在主机上为 minio 创建目录

mkdir -p /home/aj/minio/disk-1 \
mkdir -p /home/aj/minio/disk-2 \
mkdir -p /home/aj/minio/disk-3 \
mkdir -p /home/aj/minio/disk-4

使用以下规范启动 MinIO 节点的 Docker 容器

docker run -d \
  -p 20091:9001 \
  -v /home/aj/minio/disk-1:/mnt/disk1 \
  -v /home/aj/minio/disk-2:/mnt/disk2 \
  -v /home/aj/minio/disk-3:/mnt/disk3 \
  -v /home/aj/minio/disk-4:/mnt/disk4 \
  --name minio \
  --hostname minio \
  quay.io/minio/minio server http://minio/mnt/disk{1...4}/minio --console-address ":9001"

以上命令将在 Docker 中启动一个 MinIO 服务,控制台端口在主机上监听 `20091`。它还会将我们创建的本地目录作为卷挂载到容器中,MinIO 将在此处存储数据。您可以通过 `http://localhost:20091` 访问您的 MinIO 服务。

状态:        4 在线, 0 离线。
API: http://172.20.0.2:9000  http://127.0.0.1:9000

控制台: http://172.20.0.2:9001 http://127.0.0.1:9001

文档: https://docs.min.io

如果您看到 `4 在线`,则表示您已成功设置了具有 4 个驱动器的 MinIO 节点。

转到浏览器,使用 `http://localhost:20091` 加载 MinIO 控制台,使用 `minioadmin` 作为用户名和密码登录。单击“创建存储桶”按钮并创建 `testbucket123`。

现在我们拥有了将其他系统连接到 MinIO 并来回传输数据的必要构建块。请确保您的 Windows 系统可以通过从 Windows 计算机上的浏览器访问 MinIO 控制台来与您设置的 MinIO 实例(无论是在 Docker、K8s 还是裸机上)进行通信。

如何在 MinIO 和 Windows 之间传输数据

WinS3FS

让我们从 Windows 计算机连接到 MinIO。我们可以通过两种方式做到这一点。第一种是使用名为 WinS3FS 的实用程序,然后使用 rClone,我们将向您展示如何使用两者。

继续安装 来自 Sourceforge 的 WinS3FS

安装完成后,在状态栏底部单击 WinS3FS 图标,然后使用用于登录 MinIO 控制台的凭据和创建的存储桶单击“添加存储桶”。

添加 MinIO 存储桶后,使用命令 `dir \\s3\testbucket123` 列出存储桶挂载点的内容。

您还可以查看类似于以下内容的 Windows Samba 客户端 (SMB) GUI 上的存储桶内容

接下来,让我们讨论 rClone 方法。

rClone

坦率地说,WinS3FS 可以完成工作,但有点过时,并且存在一些性能问题。如果您要来回发送几 KB 的文件或数据,它会做得很好。但是,当您开始添加 GB 甚至 TB 级别的数据时,您会注意到它很快就会崩溃。

已经开发了其他工具来解决此问题,其中一个主要工具是 rClone。rClone 多方面,因为它不仅会集成 S3,还会集成任何与 S3 兼容的存储,例如 MinIO,因此让我们开始吧。

继续 下载 Windows 版 rClone。

rClone 没有任何 GUI,因此继续打开 PowerShell 并运行以下命令

创建一个名为 rClone 的目录来存储 rclone.exe 和其他相关文件。

mkdir c:\rclone

接下来,让我们进入该目录下载并提取二进制文件

cd c:\rclone
Invoke-WebRequest -Uri “https://downloads.rclone.org/v1.51.0/rclone-v1.51.0-windows-amd64.zip” -OutFile “c:\rclone\rclone.zip”
Expand-Archive -path ‘c:\rclone\rclone.zip’ -destinationpath ‘.\’

在将文件提取到 `C:\rclone\rclone-v1.51.0-windows-amd64` 位置后,继续复制 `rclone.exe` 并以配置模式运行它。

cp C:\rclone\rclone-v1.51.0-windows-amd64\*.* C:\rclone\
.\rclone.exe config

完成整个配置过程,在此过程中,它将提示您输入 MinIO 服务器 URL、访问密钥和密钥,以及其他信息,例如加密设置。请务必仔细阅读并选择适合您配置的内容。配置完成后,按 `q` 退出并返回命令行。

在提示符下键入 `.\rclone.exe lsd testbucket123` 以查看存储桶列表。

那么两者之间哪个更好?为了简单起见,我建议使用 rClone,因为您可以从 CLI 执行所有操作,但如果您更习惯使用 GUI,那么 WinS3FS 可能是您的选择,尤其是在您主要处理仅值几 KB 的小文件时。

如何从大型机传输数据到 MinIO

那些比在 Windows 上运行的应用程序更旧的系统上的应用程序如何存储数据呢?

是的,我们说的是大型机。在旧的 VMX、IBM 和其他大型机上,数据存储的格式不适合直接复制粘贴文件以使用它们。数据在大多数情况下是流式传输的,如果要将其存储为对象,则需要将 VSAM/QSAM 文件中的数据转换为顺序 固定长度 文件,然后才能将其传输到 MinIO 存储桶。

转换完成后,如何实际传输文件?您是否将文件从大型机本地复制到笔记本电脑,然后从笔记本电脑上传到 MinIO 存储桶?如果只有几个文件,每个文件只有几 KB,这当然可以。但是,如果您必须移动数百个大型文件,价值数 TB 甚至许多小文件,那么以这种迂回的方式完成将是一项艰巨的任务。

安全文件传输协议 (FTP/SFTP)

值得庆幸的是,每个大型机系统都配备了一种至今仍然普遍存在的遗留协议,即 FTP/SFTP。大型机通常具有 FTP 客户端,您可以连接到其他 FTP 服务器以传输数据。但是,如果您有 MinIO(它不是 FTP 服务器),它有什么用呢?还是有?

算是吧。为了尽可能兼容,我们开发了一个功能,使您能够 将 MinIO 作为 FTP 和 SFTP 服务器启动。这实际上允许 MinIO 在其自己的独立端口上充当 FTP 和 SFTP 服务器,以便任何 sFTP 客户端都能像连接到任何其他 sFTP 服务器一样连接到 MinIO。大型机对此一无所知,它们不知道它们连接到的 sFTP 服务器实际上是一个存储桶,通过 S3 API 为云原生应用程序提供数据。通过 FTP 上传的对象可以通过 S3 API 访问。

我们在 之前的博文中 详细介绍了如何设置此功能,但简而言之,您需要做的就是在启动 MinIO 服务器时添加一些与 FTP 相关的额外参数。

minio server http://server{1...4}/disk{1...4}
--ftp="address=:8021" --ftp="passive-port-range=30000-40000" \
--sftp="address=:8022" --sftp="ssh-private-key=/home/miniouser/.ssh/id_rsa"
...
...

使用上述参数启动服务器后,您可以像连接任何其他FTP服务器一样连接到它。

ftp localhost -P 8021
Connected to localhost.
220 Welcome to MinIO FTP Server
Name (localhost:user): minioadmin
331 User name ok, password required
Password:
230 Password ok, continue
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls runner/
229 Entering Extended Passive Mode (|||39155|)
150 Opening ASCII mode data connection for file list
drwxrwxrwx 1 nobody nobody            0 Jan  1 00:00 chunkdocs/
drwxrwxrwx 1 nobody nobody            0 Jan  1 00:00 testdir/
...

就像您熟悉并喜爱的传统FTP一样,只是端点是云原生且软件定义的。

软件开发工具包 (SDK)

对于遗留应用程序,很多时候无法修改现有代码库以添加新功能。因此,大多数遗留应用程序因其依赖项的限制而被困在时间中。但是,如果我们不提及MinIO提供的各种SDK选项,那将是不公平的,这也不是一篇完整的博文。我们推荐使用我们的SDK而不是迄今为止我们讨论的其他选项的原因是,您可以直接将您的应用程序与MinIO集成,而无需任何可能影响其性能和潜在安全性的中间应用程序或协议。

MinIO软件开发工具包支持多种语言,但在这种情况下可能感兴趣的语言可能是.NETJavaPython。我们从列表中提到这些语言是因为通常Windows系统和大型机支持这些语言。也就是说,与使用其他服务相比,使用SDK本地集成某些内容需要付出更多努力。但为了能够在您的代码库中以线速本地处理遗留数据,并完全控制它,增加的努力是值得的。

以下是如何使用我们的Python SDK将Kafka消息馈送到MinIO存储桶的简单示例。

我们将导入以下pip包,请确保已安装这些包。

root@ubuntu:/# pip3 install minio kafka-python

from minio import Minio
import urllib3

from kafka import KafkaConsumer
import json

配置要连接到的Kafka代理以及要订阅的主题

consumer = KafkaConsumer(
  bootstrap_servers=config["kafka_servers"],
  value_deserializer = lambda v: json.loads(v.decode('ascii'))
)

consumer.subscribe(topics=config["kafka_topic"])

当您停止使用者时,通常会输出堆栈跟踪,因为使用者旨在永远运行以使用消息。这将允许我们干净地退出使用者

try:
  print("Ctrl+C to stop Consumer\n")


… [已截断]


except KeyboardInterrupt:
  print("\nConsumer stopped.")

  • 如前所述,我们将持续等待,侦听主题上的新消息。一旦我们获得主题,我们将将其分解成三个组件
  • request_type:HTTP请求的类型:GET、PUT、HEAD
  • bucket_name:添加新对象的目标存储桶名称
  • object_path:在存储桶中添加对象的完整路径

  for 消息 in consumer:
    message_from_topic = message.value

    request_type = message_from_topic["EventName"]
    bucket_name, object_path = message_from_topic["Key"].split("/", 1)

  • 每次您发出任何请求时,MinIO 都会向主题添加一条消息,该消息将由我们的 minio_consumer.py 脚本读取。因此,为了避免无限循环,我们只在添加新对象时进行处理,在本例中为 PUT 请求类型。

if request_type == "s3:ObjectCreated:Put":
      minio_client.fget_object(bucket_name, object_path, object_path)

在这里,您可以添加您的自定义代码来构建机器学习模型、调整图像大小以及处理 ETL/ELT 作业。

      print("- 对 %s 执行一些伪图像调整大小或机器学习处理" % object_path)

对象处理完成后,它将上传到我们之前配置的目标存储桶。如果存储桶不存在,则我们的脚本将自动创建它。

minio_client.fput_object(config["dest_bucket"], object_path, object_path)
      print("- 已将处理后的对象 '%s' 上传到目标存储桶 '%s'" % (object_path, config["dest_bucket"]))

就是这样。除了几行样板代码之外,我们基本上做了两件事

  • 侦听 Kafka 主题上的消息
  • 将对象放入 MinIO 存储桶

该脚本并不完美,只是一个示例,让您了解 SDK 的可能性——您需要添加一些额外的错误处理,但这非常简单。有关更多详细信息,请访问我们的 MinIO Python SDK 文档

并非所有道路通罗马

话虽如此,请注意,以上所有解决方案,在宏观层面上,仅仅是“权宜之计”。正如我们在 对象存储上的文件系统是个坏主意 博客文章中提到的,无论您的 MinIO 后端有多快,当您使用 WinS3FS、rClone、文件系统挂载等中间组件时,它不可避免地会降低系统的整体性能。吞吐量也将受网络限制,甚至降低到网络中的最大瓶颈,无论是交换机、电缆、网卡还是两者之间的其他应用程序。但在短期内,您需要将大量来自遗留系统的数据公开给您想要快速使用的云原生分析和 AI/ML 应用程序。

那么 MinIO 的方法是什么?我们的建议是使用我们的 MinIO SDK 开发与应用程序其余部分的紧密集成,而不会牺牲性能和弹性。如果您有任何关于集成和使用 MinIO SDK 的问题,请在 Slack 上联系我们!