本文介绍一下 aerospike 的基本概念以及相关数据类型。
什么是 Aerospike (AS)
Aerospike是一个分布式,可扩展,高可用的K-V类型的Nosql数据库。提供类似传统数据库的ACID操作。
采用混合架构,索引存储在RAM中,而数据存储在闪存/固态硬盘(SSD)上,自动感知集群,可以随意增加节点线性扩容,无需分片,无需人工干预(性能与节点成正比上升),支持多语言集成;与redis相比不会遇到性能瓶颈,客户端SQL介入对RDBMS支持友好。
为什么要用 AS
K-V类型的数据库必须要提的就是redis,redis数据完全存储在内存,虽然保证了查询的性能,但是成本太高。AS最大的卖点就是可以存储在SSD上,并且保证和redis相同的查询性能。AS内部在访问SSD屏蔽了文件系统层级,直接访问地址,保证了数据的读取速度。AS同时支持二级索引与聚合,支持简单的sql操作,相比于其他nosql数据库,有一定优势。
基本概念
Namespaces
AS数据存储的最高层级,类比于传统数据库的库层级,一个namespace包含记录(records),索引(indexes)及策略(policies)。其中策略决定namespace的行为,包括:
1.数据的存储位置是内存还是SSD。
2.一条记录存储的副本个数。
3.过期时间(TTL):不同于redis的针对key设置TTL,AS可以在库的层级进行全局设置,并且支持对于已存在的数据进行TTL的设置,方便了使用。
Set
存储namespace,是一个逻辑分区,类比于传统数据库的表。set的存储策略继承自namespace,也可以为set设置单独的存储策略。
Records
类比于传统数据库的行,包含key,Bins(value)和Metadata(元数据)。key全局唯一,作为K-V数据库一般也是通过key去查询。Bins相当于列,存储具体的数据。元数据存储一些基本信息,例如TTL等。
Key
提到key,有一个和key伴生的概念是摘要(Digests),当key被存入数据库,key与set信息一起被哈希化成一个160位的摘要。数据库中,摘要为所有操作定位记录。key主要用于应用程序访问,而摘要主要用于数据库内部查找记录。
Metadata
每一条记录包含以下几条元数据:
- generation(代):表示记录被修改的次数。该数字在程序读数据时返回,用来确认正在写入的数据从最后一次读开始未被修改过。
- time-to-live(TTL):AS会自动根据记录的TTL使其过期。每次在对象上执行写操作TTL就会增加。3.10.1版本以上,可以通过设置策略,使更新记录时不刷新TTL。
- last-update-time(LUT):上次更新时间,这是一个数据库内部的元数据,不会返回给客户端。
Bins
在一条记录里,数据被存储在一个或多个bins里,bins由名称和值组成。bins不需要指定数据类型,数据类型有bins中的值决定。动态的数据类型提供了很好的灵活性。AS中每条记录可以由不同的bins组成。记录无模式,你可以记录的任何生命周期或删除bins。
在一个库中bins的名称最多包含32K,这是由内部字符串优化所致。(相比于HBase支持几百万列还是有一定差距,如果想直接将HBase表迁移到AS可能需要重新设计存储结构)
数据类型
- integer
- string
- bytes
- double
- list
- map
- GeoJson
- Native-language serialized(blobs)
总结
Aerospike | RDBMS |
---|---|
namespace | 类似于数据库,最多可设置32个。一个namespace可关联多块SSD,一块SSD只关联一个namespace,每个namespace下包含4096个分片 |
set | 类似于数据库表,一个namespace最多1023个set |
bin | 类似于数据库字段,支持Java基本数据类型:List、Map、Blob,一个namespace下最多32767个bin |
record | 类似数据库中的一条记录,采用Schema-Less的方式 |
每个namespace包含多个set,每个set包含多条record,每个record包含多个bin(数据库列),可通过索引key来查询record。不同的业务可以使用同一个集群的不同namespace来作做资源隔离,从而实现资源池化、最大化利用资源的目的。
Redis和Aerospike对比:
redis | Aerospike | |
---|---|---|
运维 | 运维成本较高,扩容麻烦 | 部署和扩容都比较容易 |
性能 | 读写性能高 | 读性能高,写性能中高 |
使用成本 | 纯内存数据库,成本高 | 内存+ssd,成本较低 |
其他方面 | 内存浪费严重。数据结构丰富,应用场景广泛 | 支持二级索引,满足场景需求,支持聚合 |
排序 | 支持排序 | 不支持排序 |
集群管理 | 简单集群管理 | 相当强大,多个平等的节点,平摊存储所有数据, 并且相互备份。集群节点的失效及添 加完全自动化处理,不影响用户请求。 |
事务 | 支持简单事务 | 支持行事务 |
Aerospike优点:
Aerospike是一个高性能、可扩展、可靠性强的NoSQL解决方案,支持RAM和SSD作为存储介质,并专门针对SSD特殊优化,广泛应用于实时竞价等实时计算领域。官方保证99%的操作在1ms内完成,并提供集群数据自动Rebalance、集群感知客户端等功能,且支持超大规模数据集(100T级别)的存储。
作为KV存储,Aerospike提供多种数据类型,其操作方式和Redis比较类似。除基础功能之外,Aerospike还支持AMC控制台、API等多种监控方式,有集群QPS、健康度、负载等多项监控指标,对运维比较友好。支持集群内数据的自动Rebalance,和Redis集群方案相比,维护成本下降不少。
Aerospike缺点:
- 只支持batch read,不支持batch writes
- 记录大小有限制: <= 1M => 有点小,不过对于我们的场景基本没问题
- bin name长度: <= 14 Chars => 一般来说单字段不会超过,嵌套属性如果拼接就很容易超长
- 没有内建的聚合函数(Aggregations: count, max, min, sum, group by, etc.),通过UDFs可以支持(queryAggregate),但是使用方式不友好,效率也不高
- namespace 下的sets限制1024,二级索引限制256,唯一binname限制32K,一个namespace下最多4 billion记录
- 范围查询只支持BETWEEN语句,没有小于,大于查询,并且RANGE结果只支持包含
- 范围查询只支持整数类型,不支持浮点数
- Query不支持分页(no cursor or pagination..)
- Query不支持排序(no order by..)
- 不支持动态创建namespace,只能通过修改配置文件、重启服务器
- 只有清空set数据接口,但是并没有真正drop掉sets(会留下empty set,然后一个namespace下只有有1024个sets..)