注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

MongoDB数据库从基础到高级应用详细说明  

2013-01-05 17:00:53|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
MongoDB是一个基于分布式文件存储的数据库开源项目。由C++语言编写。旨在为WEB应用提供可护展的高性能数据存储解决方案。 

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 
*面向集合存储,易存储对象类型的数据。 
*模式自由。 
*支持动态查询。 
*支持完全索引,包含内部对象。 
*支持查询。 
*支持复制和故障恢复。 
*使用高效的二进制数据存储,包括大型对象(如视频等)。 
*自动处理碎片,以支持云计算层次的扩展性 
*支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。 
*文件存储格式为BSON(一种JSON的扩展) 
*可通过网络访问。


最近有好多同事都在用mongodb,一个新的面向文档型介于面向对象与关系型之间免费的数据库,据说有拥有比传统数据库更高的性能。趁今天早上有空,就研究了一下。 
   
   首先上mongodb官网(www.mongodb.org)看了一下开始文档,下了个windows版的,装了一下,并且写了几个简单的例子,测试了一下,经过测试,mongodb确实好用,也很简单,当然其中也遇到了很多问题,因此为了能让以后的同学们更好的入门,所以做一个简单的介绍。如果你想尽快入门,则可以按照如下的步骤进行。 
   
   1,安装并启动数据库 
   
   从官网(www.mongodb.org/downloads)下载一个适合你平台的版本,我的系统是win7 64位的,下载文件也就10几M,将下载的文件解压放到任何目录,最好避免使用带空格和中文的目录,本机将其解压至C盘,并将文件夹改名为mongodb,这样也是为了后面输入目录更方便。 
   
   进入mongodb目录,我们发现有如下目录结构 
   |--mongodb 
       |-- bin 
            |-- mongo.exe 
|-- mongod.exe ........ 

所以整个mongodb是非常简单的,以上列的也是我们最常用的命令,其它暂时不解释。 
为了以后的操作方便,因此我们将当前的bin目录加入path,如果不会的可以百度Google。 
现在打开一个命令窗口,键入mongod,则窗口会提示数据库启动失败,如果你仔细看控制台打出的消息,有如下这么一行: 
dbpath (/data/db/) does not exist, terminating 
目录/data/db/是Linux下面的表示法,代表着数据库默认的数据文件目录,而上面的提示的意思是说数据库目录不存在,那么我们就在mongodb止录下手动建立一个目录db,当然此时屏幕上可能有些乱,这时可输入cls进行清屏操作。再输入命令:mongodb --dbpath c:/mongodb/db,此时窗口打出几行日志,然后处于等待状态了,那么就表示数据库启动成功了!当然这个窗口不能关闭。 


2,登录并操作数据库(Shell方式) 

2.1,连接 
打开命令窗口,键入mongo,如果系统提示:connecting to: test,表示连接成功。 

2.2,查看所有库 
    键入show dbs,则会显示出当前数据库中所有的数据库名称。在mongodb里面是不用 
去手动建立一个数据库的,你只要直接使用就好,如果不存在数据库引擎会帮我们 
创建他们。这一点与传统数据库相比有些不同。 

2.3,使用mydb 
键入use mydb,使用数据库mydb,当然 
mongodb会帮助我们自动创建他们,当然这个时候数据库还是空的,可以通过输入 
show dbs来确认这一点。 
   
   2.4,新增记录 
   输入:
Java代码
  1. db.user.save({name:'Rod',age:30})  

   
   2.5,查看集合当中所有文档 
   db.user.find()可查看出当前库user集合中所有的文档,如下图所示: 
   { "_id" : ObjectId("4df2201ac905b4e2a5f555cb"), "name" : "Rod", "age" : 30 } 
   此时发现,在文档的前面多了一列"_id",这是自动加进去的,不用管他。 
   
   2.6,删除记录 
   db.user.remove()将删除所有记录,db.user.remove({name:'Rod'})将删除指定记录 
   
   2.6,保存多条记录 
   输入:
Java代码 
  1. for(var i=1;i<=20;i++) db.user.save({x:8,y:i})  
