问题?使用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的在面试汇总经常问到。