Aerospike基本概念

Posted 果子哥丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Aerospike基本概念相关的知识,希望对你有一定的参考价值。

1、什么是Aerospike(AS)

Aerospike是一个分布式,高可用的 K-V类型的Nosql数据库。提供类似传统数据库的ACID操作。

2、为什么要用AS

K-V类型的数据库必须要提的就是redis,redis数据完全存储在内存虽然保证了查询性能,但是成本太高。AS最大的卖点就是可以存储在SSD上,并且保证和redis相同的查询性能。AS内部在访问SSD屏蔽了文件系统层级,直接访问地址,保证了数据的读取速度。 AS同时支持二级索引与聚合,支持简单的sql操作,相比于其他nosql数据库,有一定优势。

采用混合架构,索引存储在内存中,而数据可存储在机械硬盘 (HDD) 或固态硬盘 (SSD) 上(也可存储在 内存)

AS 内部在访问 SSD 屏蔽了文件系统层级,直接访问地址,保证了数据的读取速度。

AS 同时支持二级索引与 Client 聚合,支持简单的 sql 操作( aql ),相比于其他 nosql 数据库,有一定优势。

适用场景:它适合对容量要求比较大,QPS相对低一些的场景
个性化推荐广告应用
个性化推荐厂告是建立在了和掌握消费者独特的偏好和习性的基础之上,对消费者的购买需求做出准确的预 或引导,在合适的位置、合适的时间,以合适的形式向消费者呈现与其需求高度吻合的广告,以此来促进用户的消费行为。

用户行为日志收集系统收集日志之后推送到ETL做数据的清洗和转换

把ETL过后的数据发送到推荐引擎计算每个消费者的推荐结果,其中推荐逻辑包括规则和算法两部分,具体的规则有用户最近浏览、加入购物车、加入收藏等,算法则包括商品相似性、用户相似性、文本相似性、图片相似性等算法。

把推荐引擎的结果存入Aerospike集群中,并提供给广告投放引擎实时获取。

3、与Redis对比

  • Aerospike是NoSQL的数据存储,Redis是缓存

  • Aerospike是多线程的,而 Redis 是单线程的

  • Redis 需要开发人员自己管理分片并提供分片算法用于在各分片之间平衡数据;

  • client: hash 一致性hash

  • codis :代理处理sharding

  • RedisCluster: hash槽 而 AerospikeDB 可以自动处理相当于分片的工作;

  • 在 Redis 中,为了增加吞吐量,需要增加 Redis 分片的数量,并重构分片算法及重新平衡数据,这通常需要停机;
    而在 AerospikeDB 中,可以动态增加数据卷和吞吐量,无需停机,并且 AerospikeDB 可以自动平衡数据和流量;

  • 在 Redis 中,如果需要复制及故障转移功能,则需要开发人员自己在应用程序层同步数据;
    而在 AerospikeDB 中,只需设置复制因子,然后由 AerospikeDB 完成同步复制操作,保持即时一致性;而且 AerospikeDB 可以透明地完成故障转移;

  • Redis是在内存中运行的 ,AerospikeDB在内存中存储索引,在HDD、SSD中保存数据,也可以在内存中。

4、Aerospike架构


Aerospike分为三个层次:

Client层:

  • 对Aerospike Server中的数据进行访问。
  • 包括CRUD、批量操作和基于二级索引的查询
  • 是一个“智能”客户端,支持C/C++、Java、GoLang、Python、C#、php、Ruby、javascript等绝大部分主流语言。
  • 追踪节点感知数据存储位置,当节点启动或停止时立即感知集群配置变化。
  • 具有高效性、稳定性和内部的连接池。

Data层:

  • 负责数据的存储,Aerospike 属于弱语法的key-value数据库。数据存储模式如下:

5、基本概念

5.1 Namespaces(类似库)

命名空间,数据存在命名空间中,相当于 RDBMS 中的 database ,最多可设置 32 个。一个 namespace 可关联多块 SSD ,一块 SSD 只关联一个 namespace ,每个 namespace 下包含 4096 个分片

