您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
支持海量数据的 MongoDB NoSQL
 
火龙果软件    发布于 2014-09-29
  1231  次浏览      13
 

关于这个速查卡

MongoDB是一个文档型数据库,它可以方便的应用于大多数语言。这个小清单列出了MongoDB经常使用和容易忘记的一些操作,命令和技术。

配置选项

安装选项

启动MongoDB的选项可以通过命令行或者配置文件设置,两者的语法稍微有点不同,这里有一个三种选项的设置例子:

在mongod下运行--help可以列出所有的操作选项,但是这里我们列出了一些最常用的:

如果想安全的启动mongod,就要使用nohttpinterface和bind_ip操作选项,确定外网不能直接访问。尤其确保你没有其余的选项启动,MongoDB需要以下网络环境可以访问:

1.单个服务器 - 客户端程序可以获取访问连接

2.副本集 - 任何成员集能够访问,包括自己;客户端能够访问任何一个成员集,并且可访问的成员集都能够成为主节点(活跃节点).

3.分片- mongos进程必须能够连接到配置的服务器和分片,分片必须能够彼此连接。客户端程序必须能够连接到mongos进程。配置服务器没必要彼此提供访问连接的支持。

所有的连接都是通过tcp建立的.

查看配置

如果你6个月前启动mongod时做了一堆配置,那么现在你如何知道做了什么配置呢?这里提供了一个shell小助手:

> db.serverCmdLineOpts()
{ "argv" : [ "./mongod", "--port", "30000" ], "parsed" : { },
"ok" : 1 }

解析后的字段是从配置文件读取的一些参数列表.

使用shell

Shell帮助

当你忘记一个命令时,mongodb提供了许多功能帮助你:

> // basic help
> help
db.help() help on db methods
db.mycoll.help() help on collection methods
sh.help() sharding helpers
rs.help() replica set helpers
help admin administrative help
help connect connecting to a db help
...

注意对于数据库,集合,副本集,分片,管理员等提供了单独了帮助功能。这里没有一一列出,像游标的帮助功能如下:

> // list common cursor functions
> db.foo.find().help()

你可以使用这个功能和小助手作为一个内置的备忘清单。

查看方法的定义

如果你不知道一个方法是干什么用的,你可以在shell中通过去除括号的方式运行它,查看它的源码:

> // run the function
> db.serverCmdLineOpts()
{ "argv" : [ "./mongod" ], "parsed" : { }, "ok" : 1 }
> // see its source
> db.serverCmdLineOpts
function () {
return this._adminCommand("getCmdLineOpts");
}

这可以帮助我们获悉这个方法需要什么参数和抛出什么错误,以及如何在其他语言中使用。

使用编辑功能

shell命令限制多行的支持,因此在里面编写程序很费劲,shell编辑小助手让它更加简单,打开一个文本编辑器,编辑一个变量,例如:

> x = function() { /* some function we're going to fill in */ }
> edit x

在编辑器修改一个变量保存退出。这个变量就在shell里面被设定好了。

不管是编辑器的环境变量或者MongoDB shell的变量编辑环境,都必须设置使用edit模式。你可以在MongoDB shell中通过如下命令配置:

> EDITOR="/usr/bin/emacs"

编辑模式在JavaScript脚本下是无法使用的,只能在交互的shell中使用。

.mongorc.js

如果你的主目录下有个.mongorc.js文件,那么当你启动shell时他就会自动运行。使用它可以初始化任何你经常使用的helper方法和你不想意外操作的删除方法.

比如,你不想使用默认的dropDatabase()方法了,你可以在.mongorc.js文件中添加下面的命令:

DB.prototype.dropDatabase = function() {
print("No dropping DBs!");
}
db.dropDatabase = DB.prototype.dropDatabase;

上面的例子改变了dropDatabase() helper方法,使他只打印出一行信息,而没有真正的删除数据库.

注意这个技巧不是一个安全手段,固执的用户仍然可以在不使用helper前提下删除数据库。然而,移除危险的admin权限命令也可以帮助阻止“大堤的奔溃”.

几个建议在.mongorc.js中使用helper命令时移除的:

1.DB.prototype.shutdownServer

2.DBCollection.prototype.drop

3.DBCollection.prototype.ensureIndex

