Aerospike:入门与实战——Aerospike简介

708 阅读18分钟

Aerospike 是一款分布式 NoSQL 数据库,在读写速度上表现出色,且具备很高的系统可用性。这听起来像是数据库的常见特性,但这并没有全面展现 Aerospike 的能力。

在数据管理行业,我们通常对数据库的能力有一些预设的限制,而 Aerospike 并不受这些限制的约束。即使在 PB 级的数据量上,亚毫秒级的事务速度也是常态,且无需依赖庞大的集群。这一表现完全超出了有经验的数据分析师或数据库管理员的预期。为了充分理解并最大化地利用 Aerospike,你需要暂时放下已有的一些“认知”,以开放的心态来看待这款数据库。

传统上,NoSQL 数据库通常是通过放松一致性保证来实现高性能和高扩展性。然而,对于那些对数据正确性要求极高的应用场景而言,这种权衡往往是不理想的。大多数应用都会涉及某些需要严格正确性和一致性的数据,例如金融数据;同时,也包含一些可以容忍有限一致性偏差的数据,如点击流数据。

Aerospike 在保持高性能的同时也保证了强一致性,这一点已在数百个关键生产环境中得到验证,甚至在典型的硬件和网络故障下也能实现多年的连续正常运行。Aerospike 所实现的强一致性可以满足对记录系统(system of record)依赖的应用所需的严格要求。通过优化使用闪存存储、垂直扩展以充分利用每台服务器实例的硬件,并通过分布式集群算法实现出色的水平扩展,Aerospike 在较少硬件的情况下达成了高性能。

在本书的其余部分,我们假设你对数据、数据库及其操作有一定的工作经验。书中将专注于 Aerospike 的独特之处,以及它与其他数据库的不同之处,以便你能充分利用其优势。

Aerospike 的独特之处

强一致性即便在大规模数据下也能保持高效

虽然 Aerospike 与其他数据库之间有许多显著的差异,但无论数据规模如何,Aerospike 都能够同时实现强一致性与高速性能,这正是其独特性的精髓。得益于其对闪存存储设备的高效利用,Aerospike 可以在相对较小的集群上实现这些目标。

首先,我们来看 Aerospike 在保证一致性的同时如何保持高速度。通常的观点认为,运行支持强一致性的系统和放宽一致性要求的系统之间始终存在明显的性能差距。

你可能听说过 Brewer 的 CAP 定理(即一致性、可用性与分区容忍性)。CAP 定理是 NoSQL 系统的基础原则之一,然而 Aerospike 在过去十多年里持续挑战这个领域,取得了显著的成果。

一些 Aerospike 的使用场景需要在不损失系统高性能的情况下保持强一致性。Aerospike 独特的强一致性算法可以实现这一目标,既保持高性能和低延迟,又最大限度地保证系统的可用性。

Aerospike 满足以下要求以实现这一目标:

  • 在任何情况下都不会丢失写入,包括在脑裂(split-brain)情境下以及集群中多个节点缺失的情况下。
  • 避免过时的读取(stale reads)。
  • 通过简单的操作程序进行节点的增加和移除,不会影响一致性或可用性。
  • 允许开发人员和系统架构师根据数据集的具体需求选择强一致性或更高的可用性。
  • 在滚动软件升级期间,确保在任何时刻停用的节点数量少于数据的复制因子,从而同时保持可用性和一致性。

这些特性使得 Aerospike 在满足数据可靠性和一致性要求的同时,仍然可以在大规模环境下保持高效的性能和优越的系统可用性。

可用性和一致性(AP 和 CP 模式)

在任何分布式集群系统中,分区容错能力始终是首要考虑的。Aerospike 允许你根据具体使用场景配置优先级:可用性或一致性,即选择 AP 模式(可用性和分区容忍)或 CP 模式(一致性和分区容忍)。

许多分布式数据库会牺牲一致性,转而进入一种称为最终一致性的状态,即集群中的数据最终会在所有节点上达到一致的状态,但在此期间各节点的数据可能不完全相同。

然而,事务型数据库通常需要的正是最终一致性的对立面,也就是强一致性。在这些数据库中,查询任何节点都会返回相同的结果。