,可以看出整个语法很像 
   JS,其实你正在使用的就是一个JavaScript Shell。此时可以输入db.user.find() 
   来查看所有记录。 
   
   2.7,迭代器的使用 
   我们再向集合中插入一条记录:db.user.save({x:'test'}),再次查看所有记录 
   db.user.find(),则发现只显示出了前20条记录。此时可以输入it(iteraor)来 
   查看余下的记录。 
   
   在mongodb里可以将cursor当成数组来使用,如下所示: 
 
Java代码 
  1. var cursor = db.user.find(); // 将游标缓存起来  
  2.    printjson(cursor[4]); // 打印出第5条记录  

   注意此种方式会将前N行全查出来,所以对性能有较大影响。 
   
   2.8,根据条件查询 
   现要查询出y大于10的所有记录: 
 
Java代码 
  1. db.user.find({y:{$gt:10}});  

   其中$gt的意思就是“大于”,当然读者可推出其他N种表达。 
   
   2.9,查询指定列 
  
Java代码 
  1. db.user.find({x:8},{y:true});// 查询出x=8的所有记录的y列  
  2.        db.user.find({},{y:true}); // 查询出所有的Y列  

   
   2.10,只查第一列 
   有的时候我们只需要第一行的值,如果自己编程实现显得有些麻烦,因此数据库为我们 
   提供了一个方法:db.user.findOne(); 
   
   2.11,限制最大记录从而提高性能 
   我们可以通过limit来限制查询的最大行数,如下: 
   db.user.find().limit(4); // 只显示出前四条 
   
   2.12,修改记录 
   将第一条x为3的记录修改为后面的值,db.user.update({x:4},{x:4,y:1}); 
   
   3,MongoDB 数据结构 
   
   从以上可以看出,每一个MongoDB包含了多个库(通过show dbs查看),这些库都是在第一次使用时自动创建的可以通过use   dbName来使用指定库。每一个库包含了多个集合,可以使用命令show collections 显示所有集合,所以我们在操作文档的时候要手动指定集合(db.user.find),每个集合包含多份文档,也就是json对象。 
   
   
   4,利用java操作MongoDB 
   从官网下载java版本的驱动并将其加入classpath。 

   3.1,建立连接 

Java代码 
  1. Mongo m = new Mongo(); // 连接本地的27017端口  
  2.    // or  
  3.    Mongo m = new Mongo( "localhost" ); // 默认端口27017  
  4.    // or  
  5.    Mongo m = new Mongo( "localhost" , 27017 ); // 指定主机与端口  
  6.    DB db = m.getDB( "mydb" ); // 取得指定的库  

    
   3.2,用户认证(可选) 
   在登录数据库时,在数据库启动时可以指定是否需要认证(mongod --auth .....), 
   此时连接时就需要用户名和密码(--serviceUser xx --servicePassword xx),如下: 
 
Java代码 
  1. boolean auth = db.authenticate(myUserName, myPassword);  

   
   3.3,得到指定库的所有集合 
   
 
Java代码 
  1. Set<String> colls = db.getCollectionNames();  
  2.       for (String s : colls) {  
  3.           System.out.println(s);  
  4.       }  

   
   3.4,得到指定集合 
 
Java代码 
  1. DBCollection coll = db.getCollection("user");  

   
   3.5,插入文档 
Java代码 
  1. BasicDBObject doc = new BasicDBObject();  
  2.     
  3.   doc.put("name""MongoDB");  
  4.      doc.put("type""database");  
  5.      doc.put("count"1);  
  6.       
  7.   BasicDBObject info = new BasicDBObject();  
  8.      info.put("x"203);  
  9.      info.put("y"102);  
  10.        
  11.   doc.put("info", info);  
  12.      coll.insert(doc); // 保存  
  13.     

   3.6,查询集合中的第一份文档 
 
Java代码 
  1. DBObject myDoc = coll.findOne();  

   
   3.7,增加多份文档 
Java代码 
  1. for (int i=0; i < 100; i++) {  
  2.          coll.insert(new BasicDBObject().append("i", i));  
  3.      }  

   
   3.8,统计集合中文档的条数 
  
Java代码 
  1. System.out.println(coll.getCount());  

   
   3.9,利用游标得到所有记录 
Java代码 
  1. DBCursor cur = coll.find();  
  2.      while(cur.hasNext()) {  
  3.          System.out.println(cur.next());  
  4.      }  

   
