docker pull aerospike:4.0.0.5
C:\Users\guoyu.huang>docker pull aerospike:4.0.0.5
4.0.0.5: Pulling from library/aerospike
297061f60c36: Pull complete
e9ccef17b516: Pull complete
dbc33716854d: Pull complete
8fe36b178d25: Pull complete
686596545a94: Pull complete
0ac40e4f5c7d: Pull complete
b122ee426bc3: Pull complete
195ffbe32fa7: Pull complete
Digest: sha256:89081138baba9715c35280007365dffbd13e0f066cb9e78843a21d041af70f10
Status: Downloaded newer image for aerospike:4.0.0.5
docker.io/library/aerospike:4.0.0.5
docker run -d --name aerospike4.0.0.5 -p 3000:3000 -p 3001:3001 -p 3002:3002 -p 3003:3003 aerospike:4.0.0.5
C:\Users\guoyu.huang>docker run -d --name aerospike4.0.0.5 -p 3000:3000 -p 3001:3001 -p 3002:3002 -p 3003:3003 aerospike:4.0.0.5
71546c8f04ef8dcbc550fdd7c0442a55a1f4344da323638d72a71e6a4006cd25
Aerospike官网介绍:https://www.aerospike.com/docs/guide/index.html
该模块内容大部分来自亦一亦二的博文:https://www.jianshu.com/p/8d843d7a6a27
Aerospike是一个分布式,高可用的 K-V类型的Nosql数据库。提供类似传统数据库的ACID操作。
Atomicity原子性;Consistency一致性;Isolation隔离性;Durability耐久性
redis数据完全存储在内存虽然保证了查询性能,但是成本太高。Aerospike最大的卖点就是可以存储在SSD上,并且保证和redis相同的查询性能。Aerospike内部在访问SSD屏蔽了文件系统层级,直接访问地址,保证了数据的读取速度。Aerospike同时支持二级索引与聚合,支持简单的sql操作,相比于其他nosql数据库,有一定优势。
Aerospike数据存储的最高层级,类比于传统的数据库的库层级,一个namespace包含记录(records),索引(indexes )及策略(policies)。
其中策略决定namespace的行为,包括:
存储于namespace,是一个逻辑分区,类比于传统数据库的表。
set的存储策略继承自namespace,也可以为set设置单独的存储策略。
类比于传统数据库的行,包含key,Bins(value)和Metadata(元数据)。
key全局唯一,作为K-V数据库一般也是通过key去查询。Bins相当于列,存储具体的数据。元数据存储一些基本信息,例如过期时间等。
提到key,有一个和key伴生的概念是摘要(Digest),当key被存入数据库,key与set信息一起被哈希化成一个160位的摘要。数据库中,摘要为所有操作定位记录。
key主要用于应用程序访问,而摘要主要用于数据库内部查找记录.
在一条Record里,数据被存储在一个或多个bin中,bin由名称和值组成。bin不需要指定数据类型,数据类型有bin中的值决定。动态的数据类型提供了很好的灵活性。Aerospike中每条Record可以由完全不同的bin组成。Record无模式,你可以在Record的任何生命周期增加或删除bin。
在一个Namespace中bin的名称最多包含32k,这是由内部字符串优化所致。(相比于HBase支持几百万列还是有一定差距,如果想直接将HBase表迁移到Aerospike可能需要重新设计存储结构)
Bin的数据类型有:Integer,String,BLOB,List,Map
每一条Record包含以下几条Metadata:
使用aql进行操作,因为我使用docker,所以需要先进入容器内部,指令如下:
C:\Users\guoyu.huang>docker exec -it 7154 bash
root@71546c8f04ef:/# cd usr/bin
root@71546c8f04ef:/usr/bin# aql
Seed: localhost:cluster_a:3000
Config File: /etc/aerospike/astools.conf /root/.aerospike/astools.conf
2019-09-27 02:29:45 WARN Failed to connect to seed localhost 3000. AEROSPIKE_ERR_CONNECTION Socket connect failed: [::1]:3000
Aerospike Query Client
Version 3.15.3.2
C Client Version 4.3.5
Copyright 2012-2017 Aerospike. All rights reserved.
aql>
Aerospike无法通过指令来添加,需要修改aerospike.conf文件。
# Aerospike database configuration file.
# This stanza must come first.
service {
.....
}
logging {
.....
}
network {
service {
......
}
heartbeat {
......
}
fabric {
......
}
info {
......
}
}
namespace hgy {
replication-factor 2
memory-size 128M
default-ttl 30d # 5 days, use 0 to never expire/evict.
storage-engine memory
# To use file storage backing, comment out the line above and use the
# following lines instead.
# storage-engine device {
# file /opt/aerospike/data/test.dat
# filesize 4G
# data-in-memory true # Store data in memory in addition to file.
# }
}
修改namesapce中的属性值,保存之后重启服务即可。
因为测试使用,所以直接使用内存,不使用磁盘持久化,如果是使用docker会比较麻烦一点,参考文章最后一段。
aql> show namespaces
+------------+
| namespaces |
+------------+
| "hgy" |
+------------+
[127.0.0.1:3000] 1 row in set (0.002 secs)
OK
DDL
CREATE INDEX <index> ON <ns>[.<set>] (<bin>) NUMERIC|STRING|GEO2DSPHERE
CREATE LIST/MAPKEYS/MAPVALUES INDEX <index> ON <ns>[.<set>] (<bin>) NUMERIC|STRING|GEO2DSPHERE
DROP INDEX <ns>[.<set>] <index>
Examples:
CREATE INDEX idx_foo ON test.demo (foo) NUMERIC
DROP INDEX test.demo idx_foo
Aerospike的“集合”类似于关系数据库中的表。最大的区别之一是,使用Aerospike,您无需预定义架构。因此,在集合中首次插入记录时将动态隐式创建集合。
aql> show sets
[127.0.0.1:3000] 0 rows in set (0.001 secs)
OK
aql> insert into hgy.a(pk,a,b) values('1',1,2)
OK, 1 record affected.
aql> show sets
+------------------+-------+----------------+---------+-------------------+-----+-------------------+--------------+------------+
| disable-eviction | ns | set-enable-xdr | objects | stop-writes-count | set | memory_data_bytes | truncate_lut | tombstones |
+------------------+-------+----------------+---------+-------------------+-----+-------------------+--------------+------------+
| "false" | "hgy" | "use-default" | "1" | "0" | "a" | "26" | "0" | "0" |
+------------------+-------+----------------+---------+-------------------+-----+-------------------+--------------+------------+
[127.0.0.1:3000] 1 row in set (0.001 secs)
OK
两种删除方式
aql> truncate hgy.a;
OK
asinfo -v "set-config:context=namespace;id=namespace_name;set=set_name;set-delete=true;"
C:\Users\guoyu.huang>docker run -d -v /hgy --name aerospike4.0.0.5 -p 3000:3000 -p 3001:3001 -p 3002:3002 -p 3003:3003 aerospike:4.0.0.5 asd --foreground --config-file /hgy/aerospike.conf
e8a3e1fc5fb62097cd647e6e02b616abc64f8bcd55fcb3c706cd8b9d8164cf45
这时候启动肯定是失败的,因为找不到/hgy/aerospike.conf这个文件,这时候可以通过文件复制的办法,把自定义的aerospike.conf复制到容器中
C:\Users\guoyu.huang>docker cp d:/aerospike.conf e8a3:/hgy
重新启动,并查看日志
C:\Users\guoyu.huang>docker start e8a3
e8a3
C:\Users\guoyu.huang>docker logs --since 30m e8a3
link eth0 state up
link eth0 state up in 0
Sep 27 2019 08:17:10 GMT: FAILED ASSERTION (config): (cfg.c:2020) couldn't open configuration file /hgy/aerospike.conf: No such file or directory
Sep 27 2019 08:17:10 GMT: WARNING (as): (signal.c:153) SIGINT received, shutting down
Sep 27 2019 08:17:10 GMT: WARNING (as): (signal.c:156) startup was not complete, exiting immediately
link eth0 state up
link eth0 state up in 0
Sep 27 2019 08:17:29 GMT: INFO (as): (as.c:319) <><><><><><><><><><> Aerospike Community Edition build 4.0.0.5 <><><><><><><><><><>
Sep 27 2019 08:17:29 GMT: INFO (config): (cfg.c:3621) # Aerospike database configuration file.
......