上一篇笔记中更新了在集合中的删除,更新,查询等操作。这次尝试一下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 50000 The slave node is 50010 stoping 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。