我的架构演化笔记 4 :MongoDB 增加集群机制

话说,我正打算加入新的功能。

有这么一段对话。

表弟“貌似一台MongoDB主机容易挂掉,如果停电了或者硬盘损坏了怎么办?”咱可是要提供99.99999999999的可靠性啊。

我“别慌,咱有master-slave机制”

表弟“选主从机制还是副本集机制?”

经过一番思索,我决定上副本集。谁让它更安全呢!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·

在192.168.56.254上
Cd  /usr/local/mongodb-linux-x86_64-2.6.1/
./bin/mongod  --dbpath ./data/db --port 27017 --replSet fubenji/192.168.56.66:27018
数据路径 /data/db



在192.168.56.66上
Cd /usr/local/mongodb-linux-x86_64-2.6.1
./bin/mongod --dbpath ./data/db --port 27018 --replSet fubenji/192.168.56.254:27017

 然后执行

db.runCommand(
{"replSetInitiate":
     {
      "_id":"fubenji",
      "members":
             [
               { "_id":1,"host":"192.168.56.254:27017"},
               { "_id":2,"host":"192.168.56.66:27018"}
             ]
     }
})

 

> rs.status()
{
	"set" : "fubenji",
	"date" : ISODate("2014-06-03T17:42:38Z"),
	"myState" : 1,
	"members" : [
		{
			"_id" : 1,
			"name" : "192.168.56.254:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 270,
			"optime" : Timestamp(1401817313, 1),
			"optimeDate" : ISODate("2014-06-03T17:41:53Z"),
			"electionTime" : Timestamp(1401817319, 1),
			"electionDate" : ISODate("2014-06-03T17:41:59Z"),
			"self" : true
		},
		{
			"_id" : 2,
			"name" : "192.168.56.66:27018",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 45,
			"optime" : Timestamp(1401817313, 1),
			"optimeDate" : ISODate("2014-06-03T17:41:53Z"),
			"lastHeartbeat" : ISODate("2014-06-03T17:42:37Z"),
			"lastHeartbeatRecv" : ISODate("2014-06-03T17:42:37Z"),
			"pingMs" : 0,
			"syncingTo" : "192.168.56.254:27017"
		}
	],
	"ok" : 1
}

查看数据是否已经同步:

fubenji:PRIMARY> db.category.find()
{ "_id" : ObjectId("538cc53227051105c2943c96"), "name" : "framework", "userid" : 1, "score" : 1 }

fubenji:SECONDARY> db.category.find()
{ "_id" : ObjectId("538cc53227051105c2943c96"), "name" : "framework", "userid" : 1, "score" : 1 }

表明副本集建立成功。

然后修改代码,将之前的单机连接池修改为副本集

package controllers;

import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import play.Play;

import com.mongodb.MongoClient;
import com.mongodb.ServerAddress;

public class MongoConnectionPool {
	private static MongoClient mongoClient = null;

	private MongoConnectionPool() {
	}

	// 如果是主从机制,请参考
	// http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/
	public static void setup() {
		try {
			/*
			String ip = Play.application().configuration()
					.getString("conf.mongo.ip");
			String port = Play.application().configuration()
					.getString("conf.mongo.port");
					*/
			List list = new ArrayList();
			String ip_ports = Play.application().configuration()
					.getString("conf.mongo.ip_port");
			String[] array = ip_ports.split(",");
			int index = 0;
			for(index=0;index<array.length;index++){
				String str = array[index];
				String[] ip_port = str.split(":");
				list.add(new ServerAddress(ip_port[0],Integer.parseInt(ip_port[1])));
				System.out.println("ip-"+ip_port[0]+" port-"+ip_port[1]);
			}			
					
			mongoClient = new MongoClient(list);
		} catch (UnknownHostException e) {
			e.printStackTrace();
			mongoClient = null;
		}
	}

	public static MongoClient getConnection() {
		return mongoClient;
	}

}

配置项为:

#mongodb
conf.mongo.ip_port="192.168.56.254:27017,192.168.56.66:27018"

则现在的架构为:

我的架构演化笔记 4 :MongoDB 增加集群机制

 

 

下一篇:

http://my.oschina.net/qiangzigege/blog/272194
 

 

 

你可能感兴趣的:(架构)