Aerospike学习笔记

1 概述

  • Aerospike 是一个分布式、可扩展的数据库。该架构具有三个关键目标:
    • 为网络规模的应用程序创建灵活、可扩展的平台。
    • 提供传统数据库所期望的稳健性和可靠性(如 ACID)。
    • 以最少的人工参与提供运营效率。
  • 文档链接:https://docs.aerospike.com/

1.1 Aerospike架构

  • Aerospike架构主要包括三层:客户端层、集群和数据分布层、数据存储层

  • 客户端层:此集群感知层包括开源客户端库,这些库实现 Aerospike API、跟踪节点并了解数据在集群中的位置。

    1. 实现 Aerospike API、客户端-服务器协议,并直接与集群对话。
    2. 跟踪节点并了解数据存储位置,立即了解集群配置的更改或节点何时启动或关闭。
    3. 实现自己的 TCP/IP 连接池以提高效率。还检测尚未达到集群中节点故障级别的事务故障,并将这些事务重新路由到具有数据副本的节点。
    4. 将请求直接透明地发送到包含数据的节点,并根据需要重试或重新路由请求(例如,在集群重新配置期间)

    这种架构减少了事务延迟,减轻了集群的工作负担,并消除了开发人员的工作量。它确保当节点启动或关闭时应用程序不必重新启动。您不必浪费时间进行集群设置或添加集群管理服务器或代理。

  • 集群和数据分布层:管理集群通信并自动执行故障转移、复制、跨数据中心复制 (XDR) 以及智能重新平衡和数据 迁移。数据分布层旨在通过所有集群管理功能的系统自动化来消除手动操作。它包括三个模块:

    1. 集群管理模块:跟踪集群中的节点。关键算法是基于 Paxos 的gossip-voting过程,用于确定哪些节点被视为集群的一部分。Aerospike 实施特殊的心跳(主动和被动)来监控节点间连接。

    2. 数据迁移模块:当您添加或删除节点时,Aerospike 数据库集群成员身份将被确定。每个节点使用分布式哈希算法将主索引空间划分为数据片并分配所有者。Aerospike 数据迁移模块智能平衡集群中所有节点的数据分布,确保每一位数据在所有集群节点和数据中心之间复制。此操作在系统复制因子配置中指定。

    3. 事务处理模块:根据请求读写数据,并提供一致性和隔离性保证。该模块负责

      • 同步/异步复制:对于具有即时一致性的写入,它会在提交数据并将结果返回给客户端之前将更改传播到所有副本。
      • 代理:在极少数情况下,在集群重新配置期间,客户端层可能会短暂过时,事务处理模块会透明地将请求代理到另一个节点。
      • 重复数据的解决:对于从分区中恢复的集群(包括重新启动节点时),该模块可以解决不同数据副本之间的任何冲突。分辨率可以基于生成计数(版本)或上次更新时间。

      一旦第一个集群建立起来,您就可以在其他数据中心安装其他集群并设置跨数据中心复制,以确保如果数据中心出现故障,远程集群将接管工作负载,同时对用户造成的干扰最小或不会造成干扰

  • 数据存储层:该层可靠地将数据存储在DRAM和闪存中,以便快速检索。Aerospike 是一个具有无模式数据模型的键值存储。数据流入策略容器、命名空间,它们在语义上类似于RDBMS 系统中的数据库。在命名空间内,数据被细分为集合(RDBMS)和记录(RDBMS)。每条记录都有一个在集合中唯一的索引,以及一个或多个保存与该记录关联的值的命名容器(RDBMS列)。

    1. 您不需要定义集合和容器。为了获得最大的灵活性,可以在运行时添加它们。
    2. bin 中的值是强类型的,可以包含任何受支持的数据类型。bin 没有类型化,因此不同的记录可以具有包含不同类型值的相同 bin。
    3. 在 Aerospike 中:
      • 1亿个密钥仅占用6.4GB。尽管密钥没有大小限制,但每个密钥仅有效存储在 64 字节中。
      • 本机、多线程、多核 Flash I/O 和Aerospike 日志结构化文件系统利用低级 SSD 读写模式。为了最大限度地减少延迟,磁盘写入是在大块中执行的。此机制绕过了标准文件系统,该系统过去一直调整为旋转磁盘。
      • 智能碎片整理程序和清除器协同工作,确保 DRAM 中有空间,并且数据永远不会丢失并始终安全地写入磁盘。
        • 智能碎片整理程序:跟踪每个块中的活动记录数量并回收低于最低使用级别的块。
        • Evictor:如果系统超出设定的高水位线,则删除过期记录并回收内存。过期时间是按命名空间配置的。记录年龄是从最后一次修改开始计算的。应用程序可以覆盖默认生命周期并指定永远不应驱逐记录。
  • 在传统(非分布式)RDBMS 中,安装数据库软件后,您可以设置数据库模式并创建数据库和表定义。Aerospike 数据库则完全不同。在分布式数据库中,数据在集群中的所有服务器之间划分(分布)。这意味着您不能简单地登录服务器来访问所有数据。使用 Aerospike,您可以创建和管理数据库:

    • 通过配置初始数据库设置。Aerospike 数据库是命名空间。安装 Aerospike 时,集群中的每个节点都必须配置每个命名空间,以指定如何创建和复制数据库。重新启动服务器后,数据库就会创建。
    • 通过您的应用程序执行数据库操作。
      • 当您的应用程序首次引用集合容器(表和字段)时,将创建数据库模式。
      • Aerospike 数据库是一个灵活模式-您不必预定义数据库模式。例如,要添加新的 bin(字段),您的应用程序只需开始将数据存储在指定的 bin 中。在 Aerospike 数据库中,通常由 DBA 在命令行上完成的任务都在您的应用程序中完成。
    • 根据需要更新配置文件。
      • 要更改命名空间参数,只需动态更新配置文件(无需重新启动)或使用新配置文件重新启动服务器即可。
  • 如果您向集群添加节点或删除节点进行升级或维护,集群会自动重新配置。当一个节点发生故障时,集群中的其他节点会重新平衡工作负载,并将影响降至最低。

