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。这样可以使请求分流,并解决表数据量过大的问题。
时间: 2024-10-08 21:26:33