码迷,mamicode.com
首页 > 数据库 > 详细

NOSQL《二》之MongoDB的加强

时间:2016-05-27 12:54:37      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:

问题?使用MongoDB操作集群、主从复制、副本集、分布式存储的概念,Java调用MongoDB

一、集群概念和使用

多态计算机,对外服务,处理负载均衡的问题。

集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并各自可以对外服务。


二、主从复制概念和使用

怎么理解呢?也就是主服务器上做什么,从服务器上也得做什么。

            技术分享


主的配置(只能执行事务操作)
技术分享
从的配置(只能执行读的操作,不能执行事务操作)
技术分享

分别登录到这两个服务器,开两个cmd即可

技术分享   技术分享

往主服务器中事务操作,而从服务器执行读操作(只能做读操作),查看数据同步性

技术分享

缺点:没有故障恢复的功能


三、副本集概念和使用

副本集就是有自动故障恢复功能的主从集群。

主从集群副本集最大的区别就是副本集没有固定的“主节点整个集群会选出一个“主节点”,当其故障后,又在剩下的从节点中选中其他节点为“主节点”继续对外服务,遮掩过得一种方式可以实现7*24连续服务工作,副本集总有一个活跃点(primary)和一个或多个备份节点(secondary)。


       技术分享

创建节点集:首先建立文件夹mongodb/logs/node1、node2、node3 and mongodb/logs/dbs/ node1、node2、node3


//以三个节点为例:

节点1:

HOST:localhost:10001

Log File:D:\mongodb\logs\node1\logs.txt

Data File:D:\mongodb\dbs\node1

节点2:

HOST:localhost:10002

Log File:D:\mongodb\logs\node2\logs.txt

Data File:D:\mongodb\dbs\node2

节点3:

HOST:localhost:10003

Log File:D:\mongodb\logs\node3\logs.txt

Data File:D:\mongodb\dbs\node3


启动节点:

开启三个cmd

//启动节点1:
mongod --dbpath D:\mongodb\dbs\node1 --logpath D:\mongodb\logs\node1\logs.txt --logappend --port 10001 --replSet itcast/localhost:10002  --master
//启动节点2:
mongod --dbpath D:\mongodb\dbs\node2 --logpath D:\mongodb\logs\node2\logs.txt --logappend --port 10002 --replSet itcast/localhost:10001
//启动节点3:  
mongod --dbpath D:\mongodb\dbs\node3 --logpath D:\mongodb\logs\node3\logs.txt --logappend --port 10003 --replSet itcast/localhost:10001,localhost:10002

另外开cmd登录服务,并初始化三个节点

技术分享

查看本节点是不是主节点

    技术分享

做插入操作,看看是否数据同步了,还是一样只有主节点才能进行事务操作。

然后在其中挂掉一个,再看看那个作为了主节点,并可进行事务操作,优先级顶上来。

     技术分享




四、分布式存储概念和使用

主要是为了减小数据库数据量大的压力,分压的作用,具体概念百度有

      技术分享

新建三个分布式节点文件夹(我是放在三个盘符里的)

新建一个普通节点(也是放在盘符里的),存放配置信息(路由识别)

 先启动配置节点

     技术分享

起一个路由节点,并且连接配置节点:

技术分享

剩下的就是分布式三个节点

第一个节点:

技术分享

第二个节点:

技术分享

第三个节点:

技术分享

现在要把三个节点放在配置节点中初始化,相当于配置:

登录路由节点服务,进入配置会自动存入配置节点之中,之前他们关联了。

初始化三个节点

技术分享


AllowLocal:true  :表示不用通过路由也可以连接到这三个分布式节点,进行访问
技术分享

并且key指明age为分片,shardcollection指明需要分布存储的集合是那个,添加1000万个文档

技术分享

然后分别起三个客户端连接三个分布式节点,就可以看到数据如下:
都会是一个test.Person集合,路由会根据自己的判断通过age分片,均衡三个分布式节点存储数据,最后访问数据。

技术分享


五、java调用MongoDB

导入包:mongo-2.10.1.jar

package com.itcast.mongodbDao;

import java.net.UnknownHostException;

import org.bson.types.ObjectId;
import org.junit.Test;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.util.JSON;

public class MongoDBDao {

	@Test
	public void testAdd() throws UnknownHostException {
		Mongo mongo = new Mongo("localhost", 27017);
		DB db = mongo.getDB("test");
		DBCollection collection = db.getCollection("person");

		BasicDBObject dbObject = new BasicDBObject();
		dbObject.put("name", "李大san1");
		dbObject.put("descr", "人生友谊");
		collection.insert(dbObject);

		mongo.close();
	}

	@Test
	public void find() throws UnknownHostException {
		Mongo mongo = new Mongo("localhost", 27017);
		
		 //查询所有的Database
		System.out.println("查询所有的Database");
		for(String name:mongo.getDatabaseNames()){
			System.out.println(name);
		}
		
		//查询所有的聚集集合
		System.out.println("查询所有的聚集集合");
		DB db = mongo.getDB("test");
		for(String name:db.getCollectionNames()){
			System.out.println(name);
		}
		
		System.out.println("查询所有的数据");
		DBCollection collection = db.getCollection("person");
		DBCursor cursor = collection.find();
		while (cursor.hasNext()) {
			DBObject object = cursor.next();
			System.out.println(object.toString());
			System.out.println(object.get("name"));
		}
		System.out.println("文档数:"+cursor.count());
		System.out.println("ID:"+cursor.getCursorId());
		System.out.println("JSON数据:"+JSON.serialize(cursor));
		mongo.close();
	}
	
	@Test
	public void delete() throws UnknownHostException{
		Mongo mongo = new Mongo("localhost", 27017);
		DB db = mongo.getDB("test");
		DBCollection collection = db.getCollection("person");
		BasicDBObject dbObject = new BasicDBObject();
		dbObject.put("name", "李大san1");
		collection.remove(dbObject);
	}
	
	@Test
	public void update() throws UnknownHostException{
		Mongo mongo = new Mongo("localhost", 27017);
		DB db = mongo.getDB("test");
		DBCollection collection = db.getCollection("person");
		BasicDBObject dbObject = new BasicDBObject();
		dbObject.put("name", "李大junjun");
		collection.update(new BasicDBObject("_id",new ObjectId("5741c13f8c89776a5081a962")), dbObject, true, true);
		//第一个true如果数据库不存在,是否添加,第二个true只修改第一天,true如果有多条是否修改
	}
}

六、总结

   在本文中,对概念没有介绍太多,主要是是对操作注重,还有对整个流程的理解。
集群,主从复制、副本集、分布式存储概念一定要弄懂,从实web的在面试汇总经常问到。


NOSQL《二》之MongoDB的加强

标签:

原文地址:http://blog.csdn.net/mr_li13/article/details/51485327

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!