4.DBCollection.prototype.reIndex

5.DBCollection.prototype.dropIndexes

改变提示

shell的提示可以通过一个方法设置提示变量的方式来改变:

prompt = function() {
try {
db.getLastError();
}
catch (e) {
print(e);
}
return (new Date())+"$ ";
}

如果你设置了提示,每次执行时都会重新返回提示信息(上面的例子将返回最后执行的信息)。

尝试在你的提示里面调用db.getLastError()方法,这将包含默认的提示和服务器重新连接以及返回的错误信息.

同时,把任何可能出现异常的用try/catch包裹起来,那是非常恼人的,当你的提示变成了一个异常信息!

操作诊断

查看和终止操作

你可以通过currentOp查看当前操作状态:

> db.currentOp()
{
"inprog" : [
{
"opid" : 123,
"active" : false,
"locktype" : "write",
"waitingForLock" : false,
"secs_running" : 200,
"op" : "query",
"ns" : "foo.bar",
"query" : {
}
...
},
...
]
}

使用上面的opid字段,你可以终止这个操作:

> db.killOp(123)

不是所有的操作都能被终止或者立刻终止,通常,操作不会被终止,直到他们获取到锁.

active字段表明操作当前是否在运行,如果一个操作没有运行,通常是要么没启动,要么在等待锁,要么执行了其他操作。通过numYields你可以查看操作执行的时间.

索引使用

使用explain()来查看当前查询操作使用了哪个索引.

> db.foo.find(criteria).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 2,
"nscannedObjects" : 2,
"nscanned" : 2,
"nscannedObjectsAllPlans" : 2,
"nscannedAllPlans" : 2,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {

},
"server" : "ubuntu:27017"
}

explain()输出中有几个重要的字段:

1.n: 返回记录行数.

2.nscanned: 使用索引读取的记录数量.

3.nscannedObjects: 被扫描的文档数量.

4.indexOnly: 如果查询没有使用集合本身.

5.nYields: 查询读取锁的释放时间和等待下次操作时间.

6.indexBounds: 当使用索引时,显示的索引扫描范围.

游标类型

一个遍历游标(BasicCursor)意味着没有使用索引;一个B树游标(BtreeCursor)意味着使用了一个常用的索引;平行游标被用于分片;二维空间索引(geospatial indexes)使用他们自己特殊的游标。

一旦一个数组被索引,那么索引上就会设定一个“multikey”标记,这就是对上面isMultiKey字段的解释。这个标记在索引生命周期内一直保存,除非你去掉了数组的索引。

如果应用索引做查询的话,explain输出的信息里将包含索引范围字段,它描述了索引遍历到的那部分记录。比如,如果你知道你的文档里面有个age字段,并且年龄在0-120之间均匀分布,索引范围从3-5,你可以看到索引只需扫描一小部分数据就能满足你的查询需要。

暗示(Hinting)

使用hint()能让查询强制使用一个特殊的索引:

> db.foo.find().hint({x:1})

这个暗示必须和你想使用的的索引key相匹配,你可以通过运行下面命令查看可用的索引:

> db.foo.getIndexes()

一般来说,你可以创建一个索引用于查询。如果你有一个查询和排序,建索引最合适的字段取决于你的查询。如果查询一个单一的值(如:{x:y}),索引应该这样建{queryField: 1, sortField: 1}。如果查询的是一个范围或者集合,采用这样的方式建索引可能更高效:{sortField: 1, queryField: 1}。如果你是用这个索引,MongoDB必须扫描所有的索引查找结果集,但是它可以在不使用内存排序的情况下返回有序的结果。

系统性能分析

你可以打开系统分析,看看数据库的操作信息。虽然性能上会有损失,但可以帮助我们避免慢查询。

> db.setProfilingLevel(2) // profile all operations
> db.setProfilingLevel(1) // profile operations that take longer
than 100ms
> db.setProfilingLevel(1, 500) // profile operations that take
longer than 500ms
> db.setProfilingLevel(0) // turn off profiling
> db.getProfilingLevel(1) // see current profiling setting

性能条目保存在开启性能分析的数据库中名为 system.profile 的集合。可以针对单个数据库开启和关闭性能分析。

副本集

要找到延迟的复制,连接到一个备节点并运行这个函数:

