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

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

在我以前的文章中,我们了解了对象存储的原因和内容。具体来说,我们了解了为什么需要一个新的存储范例,以及它如何缓解现代的非结构化数据问题。我们看到了对象存储如何使您能够通过HTTP上的简单API调用访问应用程序层的对象,并消除了以传统方式处理文件的开销。让我们以现实生活中的用例为例,了解对象存储如何帮助确保以易于获取,资源节约和可靠的方式存储应用程序的非结构化数据。

用例

WordPress是最常用的内容管理平台之一。根据Wikipedia,超过6,000万人使用WordPress托管其网站或博客,并且Internet上前1000万个网站中约有24%基于WordPress。自然,WordPress网站是数以百万计的图像和视频的存放地-最原始形式的非结构化数据。

当前,如果您有自己的WordPress安装,并且开箱即用地使用WordPress,则所有图像,视频等都存储在服务器文件系统上的文件夹中。如果您有几张图片并且期望访问者很少,这可能是可以的。但是随着站点的增长和您添加新帖子(每个帖子通常都包含多个视频和/或图像),服务器文件系统已满,有时甚至会使整个系统变慢。

如果我们可以将文件存储和Web服务器分开,就像通常将Web服务器和数据库服务器分开一样,它将使您免于服务器故障,数据备份以及其他与管理数据有关的开销。


1_BxTT6Iz8RfhhxTUcz64GZA.jpeg
WordPress存储用例


因此,这里的用例是覆盖默认的WordPress文件上传过程。因此,调用putObject()而不是通常的保存到文件系统,可以将上传的文件存储在对象存储中。稍后,当需要检索文件时,getObject()可以获取文件。这样,您可以抽象出存储详细信息,并专注于保持Web服务器运行。

建筑

上面的用例过于简单地说明了如何简单地从对象服务器放置文件以及从对象服务器获取文件。实际上,事情要复杂一些。应用程序需要文件元数据才能对文件有所了解。元数据通常是一小部分结构化数据,即预定义的字段集,例如作者,上载的时间戳,文件类型,文件ID等。元数据的结构化性质意味着将其存储在数据库中是一个很好的选择。

因此,文件位于对象存储中,元数据进入数据库。这就是它通常的工作方式-当应用程序需要上传文件时,它会创建元数据并将其存储到数据库,以及将文件放置到对象存储中。稍后,当需要文件时,应用程序会在数据库中查询元数据,并根据可用信息获取文件。


1_e6P3ix2wdsQJb7tFZG-LcQ.jpeg
上载文件时更新WordPress数据库表。图片来源:<a href="https://codex.wordpress.org/Database_Description" data-href="https://codex.wordpress.org/Database_Description" class="markup--anchor markup--figure-anchor" rel="nofollow noopener" target="_blank" style="-webkit-font-smoothing: antialiased; box-sizing: border-box; text-decoration-line: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0.54); background-repeat: repeat-x; background-image: url("data:image/svg+xml;utf8,"); background-size: 1px 1px; background-position: 0px calc(1em + 1px);">//codex.wordpress.org/Database_Description


回到WordPress,这也不例外,即使文件存储在服务器的文件系统中,它也使用类似的基于元数据的文件处理。每个上传到WordPress的文件都被视为帖子,并为其分配了ID。此外,当将文件上传到WordPress时,还会更新多个字段,例如作者,编辑日期,标题等。具体而言,表wp_postswp_postmeta被更新。

继续我们在WordPress安装中使用对象存储而不是文件系统存储的计划,保持文件的元数据方面不变是有意义的。我们将只覆盖物理上存储文件和从本地磁盘检索文件的部分。

实施

借助所有分析,让我们尝试了解如何创建WordPress插件以覆盖文件上传过程。插件应确保将文件上传到对象存储服务器,而元数据的创建和存储保持不变。对于没有经验的人,WordPress通过插件提供了很大的灵活性,您可以使用插件代码轻松扩展或修改功能。是如何创建一个详细的教程。

首先,您需要调用add_action() WordPress方法。当特定事件发生时,此方法可帮助您触发PHP函数(通过插件)。WordPress为插件开发人员提供了多个事件这些事件可用作挂钩来触发特定功能。我现在已经使用了admin_init钩子。当您掌握了插件所需的不同功能以及与之相关的各种挂钩之后,可以添加其他挂钩。

add_action('admin_init','wp_minio');

如您所料,wp_minio()是将被触发的函数。让我们看看它应该是什么样子。首先,我们将使用minio-js库来调用Minio fPutObject() API。为此,我们可以调用.js文件,其文件路径和文件名(要上传的文件名)是wp_minio()的参数

$ execution_cmd =节点fput-object.js'。$ file_location。' '。$ file_name。' ;

fput-object.js文件应处理传递的参数,并使用必需的参数调用fPutObject() API。在此处阅读有关fPutObject() API的更多信息这会将文件上传到您的对象存储服务器。接下来是创建文件元数据,将其保存到WordPress数据库以及创建文件缩略图的常规过程。但是所有这些都不是新鲜事,WordPress已经做到了。您可以参考源代码以查看完成情况。

下一部分是确保在WordPress正常运行期间可以访问对象服务器中的文件。为此,我们可以通过连接对象服务器端点名称,存储桶名称和文件名(给定对象权限至少设置为经过身份验证的用户来框架文件URL 您可以使用API listBuckets()和WordPress数据库中的文件名获取存储桶名称 只需将它们与端点连接起来即可创建URL,并让WordPress无缝访问文件。

结论

应用程序开发人员最关心的问题之一是他们在哪里转储所有上传到其应用程序的文件。到目前为止,这通常是服务器文件系统上的文件夹。借助开放源代码对象存储,上传和检索文件就像简单的API调用一样容易。在这篇文章中,我们看到了如何使用串联存储的元数据来实现对象存储,以创建一个健壮的文件存储机制,该机制易于长期扩展和管理。

我们很想知道您是否已经在应用程序中使用对象存储或计划使用对象存储以及如何使用对象存储,请在评论部分告知我们!


上一篇 下一篇