近期在做实时指标平台,我们的实时指标数据是存储在aerospike上的。下面就介绍下它的特性
aerospike总体来说是一个基于内存的并且具有高度可靠性的分布式计算系统
架构
客户端层
这一层包括带有AerospikeAPI的开源客户端库和能够感知数据在Aerospike集群中位置的追踪节点。
集群和数据分布层
这一层监控集群通讯并提供一些自动化功能,比如故障转移、数据复制和跨数据中心同步。
数据存储层
这一层负责在DRAM(动态随机存取存储器)和Flash(闪存)中存储数据。
数据模型
Namespaces
类似于database
Sets
类似于RDBMS的table。
Records
key
- 唯一标识. 根据key的hash查询Records
- key的类型:Integers, String, and bytes
- 内部会hash成一个 160-bit(20-bytes) 的digest
metadata
- generation,类似version
- time-to-live (TTL)
- last-update-time (LUT)
bins
- 类型于RDBMS的列
- 数据类型
- integer: 8 bytes
- string: 128 KB;
- bytes
- double: 8 bytes
- CDTs (Complex Data Types)
- list
- map
- GeoJSON (3.7.0+)
- native-languages serialized(blobs)
特点
数据存放
数据可以放内存,也可以放SSD。
数据放内存时速度肯定会很快,但这和memcache一样,相比memcache性能并没有优势
数据也可以放SSD,并做了特定优化,相比mysql会更快,但数据操作模型过于简单,可使用场景很少。也比mongo性能更好,但其要求SSD存储,这样容量较小,费用也较高,这时mongo是好选择数据操作模型
支持 按主键及二级索引筛选数据
支持 聚合 (强大,一个卖点)
不支持排序(通过聚合功能的lua脚本也可能可以实现,但并不现实)
虽然支持类SQL语法操作,但可进行的操作非常简单,好于memcache, 稍好于mongo,比redis差些,跟mysql完全没法比,但其聚合功能还比较强大。集群管理
相当强大,多个平等的结点,平摊存储所有数据,并且互相备份。集群结点的失效及添加完全自动化处理,不影响用户请求。
相比memcache,这是它强大的地方,也不会弱于其它nosql的集群管理。聚合功能
这里聚合的概念等同于mysql中的聚合。可以通过编写lua脚本,实现对数据的聚合,此时aerospike可以看作一个分布式的基于内存的map-reduce计算平台,相比普通的hadoop map-reduce,速度是很快的,当然,可处理的数据量相对较少。事务
支持行事务
坑点
- 只支持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..)
为什么选用aerospike
与redis相比
- redis单线程处理
- redis集群部署比较复杂
- redis有严重的磁盘碎片问题
- 节点扩展不方便
与memcache相比
- memcache不支持持久化
- memcache只支持string类型数据
- 不支持事务
- memcache集群管理差
适用场景
替换memcache做缓存
这是由于它有强大的集群管理功能,对非常重要不能宕机的缓存服务可以采用它,但代价就是需要更多的硬件服务器。性能要求很高的实时聚合计算
aerospike是一个分布式的基于内存的map-reduce服务,速度快。一般来说,原始数据变化较频繁,而对聚合计算实时要求较高的情景可以用它。