Akka DData分布式数据缓存

  Ddata用于在节点间共享数据,我们知道一说到共享麻烦事儿就来了,特别是集群情况下,因为它意味着并行/并发的读和写、不知道什么时候、不知道在什么地方随机发生读或者写。传统RDB数据库解决这个问题的方式可以说是牺牲了一部分性能的:数据库是单点(分布式存储也需要这么一个单点即主节点),数据访问方法都是同步的,这期间包含两种IO:网络和磁盘的,如果是事务还可能有多次磁盘IO、如果是分布式事务那可能有多次网络/磁盘IO...

  ddata使用键值形式存储和访问数据(所以数据可看做data entry)、值即所谓的Conflict Free Replicated Data Types(CRDT),CRDT的作用是允许在任意节点更新数据,而不需要和外部协调,我们说了大数据首先就得干掉分布式事务,分布式事务就是需要外部协调的典型,要提高效率,每个节点首先需要是自恰自驱的、差异只要能够merge即可,求同存异、埋头苦干就是效率最高的。CRDT数据结构保障自动merge更新,这些数据结构包括:counters, sets, maps and registers.

  ddata分布式数据和Amazon Dynamo的相似点比较多,目前看CRDT由于需要支持数据merge带来额外负担是肯定的,所以ddata可以用于集群状态同步、但不适用大数据量高并发业务数据。Akka的集群就用ddata同步成员状态,The cluster membership state is a specialized CRDT, which means that it has a monotonic merge function. When concurrent changes occur on different nodes the updates can always be merged and converge to the same end result.

Akka DData分布式数据缓存_第1张图片
All data entries are spread to all nodes

  和其他Akka组件如分片套路类似,ddata本身也是基于actor来使用的:你可以用akka.cluster.ddata.Replicator复制器actor访问ddata数据、每台节点机都需要启动这个actor我们把它叫做replica、各个节点机上的replica组成一个分布式数据复制层(类似分片的分布式分片管理层)、你的程序在哪个节点机上就和那个节点机上的replica打交道;所有replica都是一样的名字、一样的path.  拿到本机replica actorRef有个便利方法:

    val replicator = DistributedData(context.system).replicator

  写和读数据就是给replicas!Update消息,CRDT是基于gossip收敛的,默认一致性保障是保证最终一致性,最终一致的系统,可能读到过期值:a read may return an out-of-date value.  注意只是可能,这还要取决于一致性级别:类似卡珊德拉,Akka分布式数据对每条读写都可以指定一致性级别(代码示例):

1、WriteLocal写本地:写入本地replica、写方法立即返回、之后disseminated with gossip;

2、WriteTo(n)写n个:写入值需要写到至少n个replicas去包括本地replica;

3、WriteMajority写多数:写入值需要写到占集群多数个的replicas去,比如:N/2 + 1个,N是集群节点机数量。可以为WriteMajority和ReadMajority定义最少节点数minCap,这样可以减少读到陈旧数据的风险,minCap定义了多数值Majority,最低是N / 2 + 1.

  对于小集群来说(节点机<7),成员变动可能很容易影响多数值Majority.   此时minCap更有意义。

4、WriteAll写全部:实时的、同步的、强一致写,集群所有节点全写完、才算写完,此时是CP系统;

  读一样有上述一致性指定。在你本地,你所做的所有写以及读写之间都是有序的、有保障的。写是否成功是通过消息告知你的:Replicator.UpdateSuccess/UpdateFailure,这是异步的,我们知道凡是异步消息其ack需要采用类似correlationID形式做到:In the Update message you can pass an optional request context, which the Replicator does not care about, but is included in the reply messages. This is a convenient way to pass contextual information (e.g. original sender) without having to use ask or maintain local correlation data structures.

  读的结果数据也是通过消息给到你,读写能够在指定timeout内按照指定一致性级别完成则返回成功消息。

你可能感兴趣的:(Akka DData分布式数据缓存)