1.2 Aerospike的混合存储

  • Aerospike 可以将数据存储在以下任何类型的介质及其组合上:

    • 动态随机存取存储器(DRAM)。
    • 非易失性内存扩展 (NVMe) 闪存或固态硬盘 (SSD)。
    • 持久内存 (PMem)。
    • 传统的旋转媒体。

    混合内存系统包含存储在每个节点中的索引和数据,处理与物理存储的交互,包含用于自动从数据库中删除旧数据的模块,并对物理存储进行碎片整理以优化磁盘使用。

  • 尽管将索引和数据存储在 PMem 中似乎是一个显而易见的选择,但它们的优点有所不同。最好将它们的特性(以及 NVMe 闪存)与客户端应用程序的数据模型相匹配。放置主索引和数据的可能性的完整矩阵如下表所示。并非所有可能性都有意义:与某些用例匹配的可能性以蓝色突出显示,并在下面详细说明。
    在这里插入图片描述

    从右下角开始,使用全 PMem 配置几乎没有什么缺点。性能与 DRAM 相当,但每比特成本更低,并且无需放弃持久性或重新启动后的快速恢复:只需几分钟而不是几小时。更高的性能可以通过多种方式发挥作用,不仅限于以下方式:

    • 每个节点的交易更多:随着流量的增长,升级更少。
    • 每笔交易的计算量更大,例如更丰富的广告技术或欺诈检测模型。

    另一种可能性是在过去需要实时性能的应用程序中启用强一致性 (SC) 模式或持久写入。即使 SC 不是绝对要求,为了提高运营效率,经济高效地部署它也可能是值得的。PMem 中数据的最终限制因素是处理器支持的数量。最新一代的 Xeon Scalable 2 (Cascade Lake) 处理器每插槽最多支持 3 TiB:即使使用多插槽系统,也无法容纳非常大的数据库。可能还存在经济方面的考虑,因为支持大地址空间的至强处理器会带来溢价。对于非常大的数据库,将所有 PMem 专用于主索引是更好的选择。它比 DRAM 更具成本效益,可扩展到更大的数据集,并保留了无需重建索引而实现快速重启的优势。即使在 PB 级规模,由于 Aerospike 对块模式闪存存储进行了优化,性能也非常出色。

    1. 不同的命名空间可以有不同的存储引擎。例如,您可以在 DRAM 中配置小型、频繁访问的命名空间,并将较大的命名空间放在较便宜的存储中,例如 SSD。在 Aerospike 中:

      • 记录数据存储在一起。

      • 一行的默认存储大小为 1 MB。

      • 存储是写时复制的。

      • 碎片整理期间会回收可用空间。

      • 每个命名空间都有固定的存储量,每个节点在每台服务器上必须有相同的命名空间,这就要求每个命名空间有相同的存储量。

    2. 纯 DRAM 存储(无持久性)可提供更高的吞吐量。尽管现代闪存存储的性能非常高,但 DRAM 的性能更好,但价格却高得多(特别是包括电力成本)。Aerospike 使用 JEMalloc 分配数据,允许分配到不同的池中。长期分配,例如存储层,是可以单独分配的。JEMalloc 具有极低的碎片特性。Aerospike 通过使用 DRAM 的多个副本来实现高可靠性。由于 Aerospike 在发生故障时或在集群节点管理期间自动重新分片和复制数据,因此获得了高级别的*k-safety 。*当节点恢复在线时,其数据会自动从副本填充。Aerospike 使用随机数据分布来在多个节点丢失非常小的情况下保持数据不可用。在此示例中,我们有一个 10 节点集群,其中包含两个数据副本。如果两个节点同时丢失,复制前不可用的数据量约为数据量的2%或1/50。对于持久存储层,读取始终从 DRAM 中的副本进行。写入通过下述数据路径进行。

    3. 当从客户端接收到写入(更新或插入)时,会在该行上获取锁存器,以避免对该集群的同一记录进行两次冲突的写入(在网络分区的情况下,可能会采取冲突的写入来提供可用性) ,稍后解决)。在某些集群状态下,可能还需要从其他节点读取数据并解决冲突。写入验证后,记录的内存表示在主服务器上更新。将要写入设备的数据放置在缓冲区中进行写入。当写入缓冲区已满时,它会排队到磁盘。写入缓冲区大小(与最大行大小相同)和写入吞吐量决定未提交数据的风险,并且配置参数允许刷新这些缓冲区以限制潜在的数据丢失。然后副本及其内存索引会更新。Aerospike 碎片整理程序跟踪磁盘上每个块上的活动记录数,并回收低于最低使用级别的块。

    4. Aerospike 企业版 4.8 支持将记录数据存储在英特尔® 傲腾™ DC 持久内存 (PMem) 中。Optane 将类似于 DRAM 的字节寻址能力和访问时间与闪存 NVMe 存储的持久性和密度结合在一起。您可以在英特尔®傲腾™持久内存中了解有关持久内存的更多信息。在早期版本中,Aerospike 支持将主索引存储在 PMem 中。Aerospike 4.8 版将 PMem 支持扩展到记录数据本身。它们相结合,提供无与伦比的性能,同时保留持久性和快速重启功能。

