文档中心

缩容

当需要缩小原有数据库集群时需要做集群缩容操作,集群缩容分为两大类服务器内节点缩容和服务器缩容,其中缩容服务器包括服务器内节点缩容。集群缩容分为:

  • 服务器内节点缩容
  • 服务器缩容

服务器内节点缩容

当机器中存在多个数据节点,减少机器中的数据节点个数,从而达到集群节点缩容的效果。 服务器内节点缩容架构图:

集群节点缩容架构图

节点缩容过程

将上图中 sdbserver1, sdbserver2 和 sdbserver3 三台机器中的 group2 数据组删除,集群中只保留 group1 数据组,且需要保留 group2 数据组中的数据。方案有两种:

  • 使用 sdbexprt 命令将包含 group1 和 group2 的集合空间下的集合导出,然后删除 group2 数据组,重新创建集合将导出的集合使用 sdbimprt 命令导入
  • 使用数据切割 split 工具 将 group2 的数据切割到 group1 这个数据组中,无需手工删除集合

用户可以使用 split 工具将集合中的数据从 group2 这个数据组切割到 group1 数据组,当确保 group2 这个数据组没有数据时就能够把此数据组从集群中剔除。

  • 连接协调节点

    sdb> db = new Sdb("sdbserver1",11810)  
  • 获取存在集群中的

    sdb> db.listDomains()
  • 查看数据库使用了 group2 数据组的域,定义获取到对应的域:

    sdb> var domain = db.getDomain("domainName")
  • 通过获取上面指定的域查看下面的集合:

    sdb> domain.listCollections()
  • 查看 sample.employee 这个集合的编目信息快照信息,查看 sample.employee 这个集合的 group2 数据组的Partition范围:

    sdb> snapshot(SDB_SNAP_CATALOG,{"Name":"sample.employee"})
  • 使用 split 工具需要至少存在两个分区组的环境下,将数据记录按指定的条件切分到不同的分区组中。将 sample.employee 这个集合的 group2 的数据切割到 group1 中:

    sdb> db.sample.employee.split.("group2","group1",{"Partition":2084},{"Partition":4096})  
  • 删除 group2 分区组中节点:

    sdb> var rg2 = db.getRG("group2")
    sdb> rg2.removeNode("sdbserver1", 11830)
    sdb> rg2.removeNode("sdbserver2", 11830)
    sdb> rg2.removeNode("sdbserver2", 11830)
  • 如需要强制删除 group2 分区组中的节点,在 removeNode 参数配置中添加 enforced 值为 true:

    sdb> rg2.removeNode("sdbserver1", 11820, {enforced:true})  
  • 删除分区组节点后重新创建集合,并使用 sdbimprt 命令将导出的数据文件导入到集合中。节点有数据且无需保留数据和节点无数据的场景,无需导出集合数据,直接执行 removeNode 删除节点即可。

分离节点

  • 将 sdbserver1:11830 节点从 group2 分区组中分离
sdb> db.getRG("group2").detachNode("sdbserver1", 11830)  

Note:

当前分区组内的一个节点做分离时,其配置信息不会被删除,需要搭配 rg.attachNode() 使用。目前 SequoiaDB 可以支持从数据组或者编目组中分离节点。

缩容后检查

  • 节点缩容后使用 sdblist 命令检查:
sdblist -l -t all
  • 使用快照查看集合信息:
sdb> db.snapshot(SDB_SNAP_CATALOG,{"Name":"sample.employee"});

GroupName 中已经没有 group2 这个数据组。

服务器缩容

原集群部署情况

原集群总共有六台机器,每台机器均部署了协调节点与数据节点。其中 sdbserver1, sdbserver2, sdbserver3 这三台机器共同组成了编目节点组 SYSCatalogGroup 与数据节点组 group1。sdbserver4, sdbserver5, sdbserver6 这三台机器组成了另外一个数据节点组 group2。

集合架构图

集群机器缩容架构图

集群机器缩容架构图

集群机器缩减

如果要对六台服务器中的三台进行回收,数据库就需要实施规模缩减操作。 规模缩减后 sdbserver1, sdbserver2, sdbserver3 三台机器上已经部署的编目节点组和数据节点组 group1 保持不变,同时将 sdbserver4, sdbserver5, sdbserver6 三台机器部署的数据节点组 group2 迁移到 sdbserver1, sdbserver2, sdbserver3 这三台机器上,端口使用11830,达到保持原数据库架构不变,缩减机器规模的目的。

  • 连接 sdbserver4 的协调节点
sdb> db = new Sdb("sdbserver4",11810) 
  • 获取 group2 组的对象
