IGNITE 关联并置(Affinity Colocation)和分布式关联(Distributed Joins)

2023-10-28 20:59

本文主要是介绍IGNITE 关联并置(Affinity Colocation)和分布式关联(Distributed Joins),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、并置关联(Affinity Colocation)

在许多情况下,如果不同的条目经常一起访问,则将它们并置在一起就很有用,即在一个节点(存储对象的节点)上就可以执行多条目查询,这个概念称为关联并置。

关联函数将条目分配给分区,具有相同关联键的对象将进入相同的分区,这样就可以设计将相关条目存储在一起的数据模型,这里的“相关”是指处于父子关系的对象或经常一起查询的对象。

我的理解:如果是分区模式partition,那么关联函数会确定键/主键对应的partition编号,会将大的数据拆分为多个小块,分别存储到不同index的partition中。如果分别存储在不同键中的数据经常一起查询(类似于SQL的多表联合查询),那么就最好使用并置关联。

使用方式见官网资料,主要就是affinity_key关键字。数据建模 | Apache Ignite - 分布式内存数据库


2、分布式关联(Distributed Joins)

分布式关联是指SQL语句中通过关联子句组合了两个或者更多的分区表,如果这些表关联在分区列(关联键)上,该关联称为并置关联,否则称为非并置关联

Ignite默认将每个关联查询都视为并置关联,并按照并置的模式执行

 

我的理解:多表联合查询时候,关联键是分区列(默认主键或者通过affinity_key声明的列),那么就是并置关联,否则就是非并置关联。默认情况下视为并置关联(distributdJoins=false),如果要采用非并置关联,需要设置distributdJoins=true


 3、一些尝试

   环境:ignite-2.14.0,ignite single server

  3.1两表联查

  •  未使用并置关联:
CREATE TABLE IF NOT EXISTS PERSON (ID INT,NAME VARCHAR,EMAIL VARCHAR,COMPANY_ID VARCHAR,PRIMARY KEY (ID)
) WITH "TEMPLATE=PARTITIONED";CREATE TABLE IF NOT EXISTS COMPANY (ID INT,NAME VARCHAR,PRIMARY KEY (ID)
) WITH "TEMPLATE=PARTITIONED";INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10001, 'TOM', 'TOM@123.COM',1);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10002, 'LILY', 'LILY@123.COM',1);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10003, 'SHERRY', 'SHERRY@123.COM',2);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10004, 'PETTER', 'PETTER@123.COM',2);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10005, 'LIVIA', 'LIVIA@123.COM',3); INSERT INTO COMPANY (ID, NAME) VALUES(1, 'A-COMPANY');
INSERT INTO COMPANY (ID, NAME) VALUES(2, 'B-COMPANY');
INSERT INTO COMPANY (ID, NAME) VALUES(3, 'C-COMPANY');

这里partition的index大致结果是id%1024(因为默认1024个分区),但是这并不是简单的哈希映射,起码节点宕机,未受影响的节点partition index并不会发生变化。

1.使用默认并置关联查询:当关联时用主表的列当查询条件,副表的列信息未查询出来。可以用ignite2.7.5再试试

./sqlline.sh --verbose=true -u "jdbc:ignite:thin://127.0.0.1:10800;user=ignite;password=ignite"

2.使用非并置查询:查询结果没问题

./sqlline.sh --verbose=true -u "jdbc:ignite:thin://127.0.0.1:10800;user=ignite;password=ignite;distributedJoins=true"

  • 使用并置关联
