SequoiaDB的数据分区操作
在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的数据分区操作的更多相关文章
- 【巨杉数据库SequoiaDB】巨杉Tech | 巨杉数据库数据高性能数据导入迁移实践
SequoiaDB 一款自研金融级分布式数据库产品,支持标准SQL和分布式事务功能.支持复杂索引查询,兼容 MySQL.PGSQL.SparkSQL等SQL访问方式.SequoiaDB 在分布式存储功 ...
- SequoiaDB 系列之三 :SequoiaDB的高级功能
上一篇简单描述了一下SequoiaDB的简单CRUD操作,本篇将讲述一下稍微高级点的功能. 部署在我机器上的集群环境,在经过创建名字为"foo"的cs,创建名字为"bar ...
- 非关系型数据库SequoiaDB虚拟机下应用初探
SequoiaDB是广州巨杉软件有限公司开发的一款新型分布式非关系型数据库.可应用于linux操作系统下.在虚拟机下试用了一下(操作系统Ubuntu),感觉不错,操控简单易上手,在此分享一下心得. 下 ...
- SequoiaDB x Spark 新主流架构引领企业级应用
6月,汇集当今大数据界精英的Spark Summit 2017盛大召开,Spark作为当今最炙手可热的大数据技术框架,向全世界展示了最新的技术成果.生态体系及未来发展规划. 巨杉作为业内领先的分布式数 ...
- 开源分布式数据库SequoiaDB在去哪儿网的实践
编者注: 中国的数据库行业也迎来了一波新的热点事件.分布式数据库这块新消息不断,也让大家开始关注中国的分布式数据库.首先是短短一周内,Pingcap和SequoiaDB巨杉数据库陆续宣布了C轮的数千万 ...
- 巨杉Tech | Hbase迁移至SequoiaDB 实战
背景 在传统银行 IT 架构中,联机交易与统计分析系统往往采用不同的技术与物理设备,通过定期执行的 ETL 将联机交易数据向分析系统中迁移.而作为数据服务资源池,同一份数据可能被不同类型的微服务共享访 ...
- 【巨杉数据库SequoiaDB】巨杉Tech | 四步走,快速诊断数据库集群状态
1.背景 SequoiaDB 巨杉数据库是一款金融级分布式数据库,包括了分布式 NewSQL.分布式文件系统与对象存储.与高性能 NoSQL 三种存储模式,分别对应分布式在线交易.非结构化数据和内容管 ...
- 巨杉Tech | SparkSQL+SequoiaDB 性能调优策略
当今时代,企业数据越发膨胀.数据是企业的价值,但数据处理也是一种技术挑战.在海量数据处理的场景,即使单机计算能力再强,也无法满足日益增长的数据处理需求.所以,分布式才是解决该类问题的根本解决方案.而在 ...
- DB2错误码信息
00 完全成功完成 表 3 01 警告 表 4 02 无数据 表 5 07 动态 SQL 错误 表 6 08 连接异常 表 7 09 触发操作异常 表 8 0A 功能部件不受支持 表 9 ...
随机推荐
- Java错误:很奇怪的错误。。。
刚刚调试java web中出现了一个很奇怪的现象,前端有一个页面通过ajax调用后台的servlet,当我把后台的servlet代码修改后(将返回值由a修改为b),前端页面仍然获取的是a.调试跟踪se ...
- Mingyang.net:如何获取所有的请求参数?
第一种方法:用@RequestParam. @RequestMapping(params="m=update", method=RequestMethod.POST) public ...
- Windows server 2008 下iis7 架设ftp服务器
架设了一天的ftp服务器,终于搞定了. 按着windows server 2003的思路在windows server 2008把ftp设置好后,登录过程老是出现:530 User cannot lo ...
- ansible管理
查看版本: ansible –version 升级pip安装的ansible: sudo pip install -U ansible
- (转)一段如何調用Button.Click事件的故事
原文地址:http://helloouc.blog.163.com/blog/static/5530527120091050314590/ 一.前言 由于小朱与BillChung的启发,想写一个故事, ...
- Sqoop2常用命令介绍
命令行操作之Create Command 1.Create Connection Function create connection --cid 1 说明:Create new connectio ...
- Quick Sort
class Program { static int[] a = new int[] { 6, 1, 2, 7, 9, 3, 4, 5, 10, 8 }; int n; static void Mai ...
- mac下的一些常识
1,环境变量 EddydeMacBook-Pro:~ eddy$ vi ~/.bash_profile EddydeMacBook-Pro:~ eddy$ vim /etc/profile Eddyd ...
- java学习之(内部类)
大部分时候,类被定义成一个独立的程序单元,在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,内部类有如下特点: 1.内部类提供了更好的封闭,可以把内部类隐 ...
- 阅读jQuery源码的18个惊喜
注释:本文使用$.fn.method指代调用一系列选中的元素的方法.例如,$.fn.addClass,指代$('div').addClass(‘blue’) 或 $('a.active’).addCl ...