在SequoiaDB集群环境中,用户往往将数据存放在不同的逻辑节点与物理节点中,以达到并行计算的目的。

分区:把包含相同数据的一组数据节点叫一个分区,如上图绿色方块组成三个分区。
分区键:切分时,所依据的字段称为分区键。

SequoiaDB包含范围分区Hash分区,根据上图所示进行部署,分别介绍两种分区的实际操作。

分配三台机器用于建立该集群,IP分配如下:

192.168.9.181
192.168.9.182
192.168.9.183

配置IP与主机名的对应关系如下:

192.168.9.181  bl465-1
192.168.9.182  bl465-2
192.168.9.183  bl465-3

然后规划主机与节点之间的对应关系如下:

coord(协调)节点:192.168.9.181 50000
catalog(编目)节点:192.168.9.182 30000

3个数据组,9个数据节点:

datagroup1

192.168.9.181 51000
192.168.9.182 51000
192.168.9.183 51000

datagroup2

192.168.9.181 52000
192.168.9.182 52000
192.168.9.182 52000

datagroup3

192.168.9.181 53000
192.168.9.182 53000
192.168.9.182 53000

请参照SequoiaDB官网的其它文章完成该集群的安装。

范围分区

1.创建集合时,指定分区类型为range和分区键{no:1}

>db.test.createCL(‘test’,{ShardingKey:{no:1},ShardingType:’range’})
localhost:50000.test.test
Take 2.431560s

2.确定当前集合所落的数据组,该数据组是切分的源,当前为datagroup2

> db.snapshot(4)
{
“Name”: ”test.test”,
“Details”: [
{
"GroupName": "datagroup2",
"Group": [
{
"ID": 0,
"LogicalID": 0,
"Sequence": 1,
"Indexes": 2,
"Status": "Normal",
"NodeName": "bl465-1:52000"
},
{
"ID": 0,
"LogicalID": 0,
"Sequence": 1,
"Indexes": 2,
"Status": "Normal",
"NodeName": "bl465-2:52000"
},
{
"ID": 0,
"LogicalID": 0,
"Sequence": 1,
"Indexes": 2,
"Status": "Normal",
"NodeName": "bl465-3:52000"
}
]
}
]
}
Return 1 row(s).
Takes 0.297931s.

3.切分,当前将no为[0,3333)之间的数据安排在datagroup1上,将no为[6666, ∞)之间的数据安排在datagroup3上,其它数据落在datagroup2上

> db.test.test.split("datagroup2", "datagroup1", {no:0},{no:3333})
Takes 0.4176s.
> db.test.test.split("datagroup2","datagroup3", {no:6666})
Takes 0.18957s.

4.查看数据分布情况

> db.snapshot(8)
{
"CataInfo": [
{
"GroupID": 1001,
"GroupName": "datagroup2",
"LowBound": {
"": {
"$minKey": 1
}
},
"UpBound": {
"": 0
}
},
{
"GroupID": 1000,
"GroupName": "datagroup1",
"LowBound": {
"": 0
},
"UpBound": {
"": 3333
}
},
{
"GroupID": 1001,
"GroupName": "datagroup2",
"LowBound": {
"": 3333
},
"UpBound": {
"": 6666
}
},
{
"GroupID": 1002,
"GroupName": "datagroup3",
"LowBound": {
"": 6666
},
"UpBound": {
"": {
"$maxKey": 1
}
}
}
],
“EnsureShardingIndex”: true,
“Name”: ”test.test”,
“ReplSize”: 1,
“ShardingKey”: {
“no”: 1
},
“ShardingType”: ”range”,
“Version”: 3,
“_id”: {
“$oid”: ”52665351fe13241aaa547a7f”
}
}
Return 1 row(s).
Takes 0.10201s.

5.插入数据,验证结果。

> for (i=0; i <10000; ++i){db.test.test.insert({no:i,nm:”name”+i, age:18 + i%3})}
Takes 3.418974s.

> db.getRG(‘datagroup1′).getMaster()
bl465-3:51000
Takes 0.2193s.

>datadb = new Sdb(‘ bl465-3′, 51000)
bl465-3:51000
Takes 4.4294532096s.

> datadb.test.test.find().sort({no:1}).limit(1)
{
“_id”: {
“$oid”: ”526655307a9e237453000000″
},
“no”: ,
“nm”: ”name0″,
“age”: 18
}
Return 1 row(s).
Takes 0.1231s.

> datadb.test.test.find().sort({no:-1}).limit(1)
{
“_id”: {
“$oid”: ”526655317a9e237453000d04″
},
“no”: ,
“nm”: ”name3332″,
“age”: 20
}
Return 1 row(s).
Takes 0.1231s.