AS数据存储的最高层级,类比于传统的数据库的库层级,一个namespace包含记录(records),索引(indexes )及策略(policies)

其中策略决定namespace的行为,包括:

  1. 数据的存储位置是内存还是SSD。
  2. 一条记录存储的副本个数。
  3. 过期时间(TTL):不同redis的针对key设置TTL,AS可以在库的层级进行全局设置,并且支持对于已存在的数据进行TTL的设置,方便了使用。

索引:Aerospike Index包含主索引(Primary Index)和二级索引(Second Index),索引存储在内存中,并不保存在硬盘里

5.2 Set(类似表)

集合,类似于数据库表,一个 namespace 最多 1023 个 set

存储于namespace,是一个逻辑分区,类比于传统数据库的表。set的存储策略继承自namespace,也可以为set设置单独的存储策略。

5.2 Records(类似行)

记录,类似数据库中的一行记录, 采用弱语法 (Schema-Less) 的方式, bin 可随时增加或减少

Records类比于传统数据库的行,包含key,Bins(value)和Metadata(元数据)。key全局唯一,作为K-V数据库一般也是通过key去查询。
Bins相当于列,存储具体的数据。元数据存储一些基本信息,例如TTL等。

5.3 Key(类似于主键)

提到key,有一个和key伴生的概念是摘要(Digests),当key被存入数据库,key与set信息一起被哈希化成一个160位的摘要。数据库中,摘要为所有操作定位记录。key主要用于应用程序访问,而摘要主要用于数据库内部查找记录。

5.4 Metadata

每一条记录包含以下几条元数据

  1. generation(代):表示记录被修改的次数。该数字在程序度数据时返回,用来确认正在写入的数据从最后一次读开始未被修改过。
  2. time-to-live(TTL):AS会自动根据记录的TTL使其过期。每次在对象上执行写操作TTL就会增加。3.10.1版本以上,可以通过设置策略,使更新记录时不刷新TTL。
  3. last-update-time (LUT):上次更新时间,这是一个数据库内部的元数据,不会返回给客户端。

5.5 Bins(类似列)

类似于数据库字段,支持 Java 基本数据类型: List 、 Map 、 Blob, 一个 namespace 下最多 32767 个 bin

在一条记录里,数据被存储在一个或多个bins里,bins由名称和值组成。bins不需要指定数据类型,数据类型有bins中的值决定。动态的数据类型提供了很好的灵活性。AS中每条记录可以由完全不同的bins组成。记录无模式,你可以记录的任何生命周期增加或删除bins。

在一个库中bins的名称最多包含32k,这是由内部字符串优化所致。(相比于HBase支持几百万列还是有一定差距,如果想直接将HBase表迁移到AS可能需要重新设计存储结构)

6、aerospike管理

aerospike-server 管理工具: asadm

asadm 进入管理端 
Admin> info 
Admin> i net

aerospike-server 操作 : aql

aql> show namespaces 
+------------+ 
| namespaces | 
+------------+ 
| "test" | 
| "bar"  |

7、Aerospike集群实现

Aerospike集群管理:
集群处理节点成员身份,并确保当前成员和所有集群中的节点保持一致。包括:集群视图、节点发现和 视图改变

集群视图
每个 Aerospike 节点都会自动分配唯一的节点标识符,是由 MAC 地址和监听端口组成的。包括:

  • cluster_key :是一个随机生成的 8 字节值,用于标识集群视图的实例。
  • succession_list: 是作为集群一部分的唯一节点标识符集合。

节点发现

  • 节点间通过心跳消息来检测节点的有效或失效
  • 集群中的每个节点维护一个邻接表,是最近向该节点发送心跳消息的其他节点列表
  • 如果心跳超时,则表示该节点失效,从邻接表中删除
  • Aerospike 还采用其他信息作为备用二次心跳机制
  • 集群中的每个节点通过计算平均消息丢失来评估每个相邻节点的运行状态评分

