0%

SequoiaDB之弹性扩展能力操作

创建域、集合空间、集合

创建数据域、集合空间和集合,为集群扩容后数据重分布做准备。

1)通过 Linux 命令行进入 SequoiaDB Shell;

1
sdb

2)通过 javascript 语言连接协调节点,获取数据库连接;

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

3)创建 company_domain 逻辑域;

1
db.createDomain("company_domain", [ "group1", "group2", "group3" ], { AutoSplit: true } );

4)创建 company 集合空间;

1
db.createCS("company", { Domain: "company_domain" } );

5)创建 employee 集合;

1
db.company.createCL("employee", { "ShardingKey": { "_id": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );

6)使用 JavaScript 的 for 循环向 employee 集合中写入 1000 条数据;

1
2
3
4
5
for (var i = 0; i < 1000; i++) 
{
var record = { empno: i, ename: "TEST", age: 20 };
db.company.employee.insert(record);
}

7)通过查看集合快照信息,获取集合分区情况;

1
db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );

操作截图:

810-4

分区组弹性扩展语法

本次实验所有展均在一台服务器上完成,多服务器扩展原理与此相同。下面是对创建分区组和增加节点的语法说明。

1)新建一个分区组语法;

1
var rg = db.createRG( < name > );

参数描述:

参数名 参数类型 描述 是否必填
name string 分区组名,同一个数据库对象中,分区组名唯一。

2)在当前分区组中创建节点语法;

1
rg.createNode( < host >, < service >, < dbpath >, [ config ] );

参数描述:

参数名 参数类型 描述 是否必填
host string 指定节点的主机名。
service int/string 节点端口号。
dbpath string 1. 数据文件路径,用于存放节点数据文件,请确保数据管理员(安装时创建,默认为 sdbadmin )用户有写权限; 2. 如果配置路径不以“/”开头,数据文件存放路径将是数据库管理员用户(默认为 sdbadmin )的主目录(默认为 /home/sequoiadb )+ 配置的路径。
config Json 对象 节点配置信息,如配置日志大小,是否打开事务等,具体可参考数据库配置。

新增数据分区

1)新增数据组;

1
var dataRG = db.createRG("group4");

2)添加数据节点;

1
dataRG.createNode("sdbserver1", 11850, "/opt/sequoiadb/database/data/11850/", { logfilenum: 5, transactionon: true } );

3)启动数据节点组;

1
dataRG.start();

4)退出 SequoiaDB Shell;

1
quit;

5)查看数据库扩展后状态

1
sdblist  -t all -l -m local

操作截图:

810-5

此时新增的数据节点已经加入集群。

Note:

如果是在新服务器上进行扩容,新增服务器的 hostname 和 ip 地址需要被添加到所有服务器的 /etc/hostname 文件中。

原有集合数据重分布

集群扩容后,需要把原有数据域进行修改,新增数据组,并可通过 split 对已存在集合进行数据重新打散,达到集合数据均匀分布。

1)通过 Linux 命令行进入 SequoiaDB Shell;

1
sdb

2)通过 javascript 语言连接协调节点,获取数据库连接;

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

3)数据域 company_domain 增加数据组;

1
db.getDomain("company_domain").addGroups( { Groups: [ 'group4' ] } );

4)查看域信息;

1
db.listDomains();

操作截图:

810-6

5)将集合的部分数据迁移到新的数据组上;

将 group1 数据组部分数据切分到新的数据组中:

1
db.company.employee.split("group1", "group4", 25);

将 group2 数据组部分数据切分到新的数据组中:

1
db.company.employee.split("group2", "group4", 25);

将 group3 数据组部分数据切分到新的数据组中:

1
db.company.employee.split("group3", "group4", 25);

Note:

以上split的含义是把 group1、group2 和 group3 上的数据分别移 25% 到 group4 上。 split 方法的详细说明请参考:split 方法说明

操作截图:

810-7

6)通过查看集合快照信息,获取集合分区情况;

1
db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );

操作截图:

810-8

新增数据自动打散

company.employee 集合后续写入的数据会自动均匀打散 group1、group2、group3 和 group4 4个数据组中。

1)使用 JavaScript 的 for 循环向 employee 集合中写入 1000 条数据;

1
2
3
4
5
for (var i = 1000; i < 2000; i++) 
{
var record = { empno: i, ename: "TEST", age: 20 };
db.company.employee.insert(record);
}

2)通过查看集合快照信息,获取集合分区情况;

1
db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );

操作截图:

810-7

新建集合自动拓展到新分区

在 company_domain 数据域中新创建的集合会按照数据域中包含的数据组自动均匀的分布到所有数据组里。

1)创建集合,分区方式为 hash ,分区键为 serial_no;

1
db.company.createCL("log", {"ShardingKey": { "serial_no": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );

3)使用 JavaScript 的 for 循环向 log 集合中写入 1000 条数据;

1
2
3
4
5
for (var i = 0; i < 1000; i++) 
{
var record = { serial_no: i, account_id: i + 1000, description: "description log", tx_time: "2020-02-29 00:00:00" };
db.company.log.insert(record);
}

4)通过查看集合信息,获取数据分布;

1
db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.log" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );

操作截图:

810-7

5)关闭 db 连接;

1
db.close();

6)退出 SequoiaDB Shell;

1
quit;
-------------本文结束感谢您的阅读-------------