Hash分区

1.创建集合指定分区类型为hash和分区键{no:1}

> db.tst.createCL(‘tst’,{ShardingType:’hash’, ShardingKey:{no:1}})
localhost:50000.tst.tst
Takes 4.4294289444s.

2.确定当前集合所落的数据组,该数据组是切分的源,当前为datagroup2

> db.snapshot(4)
{
“Name”: ”tst.tst”,
“Details”: [
{
"GroupName": "datagroup2",
"Group": [
{
"ID": 0,
"LogicalID": 0,
"Sequence": 1,
"Indexes": 2,
"Status": "Normal",
"NodeName": "bl465-1:52000"
},
{
"ID": 0,
"LogicalID": 0,
"Sequence": 1,
"Indexes": 2,
"Status": "Normal",
"NodeName": "bl465-3:52000"
},
{
"ID": 0,
"LogicalID": 0,
"Sequence": 1,
"Indexes": 2,
"Status": "Normal",
"NodeName": "bl465-2:52000"
}
]
}
]
}

3.切分,针对分区键hash后落在分片[0,1365]之间的数据指定到datagroup1,针对分区键hash后落在分片[1365,2370]之间的数据指定到datagroup3,其它分片上的数据保留在datagroup2上。

> db.tst.tst.split(“datagroup2″, ”datagroup1″,{Partition:0},{Partition:1365})
Takes 0.2765s.
> db.tst.tst.split(“datagroup2″, ”datagroup3″,{Partition:1365},{Partition:2370})
Takes 0.2609s.

4.查看数据分布

> db.snapshot(8)
{
“CataInfo”: [
{
"GroupID": 1000,
"GroupName": "datagroup1",
"LowBound": {
"": 0
},
"UpBound": {
"Partition": 1365
}
},
{
"GroupID": 1002,
"GroupName": "datagroup3",
"LowBound": {
"Partition": 1365
},
"UpBound": {
"Partition": 2730
}
},
{
"GroupID": 1001,
"GroupName": "datagroup2",
"LowBound": {
"Partition": 2730
},
"UpBound": {
"": 4096
}
}
],
“EnsureShardingIndex”: true,
“Name”: ”tst.tst”,
“Partition”: 4096,
“ReplSize”: 1,
“ShardingKey”: {
“no”: 1
},
“ShardingType”: ”hash”,
“Version”: 3,
“_id”: {
“$oid”: ”5266d55efe13241aaa547a8f”
}
}
Return 1 row(s).
Takes 1.4294635948s.

5.插入数据,验证结果

插入4096条记录

> for (i = 0; i <4096; ++i) {db.tst.tst.insert({no:i,stu:”nm”+i,age:18+i%3})}
测试记录的分布情况
数据组 datagroup1

> db.getRG(‘datagroup1′).getMaster()
bl465-3:51000
Takes 1.4294407727s.
> datadb = new Sdb(‘bl465-3′,51000)
bl465-3:51000
Takes 0.24866s.
> datadb.tst.tst.count()
1355

数据组 datagroup2

> db.getRG(‘datagroup2′).getMaster()
bl465-2:52000
Takes 0.2485s.
> datadb = new Sdb(‘bl465-2′,52000)
bl465-2:52000
Takes 0.183708s.
> datadb.tst.tst.count()
1356

数据组 datagroup3

> db.getRG(‘datagroup3′).getMaster()
bl465-2:53000
Takes 0.188564s.
> datadb = new Sdb(‘bl465-2′,53000)
bl465-2:53000
Takes 0.195282s.
> datadb.tst.tst.count()
1385
Takes 0.20218s.

组所占分片数的比例与数据所占比例基本持平,则认为hash分布是比较均衡的。

小结:

需要注意的点:

1.在创建CL时,必须指定ShardingKey。
2.插入的记录必须含指定的ShardingKey才能实现切分。
3.分区键不存在时,split操作会导致数据全量转移。
4.范围切分中的百分比切分,要求集合不能为空。
5.百分比切分,是基于原数据组中的数据量而言的。
6.hash分区,要求分片数其值必须是2的幂。

