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