1.3 Aerospike的数据模型

  • Aerospike的数据模型:Aerospike 数据库不需要传统的 RDBMS 模式。相反,数据模型是通过您对系统的使用来确定的。例如,如果您想要向记录添加新的数据类型,您可以将该数据类型写入该记录,而无需先更新任何架构。

  • 命名空间:命名空间是顶级数据容器。在命名空间中收集数据的方式与数据的存储和管理方式有关。命名空间包含记录、索引和策略。策略规定命名空间行为,包括:

    • 数据如何物理存储。
    • 一条记录存在多少个副本。
    • 当记录过期时。

    数据库可以指定多个命名空间,每个命名空间都有不同的策略来适应您的应用程序。您可以考虑将数据绑定到存储设备的命名空间物理容器。在命名空间中,记录可以属于称为set 的可选逻辑容器。集允许应用程序对集合中的记录进行逻辑分组。集继承其命名空间定义的策略。您可以定义特定于该集合的其他策略或操作。例如,可以为特定集合指定二级索引,或者可以对特定集合进行扫描操作。命名空间中的记录不必位于集合中,而只需属于该命名空间即可。

  • 记录是数据库中的基本存储单位。记录可以属于命名空间或命名空间内的集合。单个记录由键唯一标识。记录由以下部分组成:

    在这里插入图片描述

    使用客户端,应用程序通过提供记录的key(或摘要)以及一个或多个操作(在原子事务中)对存储在数据库中的记录执行操作。每条记录包含以下元数据:

    • 生成计数跟踪记录修改周期,即它的“沿袭”。读取时,生成计数将返回给应用程序,应用程序可以使用检查和设置 (CAS) 模式,使用它来确保自上次读取以来要写入的数据未被修改。
    • 生存时间 (TTL) 指定记录的可选过期时间。从 Aerospike 数据库版本 4.9 开始,默认情况下禁用过期。如果使用TTL,则每次写入记录时都会重置。对于服务器版本3.10.1及以上版本,客户端可以设置策略,在更新记录时不修改TTL。
    • 最后更新时间 (LUT) 指定更新记录的时间戳。该元数据位于数据库内部,不会直接返回给客户端。
  • 记录数据存储在 bin 中。Bin 由名称和值组成。bin 不指定数据类型,而是由 bin 中包含的值定义数据类型。这种动态数据类型为数据模型提供了灵活性。例如,记录可以包含带有字符串值bob的 bin id。bin 的值始终可以更改为不同的字符串值,但也可以更改为不同数据类型的值,例如整数。没有模式,因此每个记录都可以有自己不同的存储箱集。您可以随意添加和删除垃圾箱。Bin 值可以是本机支持的任何一种数据类型