Java代码 
  1. 3.10,查询指定文档  
  2.   BasicDBObject query = new BasicDBObject();  
  3.        
  4.   query.put("x"8);  
  5.      cur = coll.find(query);  
  6.        
  7.   while(cur.hasNext()) {  
  8.           System.out.println(cur.next());  
  9.      }  

   
   有时个为了方便我们也可以写成这种形式: 
 
Java代码 
  1. query.put("i"new BasicDBObject("$gt"20).append("$lte"30));   
  2.    // i.e. 20 < i <= 30  
  3.      
  4.      

   3.11,创建一个索引 
 
Java代码 
  1. coll.createIndex(new BasicDBObject("i"1));   
  2.    // create index on "i", ascending  
  3.      

   3.12,查询集合中的索引列表 
Java代码 
  1. List<DBObject> list = coll.getIndexInfo();  

   
   3.13,得到所有的库名 
 
Java代码
  1. Mongo m = new Mongo();  
  2.    m.getDatabaseNames();  

   
   3.14,删除一个库 
 
Java代码
  1. m.dropDatabase("my_new_db");  

   
   
   
   4,MongoDB类型与java类型 
   
   4.1,自动成生主键 
 
Java代码
  1. ObjectId id = new ObjectId();  
  2.    ObjectId copy = new ObjectId(id);  

   
   4.2,正则表达式的运用 
 
Java代码
  1. Pattern john = Pattern.compile("joh?n", CASE_INSENSITIVE);  
  2.       BasicDBObject query = new BasicDBObject("name", john);  
  3.       // finds all people with "name" matching /joh?n/i  
  4.       DBCursor cursor = collection.find(query);  

   
   4.3,日期类型 
 
Java代码
  1. java.util.Date now = new java.util.Date();  
  2.       BasicDBObject time = new BasicDBObject("ts", now);  
  3.       collection.save(time);  

   
   4.4, 数组 
Java代码
  1. ArrayList x = new ArrayList();  
  2.      x.add(1);  
  3.      x.add(2);  
  4.      x.add(new BasicDBObject("foo""bar"));  
  5.      x.add(4);  
  6.      BasicDBObject doc = new BasicDBObject("x", x);  
  7.     

   4.5,二进制数据 
   字节数组(byte[])会被自动包装成二进制类型。 
   
   4.6,时间 
   Timestamp会被转换成BSONTimestamp。 
   
   4.7,源代码数据 
   源代码数据代表了JavaScript代码。CodeWScope类代表了这种数据。 
   
   
   
   5,高级操作部分 
   
   5.1,数据据安全 
   
   为了使MongoDB安全生效,必须以--auth参数启动,同时还要在db.system.users文档中增加用户信息 
   
   如果在db.system.users中无数据,即使以--auth启动,对于本地的访问也是允许的。 
   
   增加一个新的用户:db.addUser("foo", "bar"); 
   查询刚才增加的用户:db.system.users.find(); 
   删除用户:db.removeUser("foo"); 
   为了提高查询性能和安全性,也可增加只读用户:db.addUser("foo", "bar", true); 
   
   
   此时虽然用户已经有了,但是怎么去测试是否生效了呢?先进行认证测试一下,如下: 
   db.auth("foo", "bar"); 
   如果在服务端打出1则表示认证通过,客户端可以使用了,如果是0表示不通过 
   
   那么在客户端可以通过如下代码进行认证: 
   db.authenticate("foo", "bar".toCharArray()); 
   由此可知,所有的用户信息是加在数据库上面的,每个库都有自己的用户信息。 
   
   如此便可增加安全认证功能了! 
   
   
   2011.06.10 未完待续。。。。。。。。。。 
   
   
5.2,引用vs 内嵌 

在关系型数据库中,我们可以通过外键引用来表达一对多关联,建立中间表来表达多对多关联。在MongoDB中却没有这种机制,我们可以通过对象的引用关系来实现这种关联,也可以把关联的文档内嵌到文档当中。 
对于引用这种方式,我们可以通DBRef这个类进行实现。 

