本文主要介绍分区集合的概念,分区的类型,以及分区的方式。
----分区集合
一个定义了分区键的集合为分区集合。分区集合可以按照分区键所指定的字段,将集合中的数据切分到超过一个数据分区组中。
当集合创建时,用户可以指定分区键。分区集合会在一个随机的数据分区组中创建。用户可以使用手工切分的方式对集合按照某一规则切分至多个数据分区组中。
----分区类型
分区主要有3种方式:水平分区,垂直分区,混合分区。
水平分区就是把集合的子分区放在不同的分区组,垂直分区就是把集合的子分区放在不同的集合空间。水平分区需要建立多个分区组,垂直分区需要建立多个集合空间。水平分区可以实现多台机器同时进行扫描数据,垂直分区可以实现单台机器同时扫描多个数据文件。
--水平分区
在 SequoiaDB 集群环境中,用户可以通过将一个集合中的数据切分到多个复制组中,以达到并行计算的目的,此数据切分称为水平分区。水平分区是按一定的条件把全局关系的所有元组划分成若干不相交的子集,每个子集为关系的一个片段,称为分区;一个分区只能存在于一个复制组中,但一个复制组可以承载多个分区;分区在复制组之间可以通过水平切分操作进行移动。
--垂直分区
在 SequoiaDB集群环境中,用户也可以将一个集合全局关系的属性分成若干子集,并在这些子集上作投影运算,将这些子集映射到另外的集合上,从而实现集合关系的垂直切分;该集合称之为主集合,每个切分的子集称为分区,分区映射的集合称为子集合;一个分区只能映射到一个子集合中,但一个子集合可以承载多个分区;分区在子集合之间可以通过垂直切分操作进行重映射。
--混合分区
在 SequoiaDB 集群环境中,可以将集合先通过垂直分区映射到多个子集合中,再通过水平分区将子集合切分到多个复制组中,从而实现混合分区。
----分区方式
--Range分区
水平分区即可使用Hash 方式也可使用Range 方式进行数据分区。
垂直分区只能使用Range 方式进行数据分区。
Range 方式下依据记录中分区键的范围选择所要插入的分区。
--Hash分区
Hash方式下根据记录中分区键生成的 hash 值选择所要插入的分区。
Hash 及 Range这两种分区方式判定分区划分所依据的字段称为“分区键”。分区键基于集合定义,每个分区键可以包含一个或多个字段。
创建脚本:
--range分区和hash分区
var db = new Sdb('localhost',11810)
//主表
//db.scott.dropCL("t_test_range")
db.scott.createCL("t_test_range",{IsMainCL:true,ShardingType:"range",ShardingKey:{dsdm:1}})
//子表 左开右闭原则
db.scott.createCL("t_test_range440100",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range440200",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range440400",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range440500",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range440600",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range440700",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range440800",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range440900",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range441200",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range441300",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range441400",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range441500",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range441600",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range441700",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range441800",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range441900",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range442000",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range445100",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range445200",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
db.scott.createCL("t_test_range445300",{ShardingKey:{colname:1},ShardingType:"hash",Partition:8,Group:"datagroup"})
//设置关系
db.scott.t_test_range.attachCL("scott.t_test_range440100",{LowBound:{dsdm:"440100"},UpBound:{dsdm:"440200"}})
db.scott.t_test_range.attachCL("scott.t_test_range440200",{LowBound:{dsdm:"440200"},UpBound:{dsdm:"440400"}})
db.scott.t_test_range.attachCL("scott.t_test_range440400",{LowBound:{dsdm:"440400"},UpBound:{dsdm:"440500"}})
db.scott.t_test_range.attachCL("scott.t_test_range440500",{LowBound:{dsdm:"440500"},UpBound:{dsdm:"440600"}})
db.scott.t_test_range.attachCL("scott.t_test_range440600",{LowBound:{dsdm:"440600"},UpBound:{dsdm:"440700"}})
db.scott.t_test_range.attachCL("scott.t_test_range440700",{LowBound:{dsdm:"440700"},UpBound:{dsdm:"440800"}})
db.scott.t_test_range.attachCL("scott.t_test_range440800",{LowBound:{dsdm:"440800"},UpBound:{dsdm:"440900"}})
db.scott.t_test_range.attachCL("scott.t_test_range440900",{LowBound:{dsdm:"440900"},UpBound:{dsdm:"441200"}})
db.scott.t_test_range.attachCL("scott.t_test_range441200",{LowBound:{dsdm:"441200"},UpBound:{dsdm:"441300"}})
db.scott.t_test_range.attachCL("scott.t_test_range441300",{LowBound:{dsdm:"441300"},UpBound:{dsdm:"441400"}})
db.scott.t_test_range.attachCL("scott.t_test_range441400",{LowBound:{dsdm:"441400"},UpBound:{dsdm:"441500"}})
db.scott.t_test_range.attachCL("scott.t_test_range441500",{LowBound:{dsdm:"441500"},UpBound:{dsdm:"441600"}})
db.scott.t_test_range.attachCL("scott.t_test_range441600",{LowBound:{dsdm:"441600"},UpBound:{dsdm:"441700"}})
db.scott.t_test_range.attachCL("scott.t_test_range441700",{LowBound:{dsdm:"441700"},UpBound:{dsdm:"441800"}})
db.scott.t_test_range.attachCL("scott.t_test_range441800",{LowBound:{dsdm:"441800"},UpBound:{dsdm:"441900"}})
db.scott.t_test_range.attachCL("scott.t_test_range441900",{LowBound:{dsdm:"441900"},UpBound:{dsdm:"442000"}})
db.scott.t_test_range.attachCL("scott.t_test_range442000",{LowBound:{dsdm:"442000"},UpBound:{dsdm:"445100"}})
db.scott.t_test_range.attachCL("scott.t_test_range445100",{LowBound:{dsdm:"445100"},UpBound:{dsdm:"445200"}})
db.scott.t_test_range.attachCL("scott.t_test_range445200",{LowBound:{dsdm:"445200"},UpBound:{dsdm:"445300"}})
db.scott.t_test_range.attachCL("scott.t_test_range445300",{LowBound:{dsdm:"445300"},UpBound:{dsdm:"445400"}})
--查看执行计划
db.scott.t_test_range.find().explain({Run:false})
用到了3个节点
"NodeName": "node1:11820",
"NodeName": "node2:11820",
"NodeName": "node3:11820",
将子表建立在不同的collectionspace中,又叫垂直分区。不同的collectionspace会形成不同的数据文件。
--hash分区表
db.scott.dropCL("t_test_hash")
db.scott.createCL("t_test_hash",{ShardingKey:{dsdm:1},ShardingType:"hash",Partition:32,Group:"datagroup"})
--split切分数据
db.scott.person.split("datagroup","datagroup02",50)
db.scott.person02.split("datagroup","datagroup02",{age:3000},{age:4000})
数据切分及分区上的数据范围皆遵循左闭右开原则。即:{age:3000},{age:4000} 代表迁移数据范围为[3000, 4000)。