服务器内节点缩容

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

集群节点缩容架构图

节点缩容

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

  • 使用 sdbexprt 命令将包含 group2 的所有集合导出,然后删除 group2 及 group2 上的所有集合,重新创建只属于 group1 的同名集合,并将导出的集合使用 sdbimprt 命令导入
  • 使用数据切割 split 工具将 group2 的数据切割到 group1 中,无需手工删除集合

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

  1. 连接协调节点

    1. > db = new Sdb("sdbserver1",11810)
  2. 获取集群中的所有域

    1. > db.listDomains()
  3. 获取使用了 group2 的域

    1. > var domain = db.getDomain("domainName")
  4. 查看指定域下的集合

    1. > domain.listCollections()
  5. 查看集合 sample.employee 的编目信息快照信息,获取集合 sample.employee 中 group2 的 Partition 范围

    1. > db.snapshot(SDB_SNAP_CATALOG,{"Name":"sample.employee"})
  6. 使用 split 工具将集合 sample.employee 中 group2 的数据切割至 group1

    1. > db.sample.employee.split("group2","group1",{"Partition":2084},{"Partition":4096})

    Note:

    用户使用 split 工具切割数据时,集群中至少需要存在两个复制组。

  7. 删除 group2 中所有节点

    1. > var rg2 = db.getRG("group2")
    2. > rg2.removeNode("sdbserver1", 11830)
    3. > rg2.removeNode("sdbserver2", 11830)
    4. > rg2.removeNode("sdbserver3", 11830)

    Note:

    如果用户需要保存节点的数据,在执行 removeNode 删除节点前,应先使用 sdbexprt 工具对集合数据进行导出。

    如需要强制删除 group2 中的节点,在参数配置中添加 enforced 值为 true

    1. > rg2.removeNode("sdbserver1", 11820, {enforced:true})
  8. 删除 group2

    1. > db.removeRG("group2")

缩容后检查

  • 节点缩容后使用 sdblist 命令检查复制组是否已删除

    1. sdblist -l -t all
  • 使用快照查看集合信息中 GroupName 是否已不包含 group2

    1. > db.snapshot(SDB_SNAP_CATALOG,{"Name":"sample.employee"})