sdb> var rg2 = db.getRG("group2") 
  • 在给 group2 数据组扩展时,首先判断 sdbserver1, sdbserver2, sdbserver3 机器的 11830 端口是否被占用,sdbcm 进程是否对 /opt/sequoiadb/data 路径有写操作权限:
$ netstat -nap | grep 11830 
$ ls -l /opt/sequoiadb/ | grep data 
  • 在 sdbserver1 中扩展 group2 组的数据节点:
sdb> var node = rg2.createNode("sdbserver1",11830,"/opt/sequoiadb/data/11830") 
  • 启动 sdbserver1 中新增的数据节点:
sdb> node.start() 
  • 在 sdbserver2 中扩展 group2 组的数据节点:
sdb> node = rg2.createNode("sdbserver2",11830,"/opt/sequoiadb/data/11830") 
  • 启动 sdbserver2 新增的数据节点:
sdb> node.start() 
  • 在 sdbserver3 这台机器扩展 group2 组的数据节点:
sdb> node = rg2.createNode("sdbserver3",11830,"/opt/sequoiadb/data/11830") 
  • 启动 sdbserver3 新增的数据节点:
sdb> node.start() 
  • 检查 group2 组是否正确新增了 sdbserver1:11830, sdbserver2:11830, sdbserver3:11830 三个数据节点,检查 group2 组的主数据节点部署在哪台机器上,查看 GroupName="group2" 的 PrimaryNode 字段:
sdb> db.listReplicaGroups() 
  • 连接 group2 组的主数据节点,假设 group2 组旧的主数据节点是 sdbserver4 机器的 11820 进程:
sdb> datadbm = new Sdb("sdbserver4",11820) 
  • 查看并记录 group2 组的主数据节点的 LSN 号:
sdb> masterlsn.offset = datadbm.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Offset"] 
sdb> masterlsn.version = datadbm.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Version"] 
  • 分别连接 group2 组新增的数据节点,查看新增的数据节点 LSN 号, 查看 sdbserver1 这台机器的11830的 LSN 号:
sdb> datadb1 = new Sdb("sdbserver1",11830) 
sdb> datadb1.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Offset"] 
sdb> datadb1.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Version"] 
  • 查看 sdbserver2 这台机器的11830的 LSN 号:
sdb> datadb2 = new Sdb("sdbserver2",11830) 
sdb> datadb2.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Offset"] 
sdb> datadb2.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Version"]  
  • 查看 sdbserver3 这台机器的11830的 LSN 号:
sdb> datadb3 = new Sdb("sdbserver3",11830) 
sdb> datadb3.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Offset"] 
sdb> datadb3.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Version"] 

等待 group2 组新增的数据节点 LSN 号停止增长并且与 group2 组主数据节点的 LSN 号相同。在新增数据节点的 LSN 号与主数据节点的 LSN 号保持一致后,使用协调节点的连接连续多次查看整个数据库的数据读写情况,如果数据读、写操作指标静止不变,则判断新增数据节点已经完成日志同步。

  • 查看数据库快照:
sdb> db.snapshot(SDB_SNAP_DATABASE) 
  • 移除 group2 组的旧主数据节点,假设 group2 组旧的主数据节点是 sdbserver4 机器的11820进程:
sdb> var rg = db.getRG("group2") 
sdb> rg.removeNode("sdbserver4",11820) 
  • 检查 group2 组的选主情况,确定 group2 组选主成功,查看 GroupName="group2" 的 PrimaryNode 字段:
sdb> db.listReplicaGroups()  
  • 根据 PrimaryNode 的 nodeid,用户可以确定 PrimaryNode 的 HostName ,假设为 sdbserver2 机器的11830进程,可以直连到 sdbserver2 机器的11830进程,检查它是否真实选为 group2 组的主数据节点,并查看 IsPrimary 字段是否为 True:
sdb> var datadbm = new Sdb("sdbserver2",11830)  
sdb> datadbm.snapshot(7)  
  • 确定 group2 组新选主后,移除另外两个数据节点:
sdb> rg.removeNode("sdbserver5",11820) 
sdb> rg.removeNode("sdbserver6",11820)  
  • 最后将 sdbserver4, sdbserver5, sdbserver6 这三台机器的协调节点从协调节点组中移除:
sdb> var oma = new Oma( "sdbserver4", 11790 ) 
sdb> oma.removeCoord( 11810 ) 
sdb> var oma = new Oma( "sdbserver5", 11790 ) 
sdb> oma.removeCoord( 11810 ) 
sdb> var oma = new Oma( "sdbserver6", 11790 ) 
sdb> oma.removeCoord( 11810 ) 
回到顶部