视图改变

  • 领接表一旦发生改变,就会触发运行一个 Paxos 共识算法来确定一个新的集群视图。
  • Aerospike 把邻接表中节点标识符最高的节点当 Proposer ,并承担 Proposal 的角色
  • Proposal 提成新的集群视图,如果被接受,则节点开始重新分配数据( Rebalence )

Aerospike 数据分布
Aerospike 有智能分区算法,即把用户输入的 key 在内部根据 RIPEMD-160 算法,重新 hash 出一个 key 并取前20 位,然后相对均衡的把数据分布到各个节点之上。并且满足 namespace 配置文件的配置(例如保存多少个备份、是存在磁盘还是存在内存中)。

每个 Digest Space ( namespace )被分为 4096 个不重叠的分区( partitions ),它是 Aerospike 数据存储的最小单位

如上,一个4个节点的集群,每个节点存储1/4数据的主节点,同时也存储1/4数据的副本。如果节点1不可访问,节点1的副本将被拷贝到其他节点上。

复制因子( replication factor)是一个配置参数,不能超过集群节点数。副本越多可靠性越高。

作为必须经过所有数据副本的写请求也越高。实践中,大部分部署使用的数据因子为2(一份主数据和一个副本)。 同步复制保证即时一致性,没有数据丢失。在提交数据并返回结果给客户端之前,写事务被传播到所有副本。

主成功同时备成功后,客户端认为是成功

在集群重新配置期间,当Aerospike智能终端发送请求到那些短暂过时的错误节点时,Aerospike智能集群会透明的代理请求至正确的节点。

Aerospike 集群配置和部署

有两种方式可以搭建集群: Multicast 组播方式( UDP )和 Mesh 网格方式( TCP )

Multicast 组播方式( UDP )

heartbeat { 
    mode multicast 
    multicast-group 239.1.139.1 
    port 3000 
    address 192.168.127.131 
    interval 150 
    timeout 10 
}

udp 是不可靠协议,所以有可能会造成节点脱落,而且网络有可能不支持组播

Mesh 网格方式( TCP )

heartbeat { 
    mode mesh 
    # add current node address here 
    address 192.168.127.131 
    port 3000 
    # add all cluster node address here 
    mesh-seed-address-port 192.168.127.131 3002 
    mesh-seed-address-port 192.168.127.128 3002 
    interval 150 
    timeout 10 
}

集群部署
安装 Aerospike 后,修改配置文件 /etc/aerospike/aerospike.conf

# vim /etc/aerospike/aerospike.conf 
service {
    user root 
    group root 
    paxos-single-replica-limit 1 # Number of nodes where the replica count is automatically reduced to 1. 
    pidfile /var/run/aerospike/asd.pid 
    proto-fd-max 15000 
}
logging {
    # Log file must be an absolute path. 
    file /var/log/aerospike/aerospike.log { 
        context any info 
    } 
}
network {
    service {
        address any 
        port 3000 
        access-address 192.168.127.128 3002 
    }
    heartbeat { 
        mode mesh 
        address 192.168.127.128 
        port 3002 
        #all cluster 
        mesh-seed-address-port 192.168.127.128 3002 
        mesh-seed-address-port 192.168.127.131 3002 
        # To use unicast-mesh heartbeats, remove the 3 lines above, and see 
        # aerospike_mesh.conf for alternative. 
        interval 150 
        timeout 10
    }
    fabric {
        address any 
        port 3001 
    }
    info { 
        address any 
        port 3003 
    }    
}
namespace test { 
    replication-factor 2 
    memory-size 256M 
    storage-engine memory 
}
namespace bar { 
    replication-factor 2
    memory-size 256M 
    storage-engine memory 
}

以上是关于Aerospike基本概念的主要内容,如果未能解决你的问题,请参考以下文章

aerospike udf 错误尝试调用方法“map”(零值)

Aerospike 中的命名空间是啥

Aerospike 酸澄清

使用Aerospike的 Spark 连接器(Spark Connect)

Aerospike如何处理通过多个连接创建同一记录?

铠侠携手Aerospike提升数据库应用性能