无论优先选择一致性或可用性,Aerospike 都会努力最大化另一项特性。

以可用性为先(AP 模式)

即使系统配置为优先可用性,运行正常的 Aerospike 系统中一致性违规的情况也很少。在第 5 章中,你将了解可能影响 AP 模式下一致性的两种情况。

以一致性为先(CP 模式)

虽然 AP 模式提供了较高水平的数据一致性,但它并不完美。当数据的正确性至关重要时,应选择 CP 模式,使一致性优先于可用性。大多数提供强一致性的系统至少需要三份数据副本。因此,如果集群发生分裂,具有多数副本(例如三份中的两份)的子集群才能继续写操作。

Aerospike 优化了集群规模,仅需存储两份副本。通过一种自适应机制,在必要时动态增加写入副本数量,Aerospike 能够在理论上达到三副本分布式系统的正确结果,同时只需支付维护两份副本的数据存储和处理成本。

第 5 章将讨论在 CP 模式下可用性受到影响的少数几种情况,以及 Aerospike 基本架构的其他重要方面。第 9 章则将更深入地探讨实现这些特性的机制。

闪存优化

Aerospike 与其他数据库的另一个关键区别在于其能够利用闪存存储的特性,通过混合存储方式实现接近内存数据库的速度,同时仅需大约十分之一的集群节点数量。

除了吞吐量和延迟特性外,数据库的能力还体现在其存储和处理数据的总量上。要充分利用闪存,数据库需要不同于传统机械硬盘的存储机制,而 Aerospike 的软件设计正是为了利用这些差异而优化的。

对于实时数据处理而言,闪存存储(SSD)可能是一个颠覆性工具。虽然完全使用计算机内存进行数据存储和计算的内存配置会更快一些,但 Aerospike 证明了 SSD 可以将每个节点的容量提升 10 到 100 倍,通常在性能上几乎没有明显损失。

使用闪存存储的 Aerospike 系统能够在单台机器上管理数十 TB 的数据,并以亚毫秒级的速度进行记录的读写。这一设计得以实现的原因是 SSD 的输入输出(I/O)读取延迟无论是随机还是顺序访问都能保持稳定的快速响应。截至写作时,一台普通商用服务器可以以合理的成本配置 30 TB 的高性能闪存和 1 TB 内存——在同一服务器上,这相当于一台 1 TB 内存数据库的 30 倍容量。

Aerospike 支持多种存储架构:混合闪存(也称混合内存)、全内存和全闪存。为了充分利用闪存存储,Aerospike 实现了一种混合模式,其中数据存储在闪存中,索引则全部存放在内存中。图 1-1 展示了混合和内存架构的对比。

从图 1-1 中你会注意到,Aerospike 中的两个命名空间可以分别配置,一个使用纯内存,另一个使用内存和闪存的混合模式。它们可以在同一节点上共存,且不会有问题。两个命名空间的主键索引都在内存中。主要区别在于内存命名空间的数据也存储在内存中,而混合命名空间则使用稍复杂的流程将数据保存到闪存。第 5 章将详细描述这个过程。

image.png

由于存储 I/O 是任何使用存储设备的应用程序中最慢的环节,Aerospike 的设计不要求存储 I/O 穿越索引,即使数据存储在闪存设备上也是如此。这使得 Aerospike 的读取性能保持高速且可预测。之所以能够实现这样的设计,是因为 NAND 闪存(服务器中最常用的闪存类型)的 I/O 读取延迟在随机访问时几乎没有性能损失。数据库访问首先穿越索引,获取指示所需数据位置的元数据。如果数据元素位于本地缓存中,则可以直接返回,无需进行 I/O 访问。如果数据存储在闪存中,则会执行一次 I/O,将整个数据元素加载到本地内存中。

这种随机读取 I/O 的能力是以 SSD 的有限写入周期为代价的。为避免 SSD 的某个部分磨损不均,并使每条记录的数据集中存储在同一位置,Aerospike 不执行原地更新,而是采用基于大块写入的写时复制机制。这种方式均匀地磨损 SSD,提高设备的耐久性,并确保每条记录的数据集中在一个位置,防止存储中的数据碎片化。