CREATE TABLE IF NOT EXISTS PERSON (ID INT,NAME VARCHAR,EMAIL VARCHAR,COMPANY_ID VARCHAR,PRIMARY KEY (ID, COMPANY_ID)
) WITH "TEMPLATE=PARTITIONED,AFFINITY_KEY=COMPANY_ID";CREATE TABLE IF NOT EXISTS COMPANY (ID INT,NAME VARCHAR,PRIMARY KEY (ID)
) WITH "TEMPLATE=PARTITIONED";INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10001, 'TOM', 'TOM@123.COM',1);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10002, 'LILY', 'LILY@123.COM',1);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10003, 'SHERRY', 'SHERRY@123.COM',2);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10004, 'PETTER', 'PETTER@123.COM',2);
INSERT INTO PERSON (ID, NAME, EMAIL, COMPANY_ID) VALUES(10005, 'LIVIA', 'LIVIA@123.COM',3); INSERT INTO COMPANY (ID, NAME) VALUES(1, 'A-COMPANY');
INSERT INTO COMPANY (ID, NAME) VALUES(2, 'B-COMPANY');
INSERT INTO COMPANY (ID, NAME) VALUES(3, 'C-COMPANY');

这里person的partition index发生了变化,不清楚计算规则。

1.使用默认并置关联查询:查询无误

./sqlline.sh --verbose=true -u "jdbc:ignite:thin://127.0.0.1:10800;user=ignite;password=ignite"

2.使用非并置查询:查询结果没问题。但是感觉多此一举。

./sqlline.sh --verbose=true -u "jdbc:ignite:thin://127.0.0.1:10800;user=ignite;password=ignite;distributedJoins=true"

3.2 三表联查

有两张主表STUDENT和COURSE,以及一张中间表STUDENT_COURSE,如果要按照并置处理,那么中间表的两个字段STUDENT_ID和COURSE_ID都应该并置关联处理,但是affinity_Key只支持一个。所以这里只能用非并置处理。

CREATE TABLE STUDENT(ID BIGINT PRIMARY KEY,NAME VARCHAR,EMAIL VARCHAR,
) WITH "TEMPLATE=PARTITIONED,ATOMICITY=TRANSACTIONAL_SNAPSHOT";INSERT INTO STUDENT (ID, NAME, EMAIL) VALUES(10001, 'Tom', 'tom@123.com');
INSERT INTO STUDENT (ID, NAME, EMAIL) VALUES(10002, 'Lily', 'lily@123.com');
INSERT INTO STUDENT (ID, NAME, EMAIL) VALUES(10003, 'Sherry', 'sherry@123.com');
INSERT INTO STUDENT (ID, NAME, EMAIL) VALUES(10004, 'Petter', 'petter@123.com');
INSERT INTO STUDENT (ID, NAME, EMAIL) VALUES(10005, 'Livia', 'livia@123.com');CREATE TABLE STUDENT_COURSE(ID BIGINT PRIMARY KEY,STUDENT_ID BIGINT NOT NULL,COURSE_ID  BIGINT NOT NULL
) WITH "TEMPLATE=PARTITIONED,ATOMICITY=TRANSACTIONAL_SNAPSHOT";INSERT INTO STUDENT_COURSE (ID, STUDENT_ID, COURSE_ID) VALUES(1, 10001, 1);
INSERT INTO STUDENT_COURSE (ID, STUDENT_ID, COURSE_ID) VALUES(2, 10002, 2);
INSERT INTO STUDENT_COURSE (ID, STUDENT_ID, COURSE_ID) VALUES(3, 10003, 3);
INSERT INTO STUDENT_COURSE (ID, STUDENT_ID, COURSE_ID) VALUES(4, 10004, 2);
INSERT INTO STUDENT_COURSE (ID, STUDENT_ID, COURSE_ID) VALUES(5, 10005, 3);CREATE TABLE COURSE(ID BIGINT PRIMARY KEY,NAME VARCHAR,CREDIT_RATING INT,
) WITH "TEMPLATE=PARTITIONED,ATOMICITY=TRANSACTIONAL_SNAPSHOT";INSERT INTO COURSE (ID, NAME, CREDIT_RATING) VALUES(1, 'Criminal Evidence', 20);
INSERT INTO COURSE (ID, NAME, CREDIT_RATING) VALUES(2, 'Employment Law', 10);
INSERT INTO COURSE (ID, NAME, CREDIT_RATING) VALUES(3, 'Jurisprudence', 30);
  • 使用并置查询。我们先使用并置查询试试,结果确实是某些列无法查出结果。奇怪的是在2.7.5版本的ignite,此现象并不会出现。

