上一篇笔记中更新了在集合中的删除,更新,查询等操作。这次尝试一下sequoiadb的集群操作。包括复制组的创建和删除,复制组的启动和停止,在复制组中添加、删除、启动、停止节点,获取复制组中的主从节点等。 import java.util.arraylist;import java.util.l
上一篇笔记中更新了在集合中的删除,更新,查询等操作。这次尝试一下sequoiadb的集群操作。包括复制组的创建和删除,复制组的启动和停止,在复制组中添加、删除、启动、停止节点,获取复制组中的主从节点等。
import java.util.arraylist;import java.util.list;import org.bson.bsonobject;import org.bson.basicbsonobject;import com.sequoiadb.base.node.nodestatus;import com.sequoiadb.base.dbcursor;import com.sequoiadb.base.node;import com.sequoiadb.base.replicagroup;import com.sequoiadb.base.sequoiadb;import com.sequoiadb.exception.baseexception;public class blogrg { static string rgname = testrg; static string hostname = sdbserver1; public static void main(string[] args) { //连接数据库 string host = 192.168.20.46; string port = 11810; string usr = admin; string password = admin; sequoiadb sdb = null; try { sdb = new sequoiadb(host + : + port, usr, password); } catch (baseexception e) { e.printstacktrace(); system.exit(1); } //打印有关复制组信息(名称、个数) printgroupinfo(sdb); //清除环境,删掉重复的复制组 if(isgroupexist(sdb,rgname)){ system.out.println(removing the old replica group...); sdb.removereplicagroup(rgname); } printgroupinfo(sdb); //添加新复制组 system.out.println(adding the new replica group...); replicagroup rg = sdb.createreplicagroup(rgname); printgroupinfo(sdb); //打印复制组内节点信息 system.out.println(tere are + rg.getnodenum(nodestatus.sdb_node_all) + nodes in the group.); //添加三个新的节点 node node1 = addnode(rg,50000); node node2 = addnode(rg,50010); node node3 = addnode(rg,50020); //打印复制组内节点信息 system.out.println(tere are + rg.getnodenum(nodestatus.sdb_node_all) + nodes in the group.); //获取复制组的主从节点 node master = rg.getmaster(); system.out.println(the master node is +master.getport()); system.out.println(the slave node is + rg.getslave().getport()); //停止主节点 system.out.println(stoping the master node...); master.stop(); //等待主节点停止 while(rg.getmaster().getport() == master.getport()){ try{ thread.sleep(2000); } catch (exception e){ } } //查看新选举的主节点 system.out.println(re-selecting the master node...); system.out.println(the master node is + rg.getmaster().getport()); } private static void printgroupinfo(sequoiadb sdb){ arraylist names = sdb.getreplicagroupnames(); int count = 0; system.out.print(the replica groups are ); for (object name : names){ count++; system.out.print((string)name + , ); } system.out.println(\nthere are + count + replica groups in total.); } private static boolean isgroupexist(sequoiadb sdb, string rgname){ arraylist names = sdb.getreplicagroupnames(); for (object name : names){ if(rgname.equals((string)name)) return true; } return false; } private static node addnode(replicagroup rg, int port){ if(rg.getnode(hostname,port)!= null) rg.removenode(hostname, port, null); node node = rg.createnode(hostname,port,/opt/sequoiadb/database/test/ + port,null); system.out.println(starting the node + port + ...); node.start(); return node; }}
上面的代码在数据库中添加新的复制组,并在新的复制组内添加三个主节点,数据组自动选举出新的主节点,停止主节点后,复制组内重新选举新的主节点。
运行以上代码后的结果是:
the replica groups are syscataloggroup, datagroup, testrg, there are 3 replica groups in total.removing the old replica group...the replica groups are syscataloggroup, datagroup, there are 2 replica groups in total.adding the new replica group...the replica groups are syscataloggroup, datagroup, testrg, there are 3 replica groups in total.tere are 0 nodes in the group.starting the node 50000...starting the node 50010...starting the node 50020...tere are 3 nodes in the group.the master node is 50000the slave node is 50010stoping the master node...re-selecting the master node...the master node is 50020
可以看出,程序开始运行时,数据库内有三个复制组,其中testrg是上次运行遗留下来的无用复制组,另外两个是数据库默认的两个复制组。通过removereplicagroup()方法删除多余的testrg复制组,之后通过createreplicagroup()添加新的testrg复制组,并且在新建的组内通过createnode()和start()添加并启动50000,50010,50020三个新的节点。通过getmaster()和getslave()方法获取组内的主从节点,并利用stop()停止主节点50000,主节点完全停止后,组内将重新自动选举出新的主节点50020。运行完成后,通过shell控制台查看数据库testrg复制组的详细情况:
>rg.getdetail(){ group: [ { hostname: sdbserver1, dbpath: /opt/sequoiadb/database/test/50000, service: [ { type: 0, name: 50000 }, { type: 1, name: 50001 }, { type: 2, name: 50002 } ], nodeid: 1053 }, { hostname: sdbserver1, dbpath: /opt/sequoiadb/database/test/50010, service: [ { type: 0, name: 50010 }, { type: 1, name: 50011 }, { type: 2, name: 50012 } ], nodeid: 1054 }, { hostname: sdbserver1, dbpath: /opt/sequoiadb/database/test/50020, service: [ { type: 0, name: 50020 }, { type: 1, name: 50021 }, { type: 2, name: 50022 } ], nodeid: 1055 } ], groupid: 1023, groupname: testrg, primarynode: 1055, role: 0, status: 0, version: 4, _id: { $oid: 53d9d38e14a63a88c621edd8 }}return 1 row(s).takes 0.4716s.
可以看出组内有三个节点,主节点(primarynode)为1055,也就是50020。