天天看点

Ambry:LinkedIn开源的可扩展分布式对象存储系统

作者:虫虫安全

在云时代,各个云厂商普遍使用块的对象存储来进行各种文件对象,比如图片或者视频等。大家比较熟悉的可能有Amazon S3,Facebook的f4,推特的Blobstore等。

Ambry:LinkedIn开源的可扩展分布式对象存储系统

今天虫虫给大家介绍一个开源的,同时也是一个大厂的分布式对象存储产品, LinkedIn的Ambry存储系统。

概述

Ambry设计的目标是使用全局分布式存储和计算资源,提供高吞吐量、低延迟的块存储操作。Ambry在LinkedIn 内部使用,支撑拥有数亿用户的业务超过120 TB共享。为了达到这个规模,团队必须解决几个挑战,包括对象大小的广泛差异、快速增长和不可预测的读取工作负载等。

高可用性和水平可扩展性

Ambry 是一个高可用并且最终一致的系统。在大多数情况下,写入会写入本地数据中心,然后异步复制到其他数据中心。这确保在网络分区下,写入本地数据中心仍然可用。此外,当一台机器在本地不可用时,Ambry会选择同一数据中心内另一台机器上的另一个副本来读取或写入数据。对于读取,当数据不存在于本地数据中心时,它会将请求代理到具有blob的数据中心。当然,所有这些都是可配置的。

低运营开销

Ambry 的一个关键设计目标是使集群的操作变得非常容易。该系统是完全去中心化的,并配备了管理集群所需的所有工具。此外,大部分操作将在软件内自动进行,以确保维护集群所需的手动工作量非常少。

低MTTR(平均修复时间)

这对于分布式系统来说非常重要。机器停机、磁盘故障、服务器崩溃和 GC 停止进程。所有这些故障在分布式系统中都是完全可以接受的故障。然而,关键是要在很短的时间内解决问题。在所有情况下,系统在维修期间都可以使用。 但是,保持较低的MTTR仍然很重要。

双交叉DC

默认情况下,Ambry 支持主动主动设置。这意味着对象可以写入任何数据中心的同一分区,也可以从任何其他数据中心读取。这通常不是许多系统提供的通用功能。Ambry 通过复制以及在需要时将请求代理到远程数据中心来实现这一点。

适用于大型和小型媒体对象

大多数媒体流量由数万亿个小对象和数十亿个大对象组成。系统需要为这种混合工作负载正常运行。在Ambry中实现这一点的方式是将所有对象的写入合并到一个顺序日志中。这确保所有写入都是批处理并异步刷新,并且磁盘上的碎片非常少。

成本效益

最后,任何对象存储都需要长期存储媒体和数据类型。 随着时间的推移,较旧的数据会变冷并且读取QPS非常低。此外,对象通常很大并且占用大量空间。 设计应该能够启用JBOD,支持硬盘并将空间放大保持在最低限度。

架构

Blob和分区

Ambry 的核心抽象是blob块,一种用于存储数据的不可变结构。每个blob都分配给磁盘上的一个分区并通过blob ID进行引用。系统的用户通过执行put, get 和delete操作。

Ambry:LinkedIn开源的可扩展分布式对象存储系统

数据分区设计可以自由扩展——当用户向系统添加更多数据时,它可以添加更多分区。默认情况下,新分区是可读写的 (意味着它同时接受 put, get,和 delete流量)。当分区接近容量时,它会转换为只读,这意味着它不再支持通过以下方式存储新的blob put操作。系统的流量往往以更新的内容为目标,从而给读写分区带来更高的负载。

为了提供对blob 的可扩展读写访问,Ambry使用了三个高级组件:集群管理器(Cluster Managers)、前端层(Frontend Layer)和 数据节点(Datanodes)。

Ambry:LinkedIn开源的可扩展分布式对象存储系统

集群管理器