将多条写入请求组合成大块写入能够实现极高的写入吞吐量,将数百次事务写入合并为一次大块写入,并减少闪存控制器内部合并算法的工作量。写时复制机制对于在硬件故障情况下保证数据正确性和恢复能力也非常有利。

Aerospike 通常配置为绕过操作系统的文件系统,直接将附加的闪存设备用作块设备,并采用自定义数据布局。这避免了依赖未优化闪存的文件系统的问题。未优化的文件系统可能会产生额外的 I/O 和磨损,并增加操作系统的数据提交策略与文件系统的匹配复杂性。

这些技术手段赋予了 Aerospike 独特的能力,使其能够在生产环境中支持极高的写入速率,同时保持内存级别的读取响应时间和数据的高正确性。

Aerospike 在亚毫秒级工作负载中的优化表现

除了独特的高一致性和高可用性,以及在高需求负载下的小集群规模,Aerospike 的架构设计还专注于在任何数据量和极端吞吐量下实现低于 1 毫秒的读取延迟。你可能会认为要达到这样的性能需要大量硬件或云实例,但得益于闪存的高效利用和其他优化,Aerospike 通常仅需同类纯内存数据库十分之一(或更少)的节点数即可实现这一目标。Aerospike 的架构设计使其具备这样的能力,包括无共享架构、高可用性的高性能水平、以及对集群中每个节点的优化利用。

无共享架构避免热点问题

在 Aerospike 集群中,所有服务器都是对等的,没有主节点、领导节点或其他差异化节点。为了水平扩展,Aerospike 使用了一种无共享架构,构成数据库集群的所有节点在 CPU、内存、存储和网络容量方面都是同质的。这一架构的关键组件是一个统一的数据分区算法,消除了集群节点间的数据分布偏差,从而确保没有热点问题。

对闪存存储的访问是以大规模并行的方式进行的,形成了类似于高性能“RAID-0”条带化系统的透明数据布局。键值在各节点内的多个设备间以均匀的方式映射,从而确保每个节点和每个闪存设备上都存储了均匀的数据量,保证所有硬件设备均衡利用,且集群中所有服务器和存储设备的负载均衡。

这些策略以及其他将在后文中介绍的技术手段,避免了“热点”问题,即使在工作负载变化时也无需进行配置更改。例如,在图 1-2 中,可以看到一个拥有 16 个节点和每节点 5 个闪存设备的集群中的 80 路并行操作。

image.png

通过稳定的弹性设计确保性能的可预测性

Aerospike 的多种设计特性使其性能保持可预测和一致。正如前文所述,在混合内存或全内存配置中,访问存储设备 I/O 无需经过索引。在数据访问方面,前一部分提到 SSD 的随机访问读取延迟保持可预测的低水平,同时跳过操作系统层,使得每个数据检索都仅需一次 I/O 跳转,无论是随机访问还是顺序访问。此外,多项架构特性确保集群保持尽可能稳定和自我修复,使性能随时间相对稳定。

自动的键空间分区和数据再平衡机制确保事务量均匀分布在所有节点上,并且在再平衡过程中即使出现节点故障也能保持系统的稳健性。系统设计为持续可用,因此数据再平衡不会影响集群的行为。

在不需要操作干预的情况下,集群在高负载下也能自我修复。你可以配置和预设硬件容量并设置复制/同步策略,以便数据库在故障时自行恢复,不会影响用户体验,保障你的工作休息无忧。

分区到节点的映射(分区映射)会与客户端共享并缓存。与客户端共享分区映射对于提升客户端-服务器交互效率至关重要。这就是为什么在 Aerospike 中,客户端访问数据时只需向包含数据项的服务器节点发出一次网络请求,并且每次最多只需要一次存储 I/O 操作。在稳定状态下,Aerospike 集群的扩展能力仅取决于客户端和服务器节点的数量,这确保了系统的线性可扩展性,只要系统的其他部分(如网络互连)能够承载负载。

为避免影响性能的热点问题,Aerospike 将索引和数据放置在同一位置,避免在执行读取操作或查询时产生跨节点流量。写操作可能基于复制因子需要多个节点间的通信。索引和数据的协同存放以及强大的数据分布哈希函数使得数据在节点间均匀分布,从而确保:

  • 应用工作负载在整个集群中均匀分布。
  • 数据库操作性能保持可预测。
  • 集群扩容和缩容轻松便捷。
  • 在线集群重配置和随后的数据再平衡过程简单、无中断且高效。