SequoiaDB的数据分区操作的更多相关文章

  1. 【巨杉数据库SequoiaDB】巨杉Tech | 巨杉数据库数据高性能数据导入迁移实践

    SequoiaDB 一款自研金融级分布式数据库产品,支持标准SQL和分布式事务功能.支持复杂索引查询,兼容 MySQL.PGSQL.SparkSQL等SQL访问方式.SequoiaDB 在分布式存储功 ...

  2. SequoiaDB 系列之三 :SequoiaDB的高级功能

    上一篇简单描述了一下SequoiaDB的简单CRUD操作,本篇将讲述一下稍微高级点的功能. 部署在我机器上的集群环境,在经过创建名字为"foo"的cs,创建名字为"bar ...

  3. 非关系型数据库SequoiaDB虚拟机下应用初探

    SequoiaDB是广州巨杉软件有限公司开发的一款新型分布式非关系型数据库.可应用于linux操作系统下.在虚拟机下试用了一下(操作系统Ubuntu),感觉不错,操控简单易上手,在此分享一下心得. 下 ...

  4. SequoiaDB x Spark 新主流架构引领企业级应用

    6月,汇集当今大数据界精英的Spark Summit 2017盛大召开,Spark作为当今最炙手可热的大数据技术框架,向全世界展示了最新的技术成果.生态体系及未来发展规划. 巨杉作为业内领先的分布式数 ...

  5. 开源分布式数据库SequoiaDB在去哪儿网的实践

    编者注: 中国的数据库行业也迎来了一波新的热点事件.分布式数据库这块新消息不断,也让大家开始关注中国的分布式数据库.首先是短短一周内,Pingcap和SequoiaDB巨杉数据库陆续宣布了C轮的数千万 ...

  6. 巨杉Tech | Hbase迁移至SequoiaDB 实战

    背景 在传统银行 IT 架构中,联机交易与统计分析系统往往采用不同的技术与物理设备,通过定期执行的 ETL 将联机交易数据向分析系统中迁移.而作为数据服务资源池,同一份数据可能被不同类型的微服务共享访 ...

  7. 【巨杉数据库SequoiaDB】巨杉Tech | 四步走,快速诊断数据库集群状态

    1.背景 SequoiaDB 巨杉数据库是一款金融级分布式数据库,包括了分布式 NewSQL.分布式文件系统与对象存储.与高性能 NoSQL 三种存储模式,分别对应分布式在线交易.非结构化数据和内容管 ...

  8. 巨杉Tech | SparkSQL+SequoiaDB 性能调优策略

    当今时代,企业数据越发膨胀.数据是企业的价值,但数据处理也是一种技术挑战.在海量数据处理的场景,即使单机计算能力再强,也无法满足日益增长的数据处理需求.所以,分布式才是解决该类问题的根本解决方案.而在 ...

  9. DB2错误码信息

    00 完全成功完成 表 3  01 警告 表 4  02 无数据 表 5  07 动态 SQL 错误 表 6  08 连接异常 表 7  09 触发操作异常 表 8  0A 功能部件不受支持 表 9  ...

随机推荐

  1. [SQL]SqL给局部变量赋值有两种方法

    给局部变量赋值有两种方法: .SET @variable_name=value .SELECT @variable_name=value 两者的区别:SET赋值语句一般用于赋给变量一个指定的常量,SE ...

  2. NYOJ 47-过河问题

    点击打开链接 过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不 ...

  3. IO/NIO

    1.转换流,Buffered BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out)); BufferedRe ...

  4. Oracle Cluster Registry Location to be Added is not Accessible

    APPLIES TO: Oracle Server - Enterprise Edition - Version 11.2.0.1 and laterInformation in this docum ...

  5. IEnumerable和List有什么区别?

    如下.IList接口可以使用更多的方法.比如你看一个集合是否包含相应实体, IEnumerable不行,而 IList里有Contains,相应的实现了IList的可以添加,删除相应实体.而IEnum ...

  6. 关于AS3获取当前URL和浏览器信息

    原文链接: http://www.baidu.com/link?url=8-mS_wTlQi5MGvLQ8Oqf34wA-glS4roi0AmMswussY3kpkXoVUnOQQOaj-NGf2Ik ...

  7. 处理SVN的提交代码冲突

    工具: 一台开发的电脑,myeclipse,TortoiseSVN1.8 步骤: 1.不管是提交.更新.编辑冲突第一个操作都应该是和资源库进行同步,项目右键==>Team==>于资源库同步 ...

  8. sql基础查询语句

    数据库文件百度云地址:www.pan.baidu.com 脚步:下载博客园文件:select_learn.rar 1.TOP限制返回行数[percent] * from book_info --显示前 ...

  9. markdown语法学习源码

    __注: 结合markdown官方文档 其中大部分例子和说明文字都摘自官方文档__官方链接:[Markdown: Basics (快速入门)](http://wowubuntu.com/markdow ...

  10. 解决win 7&win xp等系统无法正常用U盘安装或启动

    目前,制作启动U盘通常是用ultraiso,但由于各种硬件设备与系统的更新,导致现在装系统会出现各种错误. 在用ultraiso制作的启动U盘,装XP时,可能找不到引导项:装win7时,可能提示”wi ...