服务器缩容

本文档将介绍如何通过减少服务器实现集群缩容。

原集群部署情况

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

集合架构图

集群机器缩容架构图

集群机器缩容架构图

集群机器缩减

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

  1. 连接 sdbserver4 的协调节点

    1. > db = new Sdb("sdbserver4",11810)
  2. 获取复制组 group2 的对象

    1. > var rg2 = db.getRG("group2")
  3. 在给复制组 group2 扩展时,首先判断 sdbserver1、sdbserver2 和 sdbserver3 机器的 11830 端口是否被占用,sdbcm 进程是否对 /opt/sequoiadb/data 路径有写操作权限

    1. $ netstat -nap | grep 11830
    2. $ ls -l /opt/sequoiadb/ | grep data
  4. 在 sdbserver1 中扩展复制组 group2 的数据节点

    1. > var node = rg2.createNode("sdbserver1",11830,"/opt/sequoiadb/data/11830")
  5. 启动 sdbserver1 中新增的数据节点

    1. > node.start()
  6. 在 sdbserver2 中扩展复制组 group2 的数据节点

    1. > node = rg2.createNode("sdbserver2",11830,"/opt/sequoiadb/data/11830")
  7. 启动 sdbserver2 新增的数据节点

    1. > node.start()
  8. 在 sdbserver3 这台机器扩展复制组 group2 的数据节点

    1. > node = rg2.createNode("sdbserver3",11830,"/opt/sequoiadb/data/11830")
  9. 启动 sdbserver3 新增的数据节点

    1. > node.start()
  10. 检查复制组 group2 是否正确新增了 sdbserver1:11830sdbserver2:11830sdbserver3:11830 三个数据节点,检查 group2 的主数据节点部署在哪台机器上,查看 GroupName=”group2” 的 PrimaryNode 字段

    1. > db.listReplicaGroups()
  11. 连接复制组 group2 的主数据节点,假设 group2 组旧的主数据节点是 sdbserver4 机器的 11820 进程

    1. > datadbm = new Sdb("sdbserver4",11820)
  12. 查看并记录复制组 group2 的主数据节点的 LSN 号

    1. > masterlsn.offset = datadbm.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Offset"]
    2. > masterlsn.version = datadbm.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Version"]
  13. 分别连接复制组 group2 新增的数据节点,查看新增的数据节点 LSN 号,查看 sdbserver1:11830 节点的 LSN 号

    1. > datadb1 = new Sdb("sdbserver1",11830)
    2. > datadb1.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Offset"]
    3. > datadb1.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Version"]
  14. 查看 sdbserver2:11830 节点的 LSN 号

    1. > datadb2 = new Sdb("sdbserver2",11830)
    2. > datadb2.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Offset"]
    3. > datadb2.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Version"]
  15. 查看 sdbserver3:11830 节点的 LSN 号

    1. > datadb3 = new Sdb("sdbserver3",11830)
    2. > datadb3.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Offset"]
    3. > datadb3.snapshot(SDB_SNAP_SYSTEM).next().toObj()["CurrentLSN"]["Version"]

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

  16. 查看数据库快照

    1. > db.snapshot(SDB_SNAP_DATABASE)
  17. 移除复制组 group2 的旧主数据节点,假设复制组 group2 旧的主数据节点是 sdbserver4 机器的11820进程

    1. > var rg = db.getRG("group2")
    2. > rg.removeNode("sdbserver4",11820)
  18. 检查复制组 group2 的选主情况,确定复制组 group2 选主成功,查看 GroupName=”group2” 的 PrimaryNode 字段

    1. > db.listReplicaGroups()
  19. 根据 PrimaryNode 的 nodeid,用户可以确定 PrimaryNode 的 HostName ,假设为 sdbserver2 机器的 11830 进程,可以直连到 sdbserver2 机器的 11830 进程,检查它是否真实选为 group2 组的主数据节点,并查看 IsPrimary 字段是否为 True

    1. > var datadbm = new Sdb("sdbserver2",11830)
    2. > datadbm.snapshot( SDB_SNAP_SYSTEM )
  20. 确定复制组 group2 新选主后,移除另外两个数据节点

    1. > rg.removeNode("sdbserver5",11820)
    2. > rg.removeNode("sdbserver6",11820)
  21. 最后将 sdbserver4, sdbserver5, sdbserver6 这三台机器的协调节点从协调节点组中移除

    1. > var oma = new Oma( "sdbserver4", 11790 )
    2. > oma.removeCoord( 11810 )
    3. > var oma = new Oma( "sdbserver5", 11790 )
    4. > oma.removeCoord( 11810 )
    5. > var oma = new Oma( "sdbserver6", 11790 )
    6. > oma.removeCoord( 11810 )