那么在实际工作当中,我们应该选择哪种存储方式,有如下规则: 
1) 顶层对象应该有自己的集合 
2) 明细对象应该被嵌入父对象,例如OrderDetail与Order 
3) 拥有包含关系的对易用应该被嵌入 
4) 对于多对多关联应该使用数据库引用 
5) 对于那种稳定的比较小的集合可以在服务器端将其缓存起来从而提高性能 
6) 不能去引用一个嵌入的对象,至少目前还无法实现 
7) 我们很难去统计嵌入的对象 
8) 如果嵌入的对象太多太大会导致单个对象达到他的最大值 
9) 记住最后一条:如果遇到性能问题,那么请使用嵌入方式进行存储 

5.3,数据库优化 

1)对于排序的字段,请加入索引 
现在根据y字段倒序显示:db.user.find().sort({y: -1});,为了提高性能那么需要在字段y上加入索引 
db.user.ensureIndex({y:1});这样一来,就可以根据索引排序,而不是直接查绚集合中的所有文档。 
2)限制最大记录数:db.user.find().limit(10); 
3)只查询所需要的键,而不是所有全查出来:db.user.find({}, {y: 1}); 
4)统计记录条数利用count()方法:db.user.find().count(); 
5)强制使用指定索引:db.user.find().hint({y: 1}); 

5.4,高级查询 

1)利用索引提高查询速度 
首先我们在x字段上建立索引:db.user.ensuerIndex({x : 1}); 
然后再查询:db.user.find({x:8}, {_id: 0, x: 1}).explain(); 会有如下输出: 
Java代码 
  1. {  
  2.         "cursor" : "BtreeCursor x_1",  
  3.         "nscanned" : 19,  
  4.         "nscannedObjects" : 19,  
  5.         "n" : 19,  
  6.         "millis" : 0,  
  7.         "nYields" : 0,  
  8.         "nChunkSkips" : 0,  
  9.         "isMultiKey" : false,  
  10.         "indexOnly" : true,  
  11.         ……………………….  
  12. }  

其中"indexOnly" : true代表着此次查询启用了索引。 
一般的查询不会利用索引,除非满足以下条件, 
A) 必须列出要返回的字段名,这样才能决定是否需要启用索引 
B) 必须显示的指出不显示_id字段{ _id : 0} 

2)利用“.”(点号)进行对象间的导航 
> db.user.find({}, {“x.y” : 1}); 

3)查询指定范围的值:db.user.find({y: {$gt : 4, $lt : 10}}); // 4 < y < 10 


4)匹配所有$all:db.things.find( { a: { $all: [ 2, 3 ] } } ); 

5)存在性判断$exists: 
db.things.find( { a : { $exists : true } } ); // 如果存在则返回 
db.things.find( { a : { $exists : false } } ); // 如果不存在则返回 

6)求余$mod:db.things.find( "this.a % 10 == 1"),也可写成如下形式: 
db.things.find( { a : { $mod : [ 10 , 1 ] } } ) 

7)不等于$ne:db.things.find( { x : { $ne : 3 } } ); 

8)IN子句$in:db.things.find({j:{$in: [2,4,6]}}); 

9)Not In子句$nin:db.things.find({j:{$nin: [2,4,6]}}); 

10)OR条件$or:db.foo.find( { $or : [ { a : 1 } , { b : 2 } ] } ) 

11)利用正则表达式进行复杂匹配 
Java代码 
  1. db.customers.find( { name : /acme.*corp/i } );  
  2. db.customers.find( { name : { $regex : 'acme.*corp', $options: 'i' } } );  
  3. db.customers.find( { name : { $regex : /acme.*corp/i, $nin : ['acmeblahcorp'] } } );  


i表示大小写不敏感 

12)取反操作$not:db.customers.find( { name : { $not : /acme.*corp/i } } ); 

13)统计文档数: 
nstudents = db.students.find({'address.state' : 'CA'}).count(); 
不要这样做,这样会导致客户端排序,增加网络传输 
nstudents = db.students.find({'address.state' : 'CA'}).toArray().length; // VERY BAD 

14)分页查询:
Java代码 
  1. n = db.students.find().skip(20).limit(10).count(true);  



15)排序sort():
Java代码 
  1. db.myCollection.find().sort( { ts : -1 } ); // 按TS降序排列  


