理解缓存键,索引,分区和关联性w.r.t读写

时间:2017-03-15 21:59:37

标签: apache partition ignite gridgain affinity

我是Apache Ignite的新手,来自数据仓库背景。 如果我尝试通过DBMS术语与Ignite联系,请原谅我。 我已经通过论坛,但我仍然不清楚一些基础知识。

我也想了解我稍后发布的方案的具体答案。

1。)CacheMode = PARTITIONED    a。)当缓存被声明为分区时,数据是否相同        默认情况下跨所有节点分区?

b。)是否可以根据数据提供“分区键”        会分布在各个节点上吗?这就是我们所说的亲和力        键?

c。)分区如何与亲和力不同,缓存可以兼具        分区和关联密钥?

2。)亲和力概念 定义了Affinity Key后,当我将数据(使用loadCache())加载到分区缓存中时,源行是否会被发送到它们所属的节点或集群上的所有节点?

3.。)如果我在缓存上创建一个索引,默认情况下是否成为分区/ 亲和键也是?在这种情况下,分区如何与索引不同?

SCNEARIO DESCRIPTION

我想使用loadCache()将数据从持久层加载到Staging Cache(假设~2B)。缓存驻留在4节点群集上。 a。)如何加载数据,使每个节点只处理0.5B记录?     是使用分区缓存模式还是定义关联密钥?

然后我想在TRANSACTIONAL原子模式下从Staging Cache读取事务,查找目标Cache并执行一些操作。

b。)当我在目标高速缓存上进行查找时,如何确保仅在数据所在的节点上进行查找,而不是在目标高速缓存所在的所有节点上进行查找? 那会使用AffinityKeyMapper API吗?如果有,怎么样?

c。)假设我想对Affinity Key列以外的其他键进行查找,可以在查阅列帮助中创建索引吗?在这种情况下,我最终会扫描所有节点吗?

暂存缓存 顾客ID CustomerEmail CustomerPhone

目标缓存 SEQ_NUM 顾客ID CustomerEmail CustomerPhone 开始日期 EndDate

1 个答案:

答案 0 :(得分:0)

Apache Ignite用户论坛上回答了这个问题:http://apache-ignite-users.70518.x6.nabble.com/Understanding-Cache-Key-Indexes-Partition-and-Affinity-td11212.html

  1. Ignite使用AffinityFunction [1]进行数据分发。 AF实现两个映射:key-> partition和partition->节点。 键 - >分区映射绝对是分区的映射条目。它不需要备份,而是分区上的数据配置\分配。 通常,入口密钥(实际上是它的哈希码)用于计算属于的分区条目。 但您可以使用AffinityKey [2]来代替管理数据并置。另请参阅'org.apache.ignite.cache.affinity.AffinityKey'javadoc。
  2. 分区 - >节点映射确定分区的主节点和备份节点。它不需要数据配置,而是节点之间的备份和分区分配

    Cache.loadCache只是让所有节点都调用localLoadCache方法。其中调用CacheStore.loadCache。因此,每个网格节点都将从缓存存储中加载所有数据,然后丢弃非本地节点的数据。

    1. 如果使用备份,则相同的数据可能驻留在多个节点上。 AffinityKey应该是条目键的一部分,如果配置了AffinityKey映射,那么将使用AffinityKey而不是条目键进行入口 - >分区映射 和AffinityKey将被传递给AffinityFunction。

    2. 索引始终与数据位于同一节点上。

    3. 一个。要实现此目的,您应该实现CacheStore.loadCache方法来加载某些分区的数据。例如。您可以为数据库中的每一行存储partitionID。 但是,如果更改AF或分区编号,则还应更新数据库中条目的partitionID。

      另一种方式。如果它是可行的,您可以在单个节点中加载所有数据,然后将其他节点添加到网格中。数据将自动在节点上重新平衡。

      湾始终使用AffinityKey,因为它应该是条目键的一部分。因此,查找将始终发生在数据所在的节点上。

      ℃。我无法理解这个问题。请您澄清它是否仍然存在?

相关问题