天天看點

Sequoiadb 測試體驗系列之六 – Java 開發3

上一篇筆記中更新了在集合中的删除,更新,查詢等操作。這次嘗試一下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。