项目过程中的总结与建议

1.大小写问题
mongodb 是默认区分大小写的,但是这会不会衍生出跟mysql 一样的问题?(mysql 区
分大小写,导致windows 与linux 下的表名,字段名不一致)。
如果无特别用途,建议表名,字段名全部用小写字母。

2.尽可能的缩短字段名的长度
mongodb 的schema free 导致了每笔数据都要存储他的key 以及属性,这导致了这些数
据的大量冗余。开发同事也许考虑到,从易读性出发设计的key 基本比较长,基本都是按
照起字面意思去设计的。这导致key 很长。对应的数据存储占用了很大的空间。
必要的时候,可以考虑建立一个key 与实际意义的map 表,尽量降低key 的长度。
示例定义:
// 基本信息
static final String _ID = "_id";
static final String STATUS_CODE = "sc";
// 缓冲
static final String DATE = "date";
static final String MAX_AGE = "age";
// 内容
static final String CONTENT = "content";
static final String CONTENT_TYPE = "ctype";
static final String CONTENT_LENGTH = "clen";
static final String ZIP = "zip";

3. mongodb 单表最大索引数为64
无索引排序的最大数据量为4M, 超过则报错退出。
建议where 条件尽量落在索引字段上,排序字段需要建立索引,索引的使用原则与oracle
mysql 一致,尽量降低索引数量,索引长度。
mongodb 的查询每次只能用到一个索引,对数据的查询不会“并发”执行
例如: db.tab.find({'id'=1,'name'=2}) 如果‘id’,‘name' 列上分别有索引
对查询效率提升意义不大,如果索引为('id','name') 则大幅提升效率。

4.mongodb 添加字段
如果添加字段且带有default 值,需要全部数据都要修改,这也是设计阶段需要考虑的
事情,这个问题的另外一种解法是应用代码里做一次判断。

5.测试过程的密码问题
对于用作数据库使用的Mongodb,在代码测试阶段都应加上密码验证,目前上线阶段基
本都会在密码验证方面出现问题(做缓存使用的可以不做密码验证)。

6.数据源连接方式
使用连接池模式,尽量减少认证带来的性能额外消耗
建议采用标准的uri 连接方式: mongodb://user:passwd@host:port,host:port/db

7.Mongodb日志量
正常情况下不需要开启-v 日志选项。
Mongodb 的-v 日志适合在开发环境的调试线上部署不建议采用这个参数,目前线上
部署的情况,-v 日志一天也会有几个G 的日志量,去掉这个参数,跟数据查询相关的操作
就不会记日志了,数据库的内部的重要操作还是会写日志的。

8.连接数大小的设置
Mongodb 驱动程序采用的连接池的方式连接到数据库,目前从观察到的情况是应用一
开启便根据变量的设置,建立全部连接,然后提供给程序使用,并且一旦其中某个连接
到数据库的访问失败,则会清空整个连接池到这台数据库的连接,并重新建立连接。
而mongodb 对中断连接的垃圾清理工作则是懒惰的被动清理方式,如果驱动程序端配
置的连接数过大,一旦发生重连,则会导致mongo 端堆积大量的垃圾连接数据,导致
主机资源耗尽。
建议: mongodb 驱动的连接池大小的设置一般应该控制100 以下,一般情况30-50 足
够支撑应用访问。

9.锁的问题
Mongodb 对数据库的访问全部加锁,如果是查询请求则设置共享锁,数据修改请求,
则设置全局排他锁,并且是实例级别的排他锁。并且写锁会阻塞读请求,如果长时间持有
写锁,会阻塞整个实例的读请求。
部署建议:
1】一般情况下,建议不同的应用不要合用一套示例。
2】如果资源不满足,需要合用,应该具有相同属性的应用合用一套实例。
例如合同mongo 的应用都是读多写少,防止一台写多应用阻塞读请求。

10.关于map/reduce问题
mongodb 对map/reduce 的支持是单线程的,我们不建议在前台使用该功能, group by
是通过map/reduce 实现的,开发过程中,要慎用。

