概述
我们公司的的缓存中间件采用的是Aerospike,使用场景就是用来当做内存数据库使用,存储大量的数据。下面我们就大概来介绍下这个产品。
基本介绍
Aerospike(以下简称AS)是一个以分布式为核心基础,可基于行随机存取内存中索引、数据或SSD存储中数据的数据库。它主要用于百G、数T等大数据量并且在数万以上高并发情况下,对性能也有毫秒级读取插入要求的场景。
特性
- 可预见的高性能
99% 的响应可在 1 毫秒内实现,99.9% 的响应可在 5 毫秒内实现。
- 混合架构
索引存储在RAM 中,而数据存储在闪存/固态硬盘 (SSD) 上。
- 群集感知客户端软件
客户端知晓数据的存放位置,因此通常能够通过一次单跳检索到数据。
- 无热点
使用复杂的哈希函数来确保数据均等地分布到所有可用节点,从而将需求平均分布到各资源上。
- 数据完整性
保持了高度的一致性,或者允许对跨越多个群集和数据中心的一致性进行调节。
- 线性扩展
能够根据需要安装到多个数据中心内分组为多个群集的多个节点上。添加节点,无需分片,无需人工干预。
- 提供API的语言
AS支持多种语言,诸如C/C++、 Java、 C#、 Python、 PHP、 Go、 Node.js、 Ruby、 Erlang、 libevent2 (C)、 Perl等等。
基本概念
Namespace:策略容器,类似RDBMS关系数据库中的schema,可以设置副本数、内存大小、有效时长、存储引擎、文件存储位置。
Sets:类似RDBMS关系数据库中的表。
Records:类似RDBMS关系数据库中的行,行级的失效时间(TTL)
Bin:类似RDBMS关系数据库中的列,一行可以有多个bin
系统架构
Aerospike是一个分布式,可扩展的数据库。该体系结构具有三个主要目标:
- 为应用程序创建一个灵活的可扩展平台。
- 提供传统数据库期望的鲁棒性和可靠性(如ACID)。
- 以最少的人工参与提供运营效率。
Aerospike体系结构包括三层:
- 客户端层:此群集感知层包括开源客户端库,这些库实现了Aerospike API,跟踪节点并知道数据在群集中的位置。
- 集群和数据分发层:该层管理集群通信,并自动执行故障转移,复制,跨数据中心同步以及智能重新平衡和数据迁移。
- 数据存储层:该层可靠地将数据存储在DRAM和Flash中,以便快速检索。
Aerospike系统架构
客户层
Aerospike Smart Clien专为提高速度而设计。它被实现为C,C#,Java,Node.js和其他版本中可用的开源可链接库。开发人员可以贡献新client或修改现有client。
客户端层:
- 实现Aerospike API,客户端-服务器协议,并直接与集群对话。
- 跟踪节点并知道数据存储在哪里,立即了解集群配置的更改或节点何时启动或关闭。
- 实现自己的TCP / IP连接池以提高效率。还可以检测尚未上升到群集中节点故障级别的事务故障,并将这些事务重新路由到具有数据副本的节点。
- 将请求直接与数据透明地发送到节点,并根据需要重试或重新路由请求(例如,在集群重新配置期间)。
这种架构减少了事务等待时间,减轻了集群的工作负担,并消除了开发人员的工作。它可以确保在节点启动或关闭时,应用程序不必重新启动。而且,您不必浪费时间进行群集设置或添加群集管理服务器或代理。
集群和数据分发层
Aerospike的“无共享”架构旨在通过自动故障转移、复制和跨数据中心同步功能,可靠地存储TB级数据。该层可以线性缩放。
分布层旨在通过对所有集群管理功能进行系统自动化来消除手动操作。它包括三个模块:
群集管理模块: 跟踪群集中的节点。关键算法是基于Paxos的八卦投票过程,该过程确定哪些节点被视为群集的一部分。Aerospike实施了特殊的心跳(主动和被动)以监视节点间的连接。
数据迁移模块: 添加或删除节点时,将确定Aerospike数据库集群成员身份。每个节点使用分布式哈希算法将主索引空间划分为数据片并分配所有者。Aerospike数据迁移模块可智能地平衡群集中所有节点之间的数据分布,从而确保数据的每一个比特都能在所有群集节点和数据中心之间复制。此操作在系统复制因子配置中指定。
事务处理模块:根据请求读写数据,并提供一致性和隔离性保证。该模块负责
- 同步/异步复制:对于具有即时一致性的写入,在提交数据并将结果返回给客户端之前,它将更改传播到所有副本。
- 代理:在少数情况下,当群集重新配置时,如果客户端层可能已过时,事务处理模块将请求透明地代理到另一个节点。
- 重复解决方案:对于从分区中恢复的群集,此模块可解决不同数据副本之间的任何冲突。分辨率可配置为基于生成(版本)或到期时间戳记。
数据存储层
Aerospike是具有无模式数据模型的键值存储。数据流入政策容器,命名空间,这是语义上类似于数据库中的RDBMS系统。在名称空间中,数据可细分为集合(RDBMS 表)和记录(RDBMS 行)。每条记录在集合中都有唯一的索引键,以及一个或多个保存与该记录关联的值的命名箱(RDBMS 列)。
注意:
- 无需定义set和bin。为了获得最大的灵活性,可以在运行时添加它们。
- bin中的值是强类型的,并且可以包括任何受支持的data-type。Bin是无类型的,因此不同的record的相同bin的value可以是不同类型。
索引(包括主索引[primary index]和可选的二级索引[secondary indexes])默认情况下存储在DRAM中,以实现超快速访问。还可以将主索引配置为存储在持久性存储器或NVMe闪存设备中。值可以存储在DRAM中,也可以更经济地存储在SSD上。您可以分别配置每个名称空间,因此较小的名称空间可以利用DRAM的优势,而较大的名称空间则可以享受SSD的成本优势。
数据层旨在提高速度并显著降低硬件成本。它可以在所有内存中运行,从而消除了对缓存层的需求,或者可以利用闪存的独特优化功能。无论哪种方式,数据都不会丢失。
操作Aerospike
在传统的(非分布式)RDBMS中,在安装数据库软件之后,您将设置数据库模式并创建数据库和表定义。Aerospike数据库完全不同。
在分布式数据库中,数据在群集中的所有服务器之间分配(分布)。这意味着您不能简单地登录到服务器以访问所有数据。
使用Aerospike,您可以创建和管理数据库:
- 通过配置初始数据库设置。Aerospike数据库是名称空间。安装Aerospike时,群集中的每个节点都必须配置每个名称空间,以指定如何创建和复制数据库。重新启动服务器后即会创建数据库。
- 通过应用程序执行数据库操作。
当您的应用程序首次使用set和bin(表和字段)时,将创建数据库模式。
Aerospike数据库是一种弹性模式,您无需预先定义数据库模式。例如,要添加新的bin(字段),您的应用程序只需将数据存储在指定的bin中。在Aerospike数据库中,通常由DBA在命令行上完成的任务,可以在您的应用程序中完成。
- 通过根据需要更新配置文件。
要更改名称空间参数,只需动态更新配置文件,而无需重新启动,也可以使用新的配置文件重新启动服务器。
Aerospike提供了用于群集节点管理的管理实用程序和监视工具。如果将节点添加到群集或将节点卸下进行升级或服务,则群集将自动重新配置。当一个节点发生故障时,群集中的其他节点将以最小的影响重新平衡工作负载。
构建应用
定义了名称空间后,您可以使用Aerospike工具来验证数据库是否正确存储了数据。在生产数据库中,数据分布在群集上。要执行数据库操作,请使用实例化应用程序的智能客户端。Smart Client具有位置感知能力,并且知道如何存储和检索数据而不影响性能。
在应用程序编译时,Aerospike API库与Smart Client一起提供。Smart Client是一个单独的线程/进程,用于监视群集状态以确定数据位置,从而确保在单个跃点中检索数据。
单跳操作
这说明了Aerospike数据库集群如何支持Web服务器上的大数据应用程序实现单跳操作。Smart Client允许您的应用程序忽略数据分发详细信息。
数据分配
Aerospike数据库使用“无共享”架构,其中:
- Aerospike群集中的每个节点都是相同的。
- 所有节点都是对等体。
- 没有单点故障。
使用Aerospike Smart Partition算法,数据可以在群集中的所有节点之间平均分配。
分区
在Aerospike数据库中,namespace是具有公共存储(例如在特定驱动器上)和策略(例如namespace中每个记录的副本数)的数据集合。每个namespace都分为4096个逻辑分区,这些分区在群集节点之间平均分配。这意味着,如果集群中有n个节点,则每个节点将存储大约1 / n的数据。
记录分配到分区
Aerospike使用确定性哈希将记录一致地映射到单个分区。
为了确定记录对分区的分配,使用RIPEMD160将记录的键(任意大小)散列到20字节的固定长度摘要中。使用该摘要的12位,确定记录的分区ID。
RIPEMD160是经过现场测试的,极为随机的哈希函数,可确保记录在每个分区的基础上非常均匀地分布。分区遵循群集的不同节点之间的正态分布(与均值相差3个标准差)。
分区分配到群集节点
Aerospike中的分区分布具有以下特征
- Aerospike使用随机哈希方法来确保分区均匀分布到群集节点。无需手动分片。
- 集群中的所有节点都是对等节点–没有单个数据库主节点会发生故障并使整个数据库宕机。
- 添加或删除节点后,将形成一个新的群集,并且其节点将进行协调以在它们之间平均分配分区。然后,群集将自动重新平衡(rebalance)。
由于数据在群集节点之间均匀(且随机)分布,因此没有一个热点或瓶颈可以使一个节点处理的请求比其他任何节点都要多。例如,在美国,许多姓氏以R开头。如果按字母顺序存储数据,则处理以R开头的姓氏的服务器的流量要比处理以X、Y或Z开头的姓氏的服务器的流量大得多。随机数据分配可确保均衡的服务器负载。
数据复制和同步
为了提高可靠性,Aerospike在一个或多个节点上复制分区。一个节点成为分区的读写数据主节点,而其他节点则存储其副本分区。
如上图,说明了一个4节点的Aerospike集群,其中每个节点是大约1/4数据的数据主数据,每个节点是1/4数据的副本。数据作为副本分布在所有其他节点上。对于此示例,如果节点1不可用,则来自节点1的副本将散布在其他节点上。
复制因子是可配置的;但是,它不能超过群集中的节点数。副本越多,可靠性越好,但由于对所有副本的写请求必须更高,因此集群的需求也更高。大多数部署使用2的复制因子(一个主副本和一个副本)。
在没有网络故障的情况下,同步复制可提供更高级别的正确性。在提交数据并将结果返回给客户端之前,写事务会传播到所有副本。在集群重新配置期间罕见的情况下,当塞式智能客户端可能将请求发送到错误的节点,因为它是简单地过时了,在塞式智能集群透明地将请求代理到正确的节点。当群集从分区中恢复时,可能会有冲突地应用于不同分区的写入。在这种情况下,Aerospike会应用启发式方法选择最可能的版本,因为它可以解决在数据的不同副本之间发生的任何冲突。默认情况下,尽管可以选择更改时间最近的版本,但是选择的更改数量最多(最高生成计数)。正确的选择将由数据模型确定。
没有复制的Aerospike集群
在Aerospike数据库中,没有复制的数据就是复制因子= 1,数据库只有一个副本。
这说明了一个四节点群集的两个节点,总共有4096个分区。每个节点包含数据的1/4的随机分配(1024个分区)。每个服务器/节点都管理该分区集合。
每个节点都是数据分区的1/4的数据主机(当节点是读取和写入该数据的主要源时,节点就是数据主机)。Aerospike Smart Client可识别位置。它知道每个分区的位置,以便在单跳中完成数据检索。每个读写请求都发送到数据主机进行处理。智能客户端读取记录并将请求发送到该记录的正确数据主节点。
带复制的Aerospike集群
在Aerospike数据库中,复制因子= 2表示存储数据的两个副本:master和副本。
复制因子= 2; 使用复制的四节点群集中的两个节点
这说明每个节点是数据(1024个分区)的1/4的数据主AND每个节点是数据(1024个分区)的1/4的复制品。请注意,一个数据主机的数据作为副本分布在所有其他群集节点上。如果节点#1不可用,则来自节点#1的数据副本将分发到所有其他群集节点。
同样,智能客户端读取记录,并将请求发送到该记录的正确数据主节点。写请求也将发送到正确的节点。当节点接收到写请求时,它将保存数据并将该写请求转发到副本节点。一旦副本节点确认成功写入并且该节点自己写入数据,确认将返回给客户端。
自动重新平衡
Aerospike数据重新平衡机制可确保查询量在所有群集节点之间平均分配,并在节点故障期间保持持久性。该系统是连续可用的。重新平衡不会影响群集的行为。与数据分发系统集成的交易算法可确保达成一致意见,以协调集群变更。按群集更改而不是按事务投票,可以在保持无共享简单性的同时提供更高的性能。
Aerospike允许配置选项指定重新平衡的进行速度。暂时变慢的事务可以更快地恢复群集。如果您需要保持事务处理的速度和数量,则群集重新平衡的速度会更慢。
在重新平衡期间,Aerospike不会保留所有分区的完整复制因子。某些传输中的分区暂时成为单个副本,以在群集重新平衡以达到新的稳定性时提供最大的内存和存储可用性。
通过不需要操作员干预,群集即使在最苛刻的时间也能自愈。例如,在一个客户部署中,一个机架断路器跳闸,一个8节点集群中的一个节点发生故障。无需操作员干预。几个小时后,故障得到纠正,机架又恢复了在线状态。运营商无需采取特殊步骤即可维护Aerospike集群。
在Aerospike中,容量规划和系统监控几乎可以管理任何故障,而不会损失服务。您可以配置和配置硬件容量,并设置复制/同步策略,以便数据库从故障中恢复而不会影响用户。
流量饱和度管理
Aerospike数据库监视工具使您可以评估瓶颈。网络瓶颈会降低数据库的吞吐量,从而使请求变慢。
容量溢出
在存储溢出时,Aerospike停止写入限制会阻止新记录写入。复制和迁移写入以及读取将继续进行处理。因此,即使超出最佳容量,数据库也不会停止处理请求。它继续尽可能多地继续处理用户请求。
总结
上面介绍了Aerospike的作用、特性以及架构,不知道大家有什么感想呢?