【SequoiaDB教程】SequoiaDB分布式存储教程

  1.各模式适用场景介绍

  由于SequoiaDB对比其他的NoSQL有更多的方式将数据分布到多台服务器上,所以下面笔者为阅读者一一介绍每种分布式方式适合于哪种场景。

  1.1Hash方式分布数据

  在Hash分布方式中,由于是对集合中某个字段的Hash值进行数据均匀,所以用户未来在使用Hash分布时,ShardingKey 一定要选择集合中字段值比较随机,并且Hash值比较均匀的字段,这样才能够保证集合中的数据被均匀的分布在各个数据分区组上。

  Hash分布式方式主要适合数据量比较大,并且集合中包含一个Hash值比较随机的字段。如果集合中并没有Hash值比较随机的字段,但是集合的数据量又非常的巨大,用户可以考虑使用SequoiaDB中的主键-“_id”作为ShardingKey。

  1.2Range方式分布数据

  Range 分布方式,主要适用用于集合数据量大,并且集合包含某个具有比较明确的数值范围的字段,例如时间字段或者是业务类型字段,来帮助用户做集合的范围切分。

  1.3Partition方式分布数据

  Partition 分布方式,和Range 分布方式的适用场景非常类似,都是要求集合数据量大,并且集合包含某个具有比较明确的数值范围的字段。

  Partition分布方式,实际上并不能够做到数据自动均匀分布到多个数据分区组,而是需要用户在建立子表时,人工显式指定此子表是被分配到哪个数据分区组上,然后再通过主表的attach 命令将子表按照某个字段的范围值挂载到主表上。

  而Partition 分布方式与Range 分布方式最大的不同点,在于对数据的删除上。

  在Range 分布方式中,如果用户需要对集合中某个过旧的时间范围数据进行删除,用户需要调用remove 命令,真实地从数据库磁盘中删除这部分数据,这个耗时会比较久。

  而在Partition 分布方式中,用户同样希望删除某个过旧的时间范围数据,用户只需要调用dettach命令,将符合时间范围的子表从主表中卸载下来,即可完成数据从集合中清除的目的,dettach命令的效率非常高,基本是秒级完成。然后用户可以对过旧的子表执行truncate 命令,回收磁盘空间。

  注意,集合truncate 命令的执行效率比集合remove 命令的执行效率要高出几个量级。

  1.4多维分区

  SequoiaDB的多维分区方式,它很好地结合了Hash分布方式和Partition 分布方式的优点,能够让集合中的数据以更小的颗粒度分布到数据库多个数据分区组上。

  多维分区分布方式,主要适合的场景是集合数据量特别巨大,集合中同时包含两个关键的ShardingKey,一般为time和id两个字段,time字段给主子表使用,id字段给Hash 分布使用,并且用户在使用在集合过程中,还可能会定期对部分数据进行空间回收。

  在真实的客户环境中,多维分区主要使用的场景为:银行的历史数据流水表,业务系统历史日志表等。

  2.操作指南

  作者在为下面各种数据分布方式做操作前,需要先在数据库中一些准备操作。

  连接到数据库中

var db = new Sdb("localhost", 11810); 

  查看当前数据库有多少数据分区组

var cursor = db.listReplicaGroups();while (cursor.next()){var obj = cursor.current().toObj();if (obj["GroupName"] != "SYSCoord" && obj["GroupName"]

  返回的结果为

group1
group2
group3
group4

  为了做Hash 切分方便,用户可以先给数据库建立Domain

db.createDomain ("domain1", ["group1", "group2"], {AutoSplit:true});
db.createDomain ("domain2", ["group3", "group4"], {AutoSplit:true});

  2.1Hash方式分布数据

  建立一个集合空间,名为testcs_domain1,并且指定此集合空间是建立在domain1 上的

db.createCS("testcs_domain1", {Domain:"domain1"});

  在testcs_domain1 集合空间上建立一个集合,名为testcl_hash,设置ShardingType = hash,ShardingKey = id

var CS = db.getCS("testcs_domain1");
CS.createCL("testcl_hash", {ShardingType:"hash", ShardingKey:{id:1}});

  检查testcl_hash 集合在数据库中的分布情况

db.snapshot(8, {Name:"testcs_domain1.testcl_hash"});
{
  "AutoSplit": true,
  "CataInfo": [
    {
      "ID": 0,
      "GroupID": 100
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值