我的架构演化笔记 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"

则现在的架构为:

 

 

下一篇:

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

 

 

转载于:https://my.oschina.net/qiangzigege/blog/271894

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值