介绍
灵活和可扩展的数据存储是使用现代技术和工具开发的大多数应用程序和服务的基准要求。 无论存储大量或少量的图像,视频或文本块,应用程序开发人员都需要一个用于存储和检索用户生成的内容,日志,备份等的解决方案。
随着今天复杂的部署,容器和短暂的基础设施,在单个服务器上简单地将文件保存到磁盘的日子已经过去了。 云提供商已经开发出了满足现代应用程序部署的存储需求的服务,它们主要分为两类:对象存储和块存储。
我们来看看这两个,并讨论一般的优点,缺点和用例。
什么是块存储
块存储服务比较简单和熟悉。 它们通过网络提供传统的块存储设备(如硬盘驱动器)。 云提供商通常具有可以提供任何大小的块存储设备并将其附加到虚拟机的产品。
从那里,你会像普通磁盘那样对待它。 您可以使用文件系统进行格式化,并将文件存储在其上,将多个设备组合到RAID阵列中,或者将数据库配置为直接写入块设备,从而完全避免文件系统开销。 另外,网络连接的块存储设备通常比一般的硬盘驱动器有一些独特的优势:
- 您可以轻松地将整个设备的实时快照用于备份
- 块存储设备可以调整大小以适应日益增长的需求
- 您可以轻松地在机器之间拆卸和移动块存储设备
这是一个非常灵活的设置,可用于大多数任何应用程序。 我们来总结一下这个技术的一些优点和缺点。
块存储的一些优点是:
- 块存储是一个熟悉的范例。 人们和软件几乎普遍地理解和支持文件和文件系统
- 块设备得到很好的支持。 每种编程语言都可以轻松地读取和写入文件
- 文件系统权限和访问控制是熟悉和理解的
- 块存储设备提供低延迟IO,因此它们适合数据库使用。
块存储的缺点是:
- 存储一次绑定到一个服务器
- 块和文件系统具有有关它们存储的信息块(创建日期,所有者,大小)的有限元数据。 有关您正在存储的任何其他信息都必须在应用程序和数据库级别处理,这对开发人员来说是一个额外的复杂性
- 即使没有使用它,您需要为所有分配的块存储空间付费
- 您只能通过正在运行的服务器访问块存储
- 块存储需要更多的实际工作和设置vs对象存储(文件系统选择,权限,版本控制,备份等)
由于其快速的IO特性,块存储服务非常适合在传统数据库中存储数据。 另外,许多需要正常文件系统存储的旧应用程序将需要使用块存储设备。
如果您的云提供商不提供块存储服务,您可以使用OpenStack Cinder , Ceph或许多NAS设备上可用的内置iSCSI服务运行自己的存储服务。
什么是对象存储
在云计算的现代世界中,对象存储是使用HTTP API存储和检索非结构化的数据和元数据。 使用文件系统将文件分解成块以将其存储在磁盘上,而不是通过网络处理存储的整个对象。 这些对象可以是图像文件,日志,HTML文件或任何自包含的字节。 它们是非结构化的,因为它们没有必要遵循的特定模式或格式。
对象存储起飞,因为它大大简化了开发人员的体验。 由于API由标准HTTP请求组成,因此大多数编程语言都快速开发了库。 保存一个数据块变得像对象存储的HTTP PUT请求一样简单。 检索文件和元数据是一个正常的GET请求。 此外,大多数对象存储服务还可以向用户公开提供文件,从而无需维护Web服务器来托管静态资源。
此外,对象存储服务仅对您使用的存储空间收费(有些还根据HTTP请求和传输带宽收费)。 这对于小型开发人员来说是一个福音,谁可以获得世界级的存储和托管资产的成本与使用规模。
对象存储不是所有情况的正确解决方案。 我们来看一下利弊的总结。
对象存储的一些优点是:
- 一个简单的HTTP API,客户端可用于所有主要操作系统和编程语言
- 一个成本结构,意味着你只需要支付你所使用的费用
- 内置公共服务的静态资产意味着少一点服务器让您自己跑步
- 一些对象商店提供内置的CDN集成,可以缓存您的全球资产,为用户提供更快的下载和页面加载
- 可选版本控制意味着您可以检索旧版本的对象,以从意外覆盖数据中恢复
- 对象存储服务可以轻松地从适度的需求扩展到真正强烈的用例,而开发人员不必启动更多资源或重新构建来处理负载
- 使用对象存储服务意味着您不必维护由服务提供商处理的硬盘驱动器和RAID阵列
- 能够将元数据块存储在数据库中可以进一步简化应用程序体系结构
对象存储的一些缺点是:
- 由于这些服务的高延迟,您无法使用对象存储服务来备份传统的数据库
- 对象存储不允许您仅修改一个数据块,您必须一次读取和写入整个对象。 这有一些性能影响。 例如,在文件系统上,您可以轻松地将一行添加到日志文件的末尾。 在对象存储系统上,您需要检索对象,添加新行,并将整个对象写回。 这使得对象存储对于经常变化的数据来说不那么理想
- 操作系统不能容易地像普通磁盘一样安装对象存储。 有一些客户端和适配器可以帮助这个,但是一般来说,使用和浏览对象存储并不像在文件浏览器中翻转目录一样简单
由于这些属性,对象存储对于托管静态资产非常有用,例如保存用户生成的内容,如图像和动画,存储备份文件和存储日志。
有一些自托管对象存储解决方案,尽管您将放弃托管解决方案的一些优点(例如不必担心硬盘驱动器和扩展问题)。 您可以尝试使用Go语言编写的流行的对象存储服务器Minio ,或Ceph或OpenStack Swift 。
结论
选择存储解决方案可能是开发人员的复杂决策。 在本文中,我们讨论了块和对象存储服务的优缺点。 任何足够复杂的应用程序很可能需要两种类型的存储以满足其所有需求。