./sqlline.sh --verbose=true -u "jdbc:ignite:thin://127.0.0.1:10800;user=ignite;password=ignite"

  • 使用非并置查询:查询报错,提示分布式查询没有使用索引。

./sqlline.sh --verbose=true -u "jdbc:ignite:thin://127.0.0.1:10800;user=ignite;password=ignite;distributedJoins=true"

添加索引

CREATE INDEX IF NOT EXISTS STUDENT_COURSE_INDEX ON STUDENT_COURSE (STUDENT_ID,COURSE_ID);

在查询,结果无误。

 这个有个问题是:

官网描述是对于replicated模式,需要创建索引,否则异常,但是我的建表语句明确指明是partition模式,为何不建索引所以会出现异常?

这篇关于IGNITE 关联并置(Affinity Colocation)和分布式关联(Distributed Joins)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295906

相关文章

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Redis分布式锁使用及说明

《Redis分布式锁使用及说明》本文总结了Redis和Zookeeper在高可用性和高一致性场景下的应用,并详细介绍了Redis的分布式锁实现方式,包括使用Lua脚本和续期机制,最后,提到了RedLo... 目录Redis分布式锁加锁方式怎么会解错锁?举个小案例吧解锁方式续期总结Redis分布式锁如果追求

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端

laravel框架实现redis分布式集群原理

在app/config/database.php中配置如下: 'redis' => array('cluster' => true,'default' => array('host' => '172.21.107.247','port' => 6379,),'redis1' => array('host' => '172.21.107.248','port' => 6379,),) 其中cl

基于MySQL实现的分布式锁

概述 在单机时代,虽然不需要分布式锁,但也面临过类似的问题,只不过在单机的情况下,如果有多个线程要同时访问某个共享资源的时候,我们可以采用线程间加锁的机制,即当某个线程获取到这个资源后,就立即对这个资源进行加锁,当使用完资源之后,再解锁,其它线程就可以接着使用了。例如,在JAVA中,甚至专门提供了一些处理锁机制的一些API(synchronize/Lock等)。 但是到了分布式系统的时代,这种

C++ STL关联容器Set与集合论入门

1. 简介 Set(集合)属于关联式容器,也是STL中最实用的容器,关联式容器依据特定的排序准则,自动为其元素排序。Set集合的底层使用一颗红黑树,其属于一种非线性的数据结构,每一次插入数据都会自动进行排序,注意,不是需要排序时再排序,而是每一次插入数据的时候其都会自动进行排序。因此,Set中的元素总是顺序的。 Set的性质有:数据自动进行排序且数据唯一,是一种集合元素,允许进行数学上的集合相

Kafka 分布式消息系统详细介绍

Kafka 分布式消息系统 一、Kafka 概述1.1 Kafka 定义1.2 Kafka 设计目标1.3 Kafka 特点 二、Kafka 架构设计2.1 基本架构2.2 Topic 和 Partition2.3 消费者和消费者组2.4 Replica 副本 三、Kafka 分布式集群搭建3.1 下载解压3.1.1 上传解压 3.2 修改 Kafka 配置文件3.2.1 修改zookeep

Spring Cloud整合Seata实现分布式事务

文章目录 1.Seata1.1 官网1.2 下载1.3 通过安装包运行seata1.3.1 解压seata-server-1.3.0.zip1.3.2 修改 conf/file.conf 配置文件1.3.3 修改conf/registry.conf配置文件1.3.4 添加seata配置信息到nacos1.3.5 配置seata服务端数据库表结构1.3.6 启动seata 2.Spring