服务器内节点缩容
当机器中存在多个数据节点,减少机器中的数据节点个数,从而达到集群节点缩容的效果。下图为服务器内节点缩容架构图:
节点缩容
将上图中 sdbserver1、sdbserver2 和 sdbserver3 三台机器中的复制组 group2 删除,集群中只保留复制组 group1,且需要保留复制组 group2 中的数据。方案有两种:
- 使用 sdbexprt 命令将包含 group2 的所有集合导出,然后删除 group2 及 group2 上的所有集合,重新创建只属于 group1 的同名集合,并将导出的集合使用 sdbimprt 命令导入
- 使用数据切割 split 工具将 group2 的数据切割到 group1 中,无需手工删除集合
以下示例为使用 split 工具将集合中的数据从 group2 切割到 group1,当确保 group2 没有数据时就能够把此数据组从集群中剔除。
连接协调节点
> db = new Sdb("sdbserver1",11810)
获取集群中的所有域
> db.listDomains()
获取使用了 group2 的域
> var domain = db.getDomain("domainName")
查看指定域下的集合
> domain.listCollections()
查看集合 sample.employee 的编目信息快照信息,获取集合 sample.employee 中 group2 的 Partition 范围
> db.snapshot(SDB_SNAP_CATALOG,{"Name":"sample.employee"})
使用 split 工具将集合 sample.employee 中 group2 的数据切割至 group1
> db.sample.employee.split("group2","group1",{"Partition":2084},{"Partition":4096})
Note:
用户使用 split 工具切割数据时,集群中至少需要存在两个复制组。
删除 group2 中所有节点
> var rg2 = db.getRG("group2")
> rg2.removeNode("sdbserver1", 11830)
> rg2.removeNode("sdbserver2", 11830)
> rg2.removeNode("sdbserver3", 11830)
Note:
如果用户需要保存节点的数据,在执行 removeNode 删除节点前,应先使用 sdbexprt 工具对集合数据进行导出。
如需要强制删除 group2 中的节点,在参数配置中添加 enforced 值为 true
> rg2.removeNode("sdbserver1", 11820, {enforced:true})
删除 group2
> db.removeRG("group2")
缩容后检查
节点缩容后使用 sdblist 命令检查复制组是否已删除
sdblist -l -t all
使用快照查看集合信息中 GroupName 是否已不包含 group2
> db.snapshot(SDB_SNAP_CATALOG,{"Name":"sample.employee"})