集群管理器决定如何跨地理分布式数据中心将数据存储在系统中,以及存储集群的状态,状态主要存储在Zookeeper中。例如,它们存储Ambry部署的逻辑布局,包括分区可读写还是只读,以及分区在数据中心磁盘上的位置。

Ambry:LinkedIn开源的可扩展分布式对象存储系统

前端层

前端层由无状态服务器组成,每个服务器都从集群管理器中提取配置。这些服务器主要响应用户请求,它们的无状态特性简化了扩展——可以将任意数量的新服务器添加到前端层以响应不断增加的负载。除了处理请求,前端层还执行安全检查并将数据记录到LinkedIn的变更数据捕获系统更改数据捕获或事件源 是一种记录状态更改的方式,供下游服务出于任意目的使用/重放,例如复制到辅助数据源。

通过前端层结合,将请求路由到数据节点,例如:提供的状态将集群管理器 与处理高级功能的路由库相

从多个分区中获取大型“分块”文件并组合结果(每个分块都分配有一个 ID,并映射到存储在分区中的唯一标识的blob)。

获取某些分区时对数据节点进行故障检测。

遵循重试策略以在失败时获取数据。

Ambry:LinkedIn开源的可扩展分布式对象存储系统
Ambry:LinkedIn开源的可扩展分布式对象存储系统

数据节点

Datanodes通过使用几个性能增强功能来实现对存储在内存(或磁盘中的内容的低延迟访问。为了能够快速访问blob,数据节点存储一个索引,将blob ID 映射到它们在存储介质中的偏移量。当有操作更新blob的状态时,数据节点更新此索引。当响应传入查询时,datanodes根据该索引来查找blob的状态。

Ambry:LinkedIn开源的可扩展分布式对象存储系统

为了最大化存储在磁盘缓存中的blob数量,Ambry还优化了索引本身的存储方式,将索引中较旧的条目分页到磁盘等。系统还引入SSTables,Cassandra来存储和压缩索引。Datanodes还依赖于其他技巧,例如零复制操作这限制了不必要的内存操作。 .

基本操作

从客户端接收到操作时当前端层,服务器的路由库帮助联系正确的分区:

在put操作中,分区是随机选择的(出于数据平衡的目的),在get/delete 操作中,分区是从blob id 中提取的。

Ambry:LinkedIn开源的可扩展分布式对象存储系统

为了put操作,Ambry可以配置为同步复制(确保 blob 在返回之前出现在多个数据节点上),或异步复制-同步复制可防止数据丢失,但会在写入路径上引入更高的延迟。

如果在异步配置中设置,分区交换日志的副本存储blob及其在存储中的偏移量。 核对这些日志之后,彼此之间再同步传递blob。

Ambry:LinkedIn开源的可扩展分布式对象存储系统

性能评测

根据评测报告本文评估了两个主要领域:吞吐量和延迟 ,以及地理分布式操作。

为了测试系统的吞吐量和延迟(对于大规模面向用户的低成本服务至关重要),不同大小对象的读写流量发送到Ambry。该系统能够为较大对象的读/写提供接近等效的性能,但在许多小的读/写操作中达到较低的性能限制。

Ambry:LinkedIn开源的可扩展分布式对象存储系统
Ambry:LinkedIn开源的可扩展分布式对象存储系统

为了评估地理分布式操作和复制,本文测量了它所需的带宽和时间,发现两者几乎可以忽略不计:

在85%的情况下,复制滞后是不存在的。

复制blo的带宽很小 (10MB/s),但数据中心间通信的带宽更高。

Ambry:LinkedIn开源的可扩展分布式对象存储系统

结论

与其他对象存储,Ambry作为开源的实现,其设计使用全局分布式存储和计算资源,提供高吞吐量、低延迟的块存储操作。可是实现大规模系统下的存储系统,包括对象大小的广泛差异、快速增长和不可预测的读取等特殊情况子啊工作负载。

继续阅读