MongoDB分片.docx_第1页
MongoDB分片.docx_第2页
MongoDB分片.docx_第3页
MongoDB分片.docx_第4页
MongoDB分片.docx_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MongoDB之sharding【一】1、启动相关进程在shard server上启动mongod,使用-shardsvr 命令行参数。对于主从对,使用-pairwith命令行选项。建议一个shard server只运行一个mongod进程。在config server上启动mongod,使用-configsvr命令行参数。如果config server不是一台独立的服务器,为其分配一个独立的dbpath,-dbpath命令行参数。启动mongos,使用-configdb参数指明配置的数据库地址。2、shell配置分片 在启动好的mongos服务器上运行这些命令,然后通过它运行所有的配置命令。注:应该使用特定的admin数据库来存储这些命令,尽管通过mongos运行时,数据会存储在config server上,所以在集群的生命周期内这些命令只需运行一次即可。./mongo :/admin dbadmin3、增加一个分片,每个分片包括两台服务器(一对主从)或单机(Alpha 2只支持单机)。 db.runCommand( addshard : : );ok : 1 , added : .多台配置用逗号分隔(alpha3及以上版本)。可选参数maxSize可用户设置该分片可使用的磁盘空间,默认为整个磁盘。该参数目前1.4及1.4以前的版本是无效的,1.5版本及以后才会有效。 db.runCommand( listshards : 1 );查看已存在的分片。4、enable一个数据库,必须为分片enable一个数据库,否则数据将全被存在分片上。 db.runCommand( enablesharding : );一旦enable了个数据库,mongos将会把数据库里的不同数据集放在不同的分片上。除非数据集被分片,否则一个数据集的所有数据将放在一个分片上。5、数据集分片,使用shardcollection 命令分隔数据集,key自动生成。 db.runCommand( shardcollection : ,key : )比如,分片测试数据库中的GridFS块集。 db.runCommand( shardcollection : test.fs.chunks, key : _id : 1 )ok : 1配置shard key唯一:db.runCommand( shardcollection : test.users , key : email : 1 , unique : true );6、相关操作命令,官方操作命令1)、db.createCollection(name, size : ., capped : ., max : . )创建非分布式数据集,相当于关系型数据库中的表,别看后面一堆参数,其实通常用的就db.createCollection(name)这个命令,比如db.createCollection(“coll_1”)。2)、db.coll_1.drop(),删数据集。3)、db.coll_1.ensureIndex(id:1),第一个参数为字段名,第二参数值为1则索引为升序;-1则为降序。db.coll_1.dropIndex(name) 删除指定的索引;db.coll_1.dropIndexes()删除所有索引;db.coll_1.getIndexes()查看索引信息。4)、db.coll_1.count(query);db.coll_1.find(query );db.coll_1.insert(obj);db.coll_1.update(query, object, upsert_bool);db.coll_1.save(obj);db.coll_1.remove(query)。query 表达式的文档7、案例:两组分片(一组两台,一组一台)、三个config db、一个mongos,一台测试服务器。首先建立数据库存放位置,这里只为测试,所以就在当前目录了,mkdir data分别到mongodb的安装目录的bin/目录下启动mongodb$ ./mongod -pairwith 12:18020 -dbpath data -port 18020 /启动第一组分片(11:18020)$ ./mongod -pairwith 11:18020 -dbpath data -port 18020 /启动第一组分片(12:18020)$ ./mongod -dbpath data -port 18020 /启动第二组分片(10:18020)$ ./mongod -configsvr -dbpath /var/mongodb/sky/18022 -port 18022 /启动config server(10:18022,11:18022,12:18022)$ ./mongos -configdb 10:18022,11:18022,12:18022 /启动mongos,指定config serverps:config server可以配置多台,mongos启动时指定config server,多个config server之间用英文逗号隔开,中间注意不要有空格,而且你会发现config server的台数只能为单数不能是双数。服务启动好了之后,可使用 ps -ef|grep mongo查看运行情况,开始使用mongodb了。$ ./mongo -host 11 / 连接到mongos上,可使用-port指定端口 show dbsadminconfigLocal use admin db.runCommand( addshard : 11:18020,12:18020, allowLocal : true ) /增加第一组分片 db.runCommand( addshard : 10:18020, allowLocal : true ) /增加第二个分片 db.runCommand(listshards:1) /查看分片情况,会看到分片的信息,共两块_id : ObjectId(4bd27bb39e2b00a5f7d5f0dd),host : 10:18020,_id : ObjectId(4bd27bd39e2b00a5f7d5f0de),host : 11:18020,12:18020 config = connect(10:18022) /连接config server,需要在mongos服务器上操作 config = config.getSisterDB(config) /获取配置信息注:这两步好像没有什么作用,而且也无法连接。 test = db.getSisterDB(test) /新增数据库test db.runCommand( enablesharding : test ) db.runCommand( shardcollection : test.people, key : name : 1 ) /建立分片数据集people db.printShardingStatus(); /查看分片状态信息,会看到shards和databases的详细信息,包括刚建立的test的主分片信息和test.people的分片信息。my chunks name : test, partitioned : true, primary : 11:18020,12:18020, sharded : test.people : key : name : 1 , unique : false , _id : ObjectId(4bd2813fbaaa646853a4b33a) my chunkstest.people name : $minKey : 1 - name : $maxKey : 1 on : 11:18020,12:18020 t : 1272086852000, i : 1 73:18020 t : 1272086192000, i : 1 use test /进入test数据库switched to db test db.createCollection(user_001) /建立数据集user_001,该数据集与people数据集不一样,它不分片 ok : 1 show collections /查看数据集情况peoplesystem.indexesuser_001 db.people.insert(name:sky_people,sex:male,age:25); /插入一条记录了 db.people.find() _id : ObjectId(4bbc38a39e8b5e76dcf4c5a3), name : sky_people, sex : male, age : 25 db.user_001.insert(name:Falcon.C,sex:male,age:25); db.user_001.find(); /查看记录 _id : ObjectId(4bbc371c9e8b5e76dcf4c5a2), name : sky, sex : female, age : 25 db.people.stats() /查看people数据集信息 ,刚才插入的数据放在 10:18020分片上sharded : true,ns : test.people,count : 1,size : 72,storageSize : 8192,nindexes : 2,nchunks : 1,shards : 11:18020,12:18020 : ns : test.people,count : 1, db.user_001.stats() /查看user_001数据集信息sharded : false,ns : test.user_001,count : 1,size : 68,当数据量增大到一定程度的时候(貌似是64M,即一个数据块的大小),数据块chunks开始分块,由一开始的一块变成多块时,数据块chunks就会开始迁移到其他分片了。 db.printShardingStatus(); /查看分片状态信息 name : test, partitioned : true, primary : 11:18020,12:18020, sharded : test.people : key : name : 1 , unique : false , _id : ObjectId(4bbc3524314b8edcaebd990f) my chunkstest.people name : $minKey : 1 - name : 1103 on : 11:18020,12:18020 t : 1270627397000, i : 1 test.people name : 1103 - name : 1259408 on : 11:18020,12:18020 t : 1270627921000, i : 2 test.people name : sky_people - name : $maxKey : 1 on : 10:18020 t : 1270627404000, i : 3 test.people name : 20130082 - name : 21392803 on : 10:18020 t : 1270627924000, i : 2 .db.people.stats()sharded : true,ns : test.people,count : 3384868,size : 5293932968,storageSize : 5942890496,nindexes : 2,nchunks : 33,shards : 11:18020,12:18020 : ns : test.people,count : 3265179,size : 5106739036,storageSize : 5722345728,numExtents : 32,nindexes : 2,lastExtentSize : 960247296,paddingFactor : 1,flags : 1,totalIndexSize : 312467456,indexSizes : _id_ : 177045504,name_1 : 135421952,ok : 1,10:18020 : ns : test.people,count : 119689,size : 187193932,storageSize : 220544768,numExtents : 15,nindexes : 2,lastExtentSize : 43281920,paddingFactor : 1,flags : 1,totalIndexSize : 12025856,indexSizes : _id_ : 7159808,name_1 : 4866048,ok : 1,ok : 1MongoDB数据库性能分析2010-09-25 18:39设置当前数据库日志级别:db.setProfilingLevel(n);引用n:0 - 关闭性能分析,测试环境可以打开,生成环境关闭,对性能有很大影响1 - 开启慢查询日志,执行时间大于100毫秒的语句2 - 开启所有操作日志获取当前数据库日志分析级别:db.getProfilingLevel();数据库的日志分析数据一般存放在当前数据库的 file 集合中查看当前库下所有集合的分析数据file.find()查看某一个集合的分析数据file.find(info://)查看执行时间大于100毫秒的执行操作,并倒序排列,并取前5行file.find(millis:$gt:100).sort($natural:-1).limit(5);分析执行操作的性能参数:query: uid: 200001.0 nreturned:0 bytes:20, millis : 0 ts : Tue Jun 01 2010 12:27:30 GMT+0800 (CST), info : query mosh.users ntoreturn:1000reslen:36 nscanned:1query: uid: 200001.0 nreturned:0 bytes:20, millis : 0 ts : Tue Jun 01 2010 12:27:30 GMT+0800 (CST), info : query mosh.users ntoreturn:1000reslen:36 nscanned:1参数介绍:引用ts:操作执行时的时间戳millis:执行操作所花的时间info: query:数据库查询操作,查询字段信息包括ntoreturn,query,nscanned,reslen,nreturned ntoreturn:从查询中返回客户端指定的对象数 query:查询操作信息 nscanned:在执行查询操作的时候扫描了多少对象 reslen:查询结果的大小 nreturned:从查询中返回的结果对象 update:数据库更新操作, insert:数据库插入操作 getmore:大数据量查询查询优化:1、如果nscanned 比 nreturned 大很多时,说明数据库扫描了很大对象才找到目标对象,因此需要为条件查询创建索引2、当返回的结果集很大时即reslen值相当大时,会影响性能下降,在做find查询时,需要添加第二个查询参数,只获取需要显示的字段更新优化:1、检查nscanned字段,如果字段非常大,数据库需要扫描大量的对象才能查找到并更新,如果更新频率比较大的话,建议创建索引2、尽可能的使用快速的修改操作获得数据库连接现在我们用MongoDB提供的Shell来操作数据库。(如果有一个合适的驱动程序,我们可以用任何语言进行同样的操作)。这个Shell很适合交互和管理使用。下面的命令会启动MongoDB的Javascript Shell:$ bin/mongo默认地,Shell会连接到本地数据库”test”,所以你可以看到:MongoDB shell version: url: testconnecting to: testtype help for help“connecting to:” 指明当前Shell正在使用的数据库名称。你可以输入下面的命令来切换数据库: use mydbswitched to db mydb输入help,可以看到所有的交互命令。如果你有其他数据库的开发经验,那么你可能会注意到,在上面的例子中,我们没有创建数据库或者集合,MongoDB不要求这么做。一旦你插入数据,MongoDB会创建底层的集合和数据库。如果你查询一个并不存在的集合,那么MongoDB会将之视为空集合处理。用“use”命令切换数据库并不会马上创建数据库 数据库会延迟到第一次插入数据的时候才创建。所以如果你初次使用一个数据库,”show dbs”并不会显示出该数据库直到你插入些数据。插入数据现在我们来创建一个测试用的集合,并插入些数据。我们将创建两个对象,j和t,然后把它们保存在集合things中。在接下来的例子中,”表明是shell里输入的命令。 j = name : ray_linn ;name : ray_linn t = x : 3 ; x : 3 db.things.save(j); db.things.save(t); db.things.find(); _id : ObjectId(4c2209f9f3924d31102bd84a), name : ray_linn _id : ObjectId(4c2209fef3924d31102bd84b), x : 3 需要注意几点: 我们并未预先定义集合things,数据库在初次插入数据的时候自动创建它 我们保存的文档可以有任何结构,在例子中,两份文档并没有什么共同的数据对象。不过在实际应用中,通常我们会保存相同结构的文档到同一集合中。然后,这种弹性让数据库schema迁移和添加变得非常容易实施,你几乎不需要写脚本来进行类似”alert table”的操作。 一旦被插入到数据库中,对象会被指定一个对象的ID(如果他们尚无此ID)给字段 _id。如果你运行上面的例子,你的ObjectID值会有所不同: for (var i = 1; i db.things.find(); _id : ObjectId(4c2209f9f3924d31102bd84a), name : ray_linn _id : ObjectId(4c2209fef3924d31102bd84b), x : 3 _id : ObjectId(4c220a42f3924d31102bd856), x : 4, j : 1 _id : ObjectId(4c220a42f3924d31102bd857), x : 4, j : 2 _id : ObjectId(4c220a42f3924d31102bd858), x : 4, j : 3 _id : ObjectId(4c220a42f3924d31102bd859), x : 4, j : 4 _id : ObjectId(4c220a42f3924d31102bd85a), x : 4, j : 5 _id : ObjectId(4c220a42f3924d31102bd85b), x : 4, j : 6 _id : ObjectId(4c220a42f3924d31102bd85c), x : 4, j : 7 _id : ObjectId(4c220a42f3924d31102bd85d), x : 4, j : 8 _id : ObjectId(4c220a42f3924d31102bd85e), x : 4, j : 9 _id : ObjectId(4c220a42f3924d31102bd85f), x : 4, j : 10 _id : ObjectId(4c220a42f3924d31102bd860), x : 4, j : 11 _id : ObjectId(4c220a42f3924d31102bd861), x : 4, j : 12 _id : ObjectId(4c220a42f3924d31102bd862), x : 4, j : 13 _id : ObjectId(4c220a42f3924d31102bd863), x : 4, j : 14 _id : ObjectId(4c220a42f3924d31102bd864), x : 4, j : 15 _id : ObjectId(4c220a42f3924d31102bd865), x : 4, j : 16 _id : ObjectId(4c220a42f3924d31102bd866), x : 4, j : 17 _id : ObjectId(4c220a42f3924d31102bd867), x : 4, j : 18 has more你应该注意到这儿并没有显示所有的文档。自动遍历游标cursor的时候,shell会限制显示20条数据。因为集合中已经有2份文档,所以只能看到新插入的前18份文档。如果我们想要看剩下的结果,你只要输入”it”命令 _id : ObjectId(4c220a42f3924d31102bd866), x : 4, j : 17 _id : ObjectId(4c220a42f3924d31102bd867), x : 4, j : 18 has more it _id : ObjectId(4c220a42f3924d31102bd868), x : 4, j : 19 _id : ObjectId(4c220a42f3924d31102bd869), x : 4, j : 20 技术上,find() 会返回一个游标对象。但在上面的例子中,我们并没有把游标赋予变量。因此,shell自动遍历该游标,返回一个初始的结果集,并允许用”it”命令来继续遍历。不过我们可以直接操作游标,下一章节中我们再讨论。查询数据在更深入讨论查询之前,我们来讨论一下如何使用查询的结果,即游标对象。我们简单用”find()”来查询集合,它会返回集合中的所有文档,后面我们将谈到如何创建更精准的查询。使用mongo shell时,如果想看到集合中的所有元素,我们需要明确使用find()操作所返回的游标。我们重复上面的查询,不同的是,这次我们用find()返回的游标,然后用循环遍历该游标。 var cursor = db.things.find(); while (cursor.hasNext() printjson(cursor.next(); _id : ObjectId(4c2209f9f3924d31102bd84a), name : ray_linn _id : ObjectId(4c2209fef3924d31102bd84b), x : 3 _id : ObjectId(4c220a42f3924d31102bd856), x : 4, j : 1 _id : ObjectId(4c220a42f3924d31102bd857), x : 4, j : 2 _id : ObjectId(4c220a42f3924d31102bd858), x : 4, j : 3 _id : ObjectId(4c220a42f3924d31102bd859), x : 4, j : 4 _id : ObjectId(4c220a42f3924d31102bd85a), x : 4, j : 5 _id : ObjectId(4c220a42f3924d31102bd85b), x : 4, j : 6 _id : ObjectId(4c220a42f3924d31102bd85c), x : 4, j : 7 _id : ObjectId(4c220a42f3924d31102bd85d), x : 4, j : 8 _id : ObjectId(4c220a42f3924d31102bd85e), x : 4, j : 9 _id : ObjectId(4c220a42f3924d31102bd85f), x : 4, j : 10 _id : ObjectId(4c220a42f3924d31102bd860), x : 4, j : 11 _id : ObjectId(4c220a42f3924d31102bd861), x : 4, j : 12 _id : ObjectId(4c220a42f3924d31102bd862), x : 4, j : 13 _id : ObjectId(4c220a42f3924d31102bd863), x : 4, j : 14 _id : ObjectId(4c220a42f3924d31102bd864), x : 4, j : 15 _id : ObjectId(4c220a42f3924d31102bd865), x : 4, j : 16 _id : ObjectId(4c220a42f3924d31102bd866), x : 4, j : 17 _id : ObjectId(4c220a42f3924d31102bd867), x : 4, j : 18 _id : ObjectId(4c220a42f3924d31102bd868), x : 4, j : 19 _id : ObjectId(4c220a42f3924d31102bd869), x : 4, j : 20 上面的例子是个游标风格的遍历。hasNext()函数表明游标中是否还有更多的文档,next()函数返回下一份文档。我们还用了系统内建的tojson()方法将文档转换成JSON风格的格式。由于Mongo Shell是个javascript shell,所以我们也能用javascript的所有函数和功能,比如说在游标上调用forEach。我们重复上面的例子,不过这次用forEach而不是while来遍历游标。 db.things.find().forEach(printjson); _id : ObjectId(4c2209f9f3924d31102bd84a), name : ray_linn _id : ObjectId(4c2209fef3924d31102bd84b), x : 3 _id : ObjectId(4c220a42f3924d31102bd856), x : 4, j : 1 _id : ObjectId(4c220a42f3924d31102bd857), x : 4, j : 2 _id : ObjectId(4c220a42f3924d31102bd858), x : 4, j : 3 _id : ObjectId(4c220a42f3924d31102bd859), x : 4, j : 4 _id : ObjectId(4c220a42f3924d31102bd85a), x : 4, j : 5 _id : ObjectId(4c220a42f3924d31102bd85b), x : 4, j : 6 _id : ObjectId(4c220a42f3924d31102bd85c), x : 4, j : 7 _id : ObjectId(4c220a42f3924d31102bd85d), x : 4, j : 8 _id : ObjectId(4c220a42f3924d31102bd85e), x : 4, j : 9 _id : ObjectId(4c220a42f3924d31102bd85f), x : 4, j : 10 _id : ObjectId(4c220a42f3924d31102bd860), x : 4, j : 11 _id : ObjectId(4c220a42f3924d31102bd861), x : 4, j : 12 _id : ObjectId(4c220a42f3924d31102bd862), x : 4, j : 13 _id : ObjectId(4c220a42f3924d31102bd863), x : 4, j : 14 _id : ObjectId(4c220a42f3924d31102bd864), x : 4, j : 15 _id : ObjectId(4c220a42f3924d31102bd865), x : 4, j : 16 _id : ObjectId(4c220a42f3924d31102bd866), x : 4, j : 17 _id : ObjectId(4c220a42f3924d31102bd867), x : 4, j : 18 _id : ObjectId(4c220a42f3924d31102bd868), x : 4, j : 19 _id : ObjectId(4c220a42f3924d31102bd869), x : 4, j : 20 在forEach()这个例子中,我们需要定义个函数,遍历游标中的每份文档时调用它。在mongo shell中,你也可以把游标当成数组来使用: var cursor = db.things.find(); printjson(cursor4); _id : ObjectId(4c220a42f3924d31102bd858), x : 4, j : 3 这样使用游标要注意,所有高位的值(cursor4之后的)同时被载入内存。如果返回巨大的结果集这样就很不适合,可能会导致内存不足。如果结果返回很多元素,游标应该用在迭代器中。除了按数组风格存取游标,你也可以把游标转换成真正的数组: var arr = db.things.find().toArray(); arr5; _id : ObjectId(4c220a42f3924d31102bd859), x : 4, j : 4 请注意,这些数组方面的特性只适用于mongo shell,不适用于所有驱动程序。MongoDB游标不是快照 snapshots 在初次和末次调用next()中,对所查询的集合进行的操作不一定会被游标所返回。如需进行快照查询,要明确锁定集合。精确查询结果现在我们对如何处理查询返回的游标对象有了个认识,现在让我们关注如果让查询返回更精确的东西。通常情况下,完成这个需要创建”查询文档“,里面记录有用来匹配的键值模式。用例子来解释可能更简单一些。在下面的例子里,我们给出了SQL样例,然后再给出在mongo shell里如何表现同样的查询。这种精确查询的方法是mongodb里相当基础的东西,因此任何语言或驱动都会提供类似的东西。SELECT * FROM things WHERE name=ray_linn db.things.find(name:ray_linn).forEach(printjson); _id : ObjectId(4c2209f9f3924d31102bd84a), name : ray_linn SELECT * FROM things WHERE x=4 db.things.find(x:4).forEach(printjson); _id : ObjectId(4c220a42f3924d31102bd856), x : 4, j : 1 _id : ObjectId(4c220a42f3924d31102bd857), x : 4, j : 2 _id : ObjectId(4c220a42f3924d31102bd858), x : 4, j : 3 _id : ObjectId(4c220a42f3924d31102bd859), x : 4, j : 4 _id : ObjectId(4c220a42f3924d31102bd85a), x : 4, j : 5 _id : ObjectId(4c220a42f3924d31102bd85b), x : 4, j : 6 _id : ObjectId(4c220a42f3924d31102bd85c), x : 4, j : 7 _id : ObjectId(4c220a42f3924d31102bd85d), x : 4, j : 8 _id : ObjectId(4c220a42f3924d31102bd85e), x : 4, j : 9 _id : ObjectId(4c220a42f3924d31102bd85f), x : 4, j : 10 _id : ObjectId(4c220a42f3924d31102bd860), x : 4, j : 11 _id : ObjectId(4c220a42f3924d31102bd861), x : 4, j : 12 _id : ObjectId(4c220a42f3924d31102bd862), x : 4, j : 13 _id : ObjectId(4c220a42f3924d31102bd863), x : 4, j : 14 _id : ObjectId(4c220a42f3924d31102bd864), x : 4, j : 15 _id : ObjectId(4c220a42f3924d31102bd865), x : 4, j : 16 _id : ObjectId(4c220a42f3924d31102bd866), x : 4, j : 17 _id : ObjectId(4c220a42f3924d31102bd867), x : 4, j : 18 _id : ObjectId(4c220a42f3924d31102bd868), x : 4, j : 19 _id : ObjectId(4c220a42f3924d31102bd869), x : 4, j : 20 这段查询表达式本身也是个文档。诸如 a:A, b:B, 这种格式的查询文档等效于”where a=A and b=B and ”。有关查询的更多信息可以在MongoDB开发手册中的”查询和游标“一节中获得。MongoDB也能让你返回“部分文档” 即返回的文档只包含存储在数据库中文档元素的子集。为此,你要在find()查询中增加第二个参数,列出文档中哪些元素需要被返回。下面例子中,我们给上面的find(x:4)例子增加一个额外的参数限制返回的文档中只包含元素“j”:SELECT j FROM things WHERE x=4 db.things.find(x:4, j:true).forEach(printjson); _id : ObjectId(4c220a42f3924d31102bd856), j : 1 _id : ObjectId(4c220a42f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论