对象存储实践:创建可靠的数据存储

在我之前的文章中,我们了解了对象存储的“为什么”和“是什么”。具体来说,我们了解了为什么需要新的存储模式,以及它如何缓解现代非结构化数据问题。我们看到了对象存储如何通过简单的 HTTP(s) API 调用在应用程序层访问对象,并消除了传统方式处理文件带来的开销。让我们以一个现实生活中的用例为例,看看对象存储如何帮助确保您的应用程序的非结构化数据以易于获取、资源轻量级且可靠的方式存储。
用例
WordPress 是使用最广泛的内容管理平台之一。根据维基百科,超过 6000 万人使用 WordPress 托管他们的网站或博客,大约 24% 的互联网前 1000 万个网站基于 WordPress。自然地,WordPress 网站是数百万图像和视频的归宿——以其最原始形式存在的非结构化数据。
目前,如果您有自己的 WordPress 安装,并且您使用的是开箱即用的 WordPress,所有图像、视频等都存储在服务器文件系统上的一个文件夹中。如果您只有少量图像并预期只有少数访问者,这可能还可以。但是,随着网站的增长,您添加了新的帖子(每个帖子通常包含多个视频和/或图像),服务器文件系统会填满,有时甚至会减慢整个系统速度。
如果我们可以像我们通常将 Web 服务器和数据库服务器分开一样,将文件存储和 Web 服务器分开,它将使您免受服务器故障、数据备份和其他与数据管理相关的开销的困扰。

因此,这里的用例是覆盖默认的 WordPress 文件上传过程。这样,您就可以使用 putObject() 将上传的文件存储到对象存储中,而不是通常的保存到文件系统中。稍后,当需要检索文件时,可以使用 getObject() 获取文件。通过这种方式,您可以抽象出存储细节,并专注于保持 Web 服务器的运行。
架构
上面的用例过于简化地描述了如何简单地将文件放入和从对象服务器获取文件。实际上,事情要复杂得多。应用程序需要文件元数据才能对文件有一定的了解。元数据通常是一小块结构化数据,即预定义的一组字段,例如作者、上传时间戳、文件类型、文件 ID 等等。元数据的结构化性质使其成为存储在数据库中的理想选择。
因此,文件位于对象存储中,元数据进入数据库。以下是其一般工作原理——当应用程序需要上传文件时,它会创建元数据并将其存储到数据库中,并同时将文件放到对象存储中。稍后,当需要该文件时,应用程序会查询数据库以获取元数据,然后根据可用信息获取该文件。

回到 WordPress,它也不例外,它使用类似的基于元数据的文件处理,即使文件存储在服务器的文件系统中。上传到 WordPress 的每个文件都被视为一个帖子,并为此分配一个 ID。此外,还有几个字段,例如作者、编辑日期、标题等等,这些字段会在将文件上传到 WordPress 时更新。具体来说,wp_posts 和 wp_postmeta 表会更新。
继续我们的计划,在我们的 WordPress 安装中使用对象存储而不是文件系统存储,保持文件的元数据方面不变是有意义的。我们只需要覆盖文件在本地磁盘上的物理存储和检索部分。
实现
有了所有这些分析,让我们尝试了解如何创建一个 WordPress 插件来覆盖文件上传过程。该插件应该确保将文件上传到对象存储服务器,而元数据的创建和存储保持不变。对于那些不熟悉的人来说,WordPress 通过插件提供了极大的灵活性,您可以轻松地使用您的插件代码扩展或修改功能。这里 是一个关于如何创建一个插件的详细教程。
首先,您需要调用 add_action() WordPress 方法。此方法可帮助您在发生特定事件时触发(来自您的插件的)PHP 函数。WordPress 为插件开发者提供了 多个事件,可用作钩子来触发特定函数。我现在使用了 admin_init 钩子。随着您对插件所需的不同功能以及与其相关的各种钩子的掌握,您可以添加其他钩子。
add_action( ‘admin_init’, ‘wp_minio’ );
正如您所料,wp_minio() 是将被触发的函数。让我们看看它应该是什么样子。首先,我们将使用 minio-js 库来调用 Minio fPutObject() API。为此,我们可以从 wp_minio() 中调用一个 .js 文件,并将文件路径和文件名(正在上传的文件)作为参数传递。
$execution_cmd = node fput-object.js ‘.$file_location.’ ‘.$file_name.’ ;
fput-object.js 文件应该处理传递的参数,并使用所需的参数调用 fPutObject() API。在这里了解更多 有关 fPutObject() API 的信息。这会将文件上传到您的对象存储服务器。接下来是创建文件元数据、将其保存到 WordPress 数据库以及创建文件缩略图的常规过程。但是,所有这一切都不是什么新鲜事,WordPress 已经可以做到。您可以参考 源代码 来查看它是如何完成的。
下一部分是确保在 WordPress 的正常运行过程中可以访问来自对象服务器的文件。为此,我们可以通过将对象服务器端点名称、存储桶名称和文件名(假设对象的权限至少设置为 经过身份验证的用户)连接起来来构造文件 URL。您可以使用 API listBuckets() 获取存储桶名称,并从 WordPress 数据库获取文件名。 只需将这些与端点连接起来即可创建 URL,让 WordPress 可以无缝地访问文件。
结论
应用程序开发人员的主要关注点之一是将所有上传到其应用程序的文件放到哪里。到目前为止,这通常是服务器文件系统上的一个文件夹。通过使用开源对象存储,上传和检索文件就像简单的 API 调用一样简单。在这篇文章中,我们看到了如何实现对象存储,并将元数据与之一起存储,以创建一种稳健的文件存储机制,该机制易于扩展和管理,并能长期使用。
如果您已经在您的应用程序中使用对象存储或计划这样做,以及如何使用它,我们很想了解您的想法,请在评论区告诉我们!