SequoiaDB数据水平分区简介

1. 数据水平分区简介

在SequoiaDB中,默认情况下,表(集合)的数据只会存储在一个复制组中。这样,对该表的CRUD操作只会落到一个复制组中。

随着对表的IO请求上升/数据量的增加,就会造成性能瓶颈,导致访问时延增加。为了解决这个问题,便引入了水平分区的功能。

水平分区可以将表(集合)切分成若干分区,并将分区指定到不同的复制组中。示意图如下:

上图中,将集合2切分成N个分区, 每个分区可以指定到不同的复制组。这样,当查询数据时,就会根据条件将请求发给不同的复制组,提升查询性能。

 

2. 如何使用水平切分

假设前提场景:

已经安装了集群模式的SequoiaDB,并且创建了两个复制组db1, db2. 

执行SequoiaDB shell工具sdb,并连接上协调节点

./sdb
>db = new Sdb('localhost', 11810) //连接本地的协调节点
>db.createCS('cs').createCL('cl', {Group:'db1'}) //创建表cs.cl,并将表数据指定在复制组db1上

a、修改表属性,设置分区键

>db.cs.cl.alter((ShardingKey:{a:1}})         //指定表中名为a的字段作为分区键, {a:1}其中1表示升序

b、设置了分区键之后,就可以将表按分区键做切分

>db.cs.cl.split('db1', 'db2', {a:100})     //将表中a在范围[100, 无穷大)的数据从db1中切分到db2中

c、验证设置成功与否

>db.snapshot(8, {Name:"cs.cl"})            //获取表cs.cl的快照信息
{
  "CataInfo": [    
    {
      "ID": 0,
      "GroupID": 1000,
      "GroupName": "db1"
      "LowBound": {
        "a": {
          "$minKey": 1
        }
      },
      "UpBound": {
        "a": 100
      }
    },
    {
      "ID": 1,
      "GroupID": 1001,
      "GroupName": "db2"
      "LowBound": {
        "a": 100
      },
      "UpBound": {
        "a": {
          "$maxKey": 1
         }
      }
    }
  ]
"EnsureShardingIndex": true,
"_id": { "$oid": "55272fa4d9150b7ff15a6ddc" }, "Name": "cs.cl", "Version": 3, }

 

这样当访问a在(无穷小, 100)范围的数据时,就只会访问复制组db1,

当访问a在[100, 无穷大)范围的数据时, 只会访问复制组db2。这样可以使请求分流,并解决表数据量过大的问题。

 

posted on 2015-04-10 10:58  linyoub  阅读(256)  评论(0编辑  收藏  举报