1.4 Aerospike的主键索引

  • 什么是主键索引:主键索引是分布式哈希表技术与每个服务器中的分布式树结构的结合。命名空间中的整个键空间通过强大的哈希函数分为多个分区。总共 4096 个分区均匀分布在集群节点上。有关散列和分区的详细信息,请参阅数据分布。Aerospike 使用称为sprig的红黑内存结构。对于每个分区,可以配置数量的分支。配置正确数量的分支是内存开销和优化并行访问之间的权衡。主索引位于称为指定主键*摘要的 20 字节哈希上。*虽然这会扩展某些记录的密钥大小(例如,只有 8 字节的整数密钥),但它是有益的,因为无论输入密钥大小或分布如何,代码操作都是可预测的。当一台服务器发生故障时,另一台服务器上的索引立即可用。如果发生故障的服务器保持关闭状态,数据将开始重新平衡,并在新节点上构建复制索引。

1.5 Aerospike的二级索引

  • 什么是二级索引:二级索引(SI) 是一种数据结构,它根据记录中的 bin 值来定位名称空间中的所有记录或其中的一组记录。当索引记录中的值更新时,二级索引会自动更新。在 Aerospike 数据库服务器 6.0 中,SI 查询结果不受集群状态的影响。当集群稳定时以及集群大小变化后的数据迁移过程中,按分区查询会返回正确的结果。在服务器 6.0 中,需要兼容的客户端(例如 Java 客户端 6.0)来支持重新平衡容忍查询。受益于二级索引的应用程序包括丰富的交互式业务应用程序和面向用户的分析应用程序。二级索引还支持商业智能工具和对操作数据集的即席查询
  • 为什么要使用二级索引:扫描大量数据可能会花费大量时间,并且当 SI 查询扫描表中的每个文档或条目时,可能会对性能产生负面影响。通过读取表中的每个文档或条目来查询大量数据在时间和性能方面都非常昂贵。Aerospike 二级索引可保证更快的响应时间,因为它们可以通过主键以外的字段有效访问更广泛的数据。
  • Aerospike二级索引:
    • 存储在动态随机存取存储器 (DRAM) 中以便快速查找。
    • 构建在集群中的每个节点上,并与主索引位于同一位置。每个二级索引条目仅包含对该节点本地记录的引用。
    • 包含指向节点中主记录和复制记录的指针。
    • 位于 bin 值上,允许建模一对多关系。
    • 逐个指定容器(例如,使用 Rational Database Management System (RDBMS) 列)以实现高效更新以及存储索引所需的最少量资源。使用 Aerospike 工具或 API 根据 bin 和数据类型动态创建和删除索引。索引条目经过类型检查。例如,一个应用程序可以将用户年龄存储为字符串,另一个应用程序可以将用户年龄存储为整数。整数索引排除以字符串形式存储的记录,而字符串索引则排除以整数形式存储的记录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值