11.安全问题
1】Mongodb 运行在mongodb 用户之上,并禁止mongodb 用户登录
2】使用Mongodb 自带的认证方法(adduser、auth)限制用户访问行为
3】将Mongodb 置于内网环境中
4】Mongodb 必须暴露在外网环境中的时候,使用IPTABLES 等网络层技术进行防护
5】网络层面内容为明文传输,可以考虑存储加密文档,应用端,加解密。

12.性能监控
Mongodb 自带有性能数据收集系统
Mongostat 实时采集数据库的多项指标,提供http console 端口号为应用端口号+1000。
关注的主要性能指标:
1】Faults:显示Mongodb 每秒页面故障的数量,这个是mongoDB 映射到虚拟地址空间,
而不是物理内存,这个值如果飙高的话,可能意味着机器没有足够的内存来
存储数据和索引。
2】Flushes:每秒做了多少次fsync,显示多少次数据被刷新进了磁盘
3】locked:写锁
4】idx miss:索引未命中比例
5】qr | qw:读写锁的请求队列长度。
6】conn: 当前已经建立的连接数。
其他命令:
Db.stat()
db.serverStatuse()
Db.collection.stats()

13.碎片问题
Mongodb 数据库如果数据修改很频繁,会出现比较严重的空间碎片问题,表现在磁盘
文件扩张与实际数据量不相符,内存不够用,索引命中率低,查询效率降低。
碎片整理,目前我们采用的版本没有太有效的方法。
可以用db.repaireDatabase() 来整理数据库,这个过程非常的慢
如果是Master-slave 模式则相当于执行一次主从切换,然后从新建立从库。
如果是replSet 架构可以停掉数据库,然后删除数据目录,从新从复制复制组中全同步数据,
这个时候要考虑oplog 的尺寸。
一个大体的步骤:
1.】先调用rs.freeze(1200),将每个不想让它成为primary 的机器让它在1200 秒内无法成为
primary(这步也可以不做)
2. 】将primary stepDown,不出意外新的primary 会起来.
3. 】将原primary kill 掉.
4. 】删掉所有data 数据(调用repair 很慢,真不如干掉重新来)
5. 】再重启动原primary 的进程
6. 】以此循环完成整个复制组的全部重建。

14.系统备份:
Mongodb 目前不支持在线备份,只能离线备份。
我们采用的架构为replSet 和Master-slave .
基于我们目前的架构以及数据一致性要求,我们没有安排相关的备份系统。

15.应用代码中Mongodb连接问题
在有些应用在使用Mongodb 过程中会存在以下两个小问题:
1. 在应用启动过程中,应用存在要求连接池中所有的连接都建立成功才让应用正
常启动,这种做法不可取,因为存在网络问题、Mongodb 拒绝连接或Mongodb 假死情况,如果没加外部try catch 做防护,则Resin 不断重启也不能正常启动端口。
2.有些应用在使用Mongodb 中连接池配置了safe=true,w=1;这种配置意味着客户端在
插入数据或更新数据的时候,要求mongodb 必须将所更新的数据写入磁盘并返回更新成功的信息给程序。如果碰上应用程序访问压力大,mongodb 就会反应迟钝,并会发生假死可能,针对此情况,需要评估数据的一致性需求,做出合适调整。我们一般建议关闭此选项。

16.补充开发方面的一些问题
1】skip+limit翻页,越往后面越慢,有资料说用数组元素的分页可以解决,目前还没
试过,比较靠谱的做法是,先找出上次的id,翻页的时候不用skip:
last_row_id = ObjectId(‘....’);
db.activity_stream->find({_id:{$lt: last_row_id },
user_id:20 } ).sort( {_id:-1} ).limit(10);
2】.只有真正需要的字段才select出来
3】.更新的某条数据的时候,先查出来再更新会减小锁的时间
4】.只有返回很少结果的查询才用索引,否则会加载太多数据,比没有用索引还慢
5】.属性比较多的时候,建立分层的关系能够提高查询效率,否则每个记录都要过一遍
才能找到要的属性

17.关于硬件资源的选择:
虚拟机可以很好的隔离资源,并可动态的扩展。
我们建议mongodb 的部署采用虚拟机的方式,每个虚拟机部署一个实例,使各节点分
散在不同的物理机上,根据应用的前期预测,平衡虚拟机的之间的i/o。


  评论这张
 
阅读(1547)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016