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