> db.printReplicationStatus()
configured oplog size: 2000MB
log length start to end: 23091secs (6.4hrs)
oplog first event time: Fri Aug 10 2012 04:33:03 GMT+0200 (CEST)
oplog last event time: Mon Aug 20 2012 10:56:51 GMT+0200 (CEST)
now: Mon Aug 20 2012 10:56:51 GMT+0200 (CEST)

要查看某个成员对集合的性能状况,连接到这个成员,并运行:

> rs.status()

此命令会告诉你其他成员之于它的状态和地位。

在一个备节点上运行 rs.status() 将告诉你备节点是从 syncingTo字段中哪个中同步数据的。

分片

要查看群集的元数据(分片,数据库,文件,数据等),请运行下面的函数:

> db.printShardingStatus()
> db.printShardingStatus(true) // show all chunks

您也可以连接到 Mongos ,使用“use config”查看分片,数据库,集合,或块的数据,然后查询相关的集合。

> use config
switched to db config
> show collections
chunks
databases
lockpings
locks
mongos
settings
shards
system.indexes
version

永远都连接到 mongos 获取分片信息。永远不要直接连接配置服务器。永远不要直接写入配置服务器。。永远使用分片命令和帮助。

在维护之后,有时实际上没有实施维护的 mongos 进程的配置版本号将不会更新。无论是回弹服务还是运行 flushRouterConfig 命令都能快速解决问题。

> use admin
> db.runCommand({flushRouterConfig:1})

通常这个问题将表现为 setShardVersion 失败的错误。

无需担心日志中的 setShardVersion 错误,但它们不应该出现在您的应用程序中(除非 mongos 无法连接到任何配置服务器,否则你不应该得到错误)。D

要添加新的分片,运行:

> db.addShard("rsName/seed1,seed2,seed3")

要在数据库上运用分片,运行:

> db.adminCommand({enableSharding: true})

要在集合上运用分片,运行:

> db.adminCommand({shardCollection: "dbName.collName",
unique: true, key: {fieldName: 1}})

既不应该已经存在 dbName.collName,也不应该已经索引fieldName(分片关键字)。如果你在使用唯一分片关键字,它必须是唯一索引的。

在集群中,如果你不是在 _id 上分片,_id 无需唯一。不管怎样,它们都在独立的分片上(就是说,你可以在 shard1 上有一个_id:123,在 shard2 生也有一个_id:123,但它们不能同时存在于 shard1中)。文件往往在分片间移动,如果是自己生成的_id,你需要确保你的_id唯一。如果你用的是Object_Id 就不会出问题。

要关闭均衡器,通过的 mongos 更新 config.settings 集合:

> sh.setBalancerState(false)

要恢复,则使用同样的命令,传递一个 True。

Mongo监控服务 (MMS)

MMS 是一种免费的、易操作的监控 MongoDB 的方式。要使用它,先在 http://mms.10gen.com. 创建一个账号。

查看 http://mms.10gen.com/help 以获得更多的文档。

   
1231 次浏览       13
相关文章

基于EA的数据库建模
数据流建模(EA指南)
“数据湖”:概念、特征、架构与案例
在线商城数据库系统设计 思路+效果
 
相关文档

Greenplum数据库基础培训
MySQL5.1性能优化方案
某电商数据中台架构实践
MySQL高扩展架构设计
相关课程

数据治理、数据架构及数据标准
MongoDB实战课程
并发、大容量、高性能数据库设计与优化
PostgreSQL数据库实战培训
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]

MySQL索引背后的数据结构
MySQL性能调优与架构设计
SQL Server数据库备份与恢复
让数据库飞起来 10大DB2优化
oracle的临时表空间写满磁盘
数据库的跨平台设计
更多...   


并发、大容量、高性能数据库
高级数据库架构设计师
Hadoop原理与实践
Oracle 数据仓库
数据仓库和数据挖掘
Oracle数据库开发与管理


GE 区块链技术与实现培训
航天科工某子公司 Nodejs高级应用开发
中盛益华 卓越管理者必须具备的五项能力
某信息技术公司 Python培训
某博彩IT系统厂商 易用性测试与评估
中国邮储银行 测试成熟度模型集成(TMMI)
中物院 产品经理与产品管理
更多...