通过节点优化减少集群规模

要实现极高的吞吐量和低延迟,不仅需要跨节点水平扩展,还需要在每个节点上进行“垂直”扩展。本节讨论系统级的细节,这些细节帮助 Aerospike 在单节点上以亚毫秒延迟处理每秒数百万次事务。Aerospike 采用的技术适用于任何数据存储系统。

在每个节点上进行有效垂直扩展意味着:

  • 在更少的节点上实现更高的吞吐量。
  • 更好的故障特性,因为节点故障的概率通常随集群节点数增加而上升。
  • 更简化的操作管理。管理 10 个节点的集群比管理 200 个节点的集群更容易。
  • 更低的总体拥有成本,特别是在考虑基于 SSD 的扩展时。

这里的基本理念是通过最佳方式充分利用硬件。为实现这一目标,Aerospike 使用 C 语言编写,并具备多种 CPU 和网络优化,能够在单节点上以亚毫秒延迟处理每秒数百万次单记录事务。

与纯内存配置相比,使用混合内存配置的扩展架构通常可以将系统的拥有成本降低至 80%。令人惊讶的是,实现这一成本节约并不需要在应用级别的性能上做出妥协。有关实现这一架构的更多信息,请参见第 5 章。

为什么毫秒级响应很重要

对于许多工作负载而言,Aerospike 的性能可能过于强大,就像用一辆一级方程式赛车来通勤一样。然而,对于某些应用场景,这样的速度不仅是锦上添花,而是必不可少的。不论数据规模是相对较小还是极大,成功的关键因素往往是性能。对于众多行业,尤其是那些面向数字原住民的现代行业,毫秒级的响应至关重要,因为操作必须在严格的时间服务级别协议 (SLA) 内执行。

一些示例场景包括:

  • 广告技术行业:需要每秒处理数百万次广告拍卖,每次拍卖必须在 100 毫秒内完成。过于缓慢将导致投标失败:观众已经点击到了其他页面,广告将永远不会显示。
  • 视频游戏:在游戏中进行个性化优化,可能是游戏成功与失败的分水岭。快速的优化可能会让玩家体验更好,进而影响游戏公司业务成败。
  • 实时事件:如热门活动的门票购买、比赛开始前数百万玩家在幻想体育中最终确定他们的阵容等场景,需要处理正常负载的 100 倍峰值负载能力。这种能力可能决定着一个价值数十亿美元的业务的成败。
  • 金融公司中的数字支付:在交易执行过程中(即在 200 毫秒内)检测欺诈行为,可能是保持正常客户服务与避免金融损失和合规风险的关键。拥有足够的速度,欺诈检测可以转变为欺诈预防,但前提是系统能够同时处理所需的负载和速度。

许多行业尚未意识到需要亚毫秒级响应时间,只是因为他们难以想象数据能够如此快速地访问。更快的数据访问可以带来巨大的业务变化,有可能显著增加收入。

比如,一个交易公司在主机上夜间批量运行合规算法,这可能导致白天的非合规交易未被及时发现。如果数据访问速度足够快,这些合规算法可以每几分钟运行一次,从而消除风险。

又比如,一家数字身份管理公司可以通过实时使用更多数据以更高的信心更快地验证用户身份,从而三倍加快身份验证速度并提升准确性。

第 10 章将深入探讨一些非常适合 Aerospike 优势的应用场景示例。

总结

在本书中,你将学习如何从 Aerospike 初学者逐步成长为能够自信地每天使用它的用户。你将了解一些关于在 Aerospike 中进行数据建模的方法,如何监控系统问题,以及如何优化底层硬件。书中还提供了 Aerospike 架构的基本信息,深入探讨了其独特之处,并提供了不同的操作方法以实现最佳性能。最终,你将建立起扎实的基础,使你能够进入更高阶段,并让 Aerospike 为你所用。首先,让我们来看看如何安装 Aerospike 并构建你的第一个应用程序。