0%

SequoiaDB集群扩容与缩容

创建域、集合空间、集合

  • 通过 Linux 命令行进入 SequoiaDB Shell;
1
sdb
  • 通过 javascript 语言连接协调节点,获取数据库连接;
1
var db = new Sdb("localhost", 11810);
  • 创建 company_domain 逻辑域;
1
db.createDomain("company_domain", [ "group1", "group2", "group3" ], { AutoSplit: true } );
  • 创建 company 集合空间;
1
db.createCS("company", { Domain: "company_domain" } );
  • 创建 employee 集合;
1
db.company.createCL("employee", { "ShardingKey": { "_id": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );

写入测试数据

使用 JavaScript 的 for 循环向 employee 表写入 1000 条记录,用于测试。

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

集群扩容

  • 集群扩容是通过在集群中新增分区组实现的,新增分区组可以在原有服务器也可以是新加入集群的服务器,本小节通过在本机新增 group4 展示扩容的场景。

  • 创建一个新的数据组;

1
db.createRG("group4");
  • 在 group4 上创建1个数据节点副本;
1
db.getRG("group4").createNode("sdbserver1", 11850, "/opt/sequoiadb/database/data/11850/");

Note:

createNode() 方法的定义格式有四个参数:host,service,dbpath,config,如上表所示,host,dbpath 为字符串类型,Service 类型支持 int 或 string ,必填;最后一个是 Json 对象,选填,如配置日志大小,是否打开事务等,具体可参考数据库配置

格式:( “<主机名>”, “<端口号>”, “<节点路径>, “[ {key : value, … } ] )

createNode 方法的详细说明请参考:createNode 方法说明

  • 启动 group4 数据组;
1
db.getRG("group4").start();
  • 数据域 company_domain 增加数据组;
1
db.getDomain("company_domain").addGroups( { Groups: [ 'group4' ] } );
  • 将集合的数据迁移部分到新的数据组上;
1
2
3
db.company.employee.split("group1", "group4", 25);
db.company.employee.split("group2", "group4", 25);
db.company.employee.split("group3", "group4", 25);

Note:

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

分析数据分布

  • 连接第一个数据分区的存储节点;
1
var db1 = new Sdb("localhost", 11820);
  • 统计第一个数据分区的数据量;
1
db1.company.employee.count();
  • 连接第二个数据分区的存储节点;
1
var db2 = new Sdb("localhost", 11830);
  • 统计第二个数据分区的数据量;
1
db2.company.employee.count();
  • 连接第三个数据分区的存储节点;
1
var db3 = new Sdb("localhost", 11840);
  • 统计第三个数据分区的数据量;
1
db3.company.employee.count();
  • 连接第四个数据分区的存储节点;
1
var db4 = new Sdb("localhost", 11850);
  • 统计第四个数据分区的数据量;
1
db4.company.employee.count();

操作截图:

扩容完成

可以看到,四个数据组上的记录数基本为平均分布。

集群缩容

  • 本小节展示把 group4 的数据迁移到其他节点后把其剔出 company_domain 域,并把 group4 删除的操作。
  • 将集合1在新数据组上的数据迁移回旧的数据组;
1
2
3
db.company.employee.split("group4", "group1", 33);
db.company.employee.split("group4", "group2", 50);
db.company.employee.split("group4", "group3", 100);
  • 统计 group1,group2,group3 数据量,它们加起来等于 1000 ;
1
2
3
db1.company.employee.count();
db2.company.employee.count();
db3.company.employee.count();
  • 把 group4 移出 company_domain 域;
1
db.getDomain("company_domain").removeGroups( { Groups: [ 'group4' ] } );
  • 删除上一章新增加的数据组和数据节点;
1
db.removeRG("group4");
  • 统计 employee 的数据量;
1
db.company.employee.count();

数据量为1000,说明数据被正确迁移回来了。

关闭数据库连接

  • 关闭 db、db1、db2、db3、db4 数据库连接;
1
2
3
4
5
db.close();
db1.close();
db2.close();
db3.close();
db4.close();
  • 退出 SequoiaDB Shell;
1
quit;
  • 检查集群状态是否正常;
1
sdblist -l -m local

操作截图:

缩容完成

可以看到,group4 已经从集群中剔除。

-------------本文结束感谢您的阅读-------------