SequoiaDB 巨杉数据库包括三类节点,集群可以通过在服务器内新增节点实现扩容:
当集群规模随着新增服务器扩大时,协调节点也需要随着规模的增加而进行增加,集群模式中一台机器中最少配置一个协调节点。
在 Sdb Shell 中可以通过现有的协调节点组添加新的协调节点,当 sdbserver1 中已有协调节点或临时协调节点,在 sdbserver2 中添加新的协调节点,使用端口为11810。
连接 sdbserver1 的协调节点 11810
sdb > var db = new Sdb( 'sdbserver1', 11810 )
获取协调节点组
sdb > var rg = db.getCoordRG()
Note:
- 可以使用 getRG()方法获取协调节点组,其中SYSCoord为协调节点组名
- var rg = db.getRG("SYSCoord")
在 sdbserver2 中新建协调节点 11810
sdb > var node = rg.createNode( "sdbserver2", 11810, "/opt/sequoiadb/database/coord/11810" )
启动新建的协调节点
sdb > node.start()
在 Sdb Shell 中可以查看协调节点的列表:
sdb > db.getCoordRG().getDetail()
如果新增编目节点涉及到新增服务器,用户需按照操作系统配置一节完成主机的主机名和参数配置。 随着整个集群中的物理设备的扩展,可以通过增加更多的编目节点来提高编目服务的可靠性。
获取编目分区组
sdb > var cataRG = db.getCatalogRG()
创建一个新的编目节点
sdb > var node = cataRG.createNode( <host>, <service>, <dbpath>, [config] )
Note:
host, service, dbpath 及 config 的设置请参考 新建编目分区组
在sdbserver2 中新建编目节点,使用端口为11800
sdb > var node = cataRG.createNode( "sdbserver2", 11800, "/opt/sequoiadb/database/cata/11800" )
启动新增的编目节点
sdb > node.start()
在 Sdb Shell 中可以查看协调节点的列表:
sdb > db.getCatalogRG().getDetail()
如果新增数据节点涉及到新增服务器,用户需按照操作系统配置一节完成主机的主机名和参数配置。 一个集群中可以配置多个分区组,最大可配置60,000个分区组。通过增加分区组,可以充分利用物理设备进行水平扩展,SequoiaDB 可以实现线性的水平扩展能力。
操作方法
建数据分区组,与编目分区组不同的是该操作不会创建任何数据节点,其中参数为数据组名:
sdb > var dataRG = db.createRG( "dataGroup" )
数据组中新增一个数据节点,可以根据需要多次执行该命令来创建多个数据节点,如下给sdbserver1这台机器创建11820这个端口的数据节点:
sdb > dataRG.createNode( "sdbserver1", 11820, "/opt/sequoiadb/database/data/11820" )
启动数据节点
sdb > dataRG.start()
参数说明
如果新增节点涉及到新增服务器等操作,用户需按照操作系统配置一节完成主机的主机名和参数配置。某些分区组可能在创建时设定的副本数较少,随着物理设备的增加,需要增加副本数以提高分区组数据可靠性。部署数据节点的详细信息请参考 集群模式。
操作方法
取数据分区组,参数 groupname 为数据分区组组名:
sdb > var dataRG = db.getRG( <groupname> )
创建一个新的数据节点
sdb > var node = dataRG.createNode( <host>, <service>, <dbpath>, [config] )
Note:
host, service, dbpath 和 config的设置请参考新增数据分区组
启动新增的数据节点
sdb > node.start()
在 Sdb Shell 中可以查看某个的数据分区组中数据节点的列表,其中参数 groupname 为数据分区组组名:
sdb > db.getRG( <groupname> ).getDetail()
数据负载均衡是指增加数据节点后将原集群中的数据切分到新的数据节点中,将数据打散的更均匀,充分利用集群优势达到性能的最大化。[数据分区][sharding]是指,新增数据分区组需要将集合中的数据导出然后重新创建集合再重新导入,以达到[分区数据均衡][sharding_balance]的效果。分区组中新增节点使用数据切割命令( split 命令 )即可做数据切分打散,下文重点介绍分区组中新增节点如何重新打散。
数据分区有两种方式:
Note:
- 水平分区既可使用 Hash 方式也可使用 Range 方式进行数据分区;垂直分区只能使用 Range 方式进行数据分区。
- Hash 及 Range 这两种分区方式判定分区划分所依据的字段称为“分区键”。分区键基于集合定义,每个分区键可以包含一个或多个字段。Range 方式和 Hash 方式主要区别是 Range 方式下依据记录中分区键的范围选择所要插入的分区,而 Hash 方式下则根据记录中分区键生成的 Hash 值选择所要插入的分区。ShardingType 如果不填则默认为 Hash 分区。
在默认情况下,一个集合会被创建在一个随机的分区组中。如果用户希望对该集合进行水平切分,将其划分到其它分区组中,就需要数据切分功能。 数据切分是一种将数据在线从一个分区组转移到另一个分区组的方式。在数据转移的过程中,查询所得的结果集数据会存在暂时的不一致,但是 SequoiaDB 可以保证磁盘中数据的最终一致性。
Range 分区和 Hash 分区都支持两种切分方式:范围切分和百分比切分。
db.sample.employee.split( "src", "dst", { a: 10 }, { a: 20 } )
Note:
- 集合
sample.employee
已经指定为 Range 分区- 'src' , 'dst'分别表示“数据原本所在复制组”和“数据将要切分到的目标复制组”
- 数据切分及分区上的数据范围皆遵循左闭右开原则。即:{a:10},{a:20} 代表迁移数据范围为[10, 20)
db.sample.employee.split( "src", "dst", { Partition: 10 }, { Partition: 20 } )
Note:
集合
sample.employee
已经指定为 Hash 分区
db.sample.employee.split( "src", "dst", 50 )
coord.snapshot( SDB_SNAP_COLLECTIONS,{"Name": "CS.CL"})
正确的数据切分后集合中的数据可以达到负载均衡的效果。