支持海量数据的 MongoDB NoSQL
关于这个速查卡MongoDB是一个文档型数据库,它可以方便的应用于大多数语言。这个小清单列出了MongoDB经常使用和容易忘记的一些操作,命令和技术。 配置选项安装选项启动MongoDB的选项可以通过命令行或者配置文件设置,两者的语法稍微有点不同,这里有一个三种选项的设置例子:
在mongod下运行--help可以列出所有的操作选项,但是这里我们列出了一些最常用的:
如果想安全的启动mongod,就要使用nohttpinterface和bind_ip操作选项,确定外网不能直接访问。尤其确保你没有其余的选项启动,MongoDB需要以下网络环境可以访问:
所有的连接都是通过tcp建立的. |
缪斯的情人
|
||||||||||||||||||||||||||||||
其它翻译版本(2) |
查看配置如果你6个月前启动mongod时做了一堆配置,那么现在你如何知道做了什么配置呢?这里提供了一个shell小助手: > db.serverCmdLineOpts() { "argv" : [ "./mongod", "--port", "30000" ], "parsed" : { }, "ok" : 1 } 解析后的字段是从配置文件读取的一些参数列表. 使用shellShell帮助当你忘记一个命令时,mongodb提供了许多功能帮助你: > // basic help > helpdb.help() help on db methodsdb.mycoll.help() help on collection methodssh.help() sharding helpersrs.help() replica set helpershelp admin administrative helphelp 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命令时移除的:
|
缪斯的情人
|
改变提示shell的提示可以通过一个方法设置提示变量的方式来改变: prompt = function() {try {db.getLastError();}catch (e) {print(e);}return (new Date())+"$ "; } 如果你设置了提示,每次执行时都会重新返回提示信息(上面的例子将返回最后执行的信息)。 同时,把任何可能出现异常的用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()输出中有几个重要的字段:
|
缪斯的情人
|
游标类型 一旦一个数组被索引,那么索引上就会设定一个“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 的集合。可以针对单个数据库开启和关闭性能分析。 |
Khiyuan
|
副本集要找到延迟的复制,连接到一个备节点并运行这个函数: > 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字段中哪个中同步数据的。 |
Khiyuan
|
分片要查看群集的元数据(分片,数据库,文件,数据等),请运行下面的函数: > 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 获取分片信息。永远不要直接连接配置服务器。永远不要直接写入配置服务器。。永远使用分片命令和帮助。 > use admin > db.runCommand({flushRouterConfig:1}) 通常这个问题将表现为 setShardVersion 失败的错误。 > db.addShard("rsName/seed1,seed2,seed3") 要在数据库上运用分片,运行: > db.adminCommand({enableSharding: true}) 要在集合上运用分片,运行: > db.adminCommand({shardCollection: "dbName.collName", unique: true, key: {fieldName: 1}}) 既不应该已经存在 dbName.collName,也不应该已经索引fieldName(分片关键字)。如果你在使用唯一分片关键字,它必须是唯一索引的。 |
Khiyuan
|
在集群中,如果你不是在 _id 上分片,_id 无需唯一。不管怎样,它们都在独立的分片上(就是说,你可以在 shard1 上有一个_id:123,在 shard2 生也有一个_id:123,但它们不能同时存在于 shard1中)。文件往往在分片间移动,如果是自己生成的_id,你需要确保你的_id唯一。如果你用的是Object_Id 就不会出问题。 > sh.setBalancerState(false) 要恢复,则使用同样的命令,传递一个 True。 |
Khiyuan
|
Mongo监控服务 (MMS)MMS 是一种免费的、易操作的监控 MongoDB 的方式。要使用它,先在 http://mms.10gen.com. 创建一个账号。 查看 http://mms.10gen.com/help 以获得更多的文档。 简单规则数据库数据库的名称不能包含 ".","$","\0"(空字符)。名称只能包含在你的文件系统中可以用做文件名的字符。Admin,config,local是数据库的保留名(你可以在其中保存数据,单永远不要删除它们)。 另一个强大的选项是 post-commit 钩子。钩子将在提交到库时被触发。这是比周期构建或 Poll SCM 选项更高效的方法。 |
Khiyuan
|
集合集合名不能含有 "$" 或 "\0"。前缀为 "system." 的名字为 MongoDB 的保留集合,不能删除(哪怕是你创建的)。“点”经常被用于集合名称的组织,但它们没有语义。名为“che.se”的集合跟名为“che”的集合以及名为“cheese”的集合没有任何关联。 字段名字段名不能含有 "." 或 "\0"。当字段为数据库引用时,它应当只含有"$"。 索引选项
查询格式查询语句通常为一下格式: {key : {$op : value}} 例如: {age : {$gte : 18}} 有三个例外的规则: $and, $or, 和 $nor,此三者优先级最高: {$or : [{age: {$gte : 18}}, {age : {$lt : 18}, parentalConsent:true}}]} 更新格式更新语句总是如下格式: {key : {$mod : value}} 例如: {age : {$inc : 1}} |
Khiyuan
|
查询操作符
*参见 http://www.mongodb.org/display/DOCS/Advanced+Queries 获取全部类型。 更新修饰符
聚合管道操作符聚合框架可以用来做任何事情,从简单的查询语句到复杂的聚合查询。 使用聚合框架,将聚合操作符通过管道传递给 aggregate() 函数: > db.collection.aggregate({$match:{x:1}}, ... {$limit:10}, ... {$group:{_id : "$age"}}) 下面是可用操作符的列表:
要引用一个字段,使用 $fieldName 语句。例如,下面的映射将返回一个重新命名为“time since epoch ” 的原存在的“$time”字段: {$project: {"time since epoch": "$time"}} $project 和 $group 不能同时表达,你可以用 $fieldName 语句,如下:
|
Khiyuan
|
备份当状态一致时(备份时没有发生读写操作),最好的备份方式就是把数据库文件拷贝一份。
恢复备份的方法是拷贝文件到正确的服务器路径下,重启。 如果你有一个文件系统来做文件系统快照,你的日志在同样的卷标下,并且做了RAID共享存储,你可以使用一个无锁的快照做处理。既然这样,当你重启时,日志就能同步来保持始终一致性。 在特殊情况下可以使用Mongodump做备份。如果你决定使用它,首先不要使用fsync+lock。 |
缪斯的情人
|
其它翻译版本(1) |
副本集维护活跃节点成员的保持停止一个活跃节点的方法是把他的优先级调为0: > var config = rs.config() > config.members[2].priority = 0 > rs.reconfig(config) 阻止从节点成为临时活跃节点的方法是连接到它发送一条冻结命令: > rs.freeze(10*60) // # of seconds to not become primary 如果你不想永久的改变优先级只是暂时做维护工作,这个方法是非常方便的. 成员的降级如果一个成员当前是活跃节点,你可以通过下面的方式对它降级: > rs.stepDown(10*60) // # of seconds to not try to become primary again |
缪斯的情人
|
以独立服务器的方式启动一个成员
为了维护,你通常需要启动一个从节点并且确保它可写(比如,建索引),为了达到这个目的你需要把从节点作为一个临时独立的mongod.
如果从节点初始启动使用下面的参数:
$ mongod --dbpath /data/db --replSet setName --port 30000
关闭清除后使用下面配置重启:
$ mongod --dbpath /data/db --port 30001
注意dbpath没有改变,但是端口改变了,replSet设置也被移除了。这个mongod将作为一个单独的服务启动,其余的副本集将通过30000端口查找成员,而不是30001,因此看起来他只是把其余的副本集降级了.
当你维护完成了,使用初始的参数设置并重启就ok了.
更多资源
- MongoDB 下载http://www.mongodb.org/downloads
- 文档 http://docs.mongodb.org
- 里程碑、修改的问题、添加功能http://jira.mongodb.org
- 问题: http://groups.google.com/group/mongodb-user
- IRC chat聊天,能及时得到问题答案:irc.freenode.net/#mongodb
转载于:https://www.cnblogs.com/shihao/archive/2013/01/25/2876727.html
支持海量数据的 MongoDB NoSQL相关推荐
- 自动匹配未认领订单编号_海量订单系统微服务开发:使用MongoDB支持海量数据...
海量订单系统微服务开发 订单系统是电商平台中一个非常重要的组成部分,而且它还是一个具有巨大流量和高并发访问的系统,与订单相关的服务涉及库存.支付.物流等.在设计订单系统时,我们选择使用支持海量数据的N ...
- SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.
SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis. 特性 替代 Redis 数据库, Redis 的 100 倍容量 LevelDB 网络支持, 使用 C/C++ ...
- PACS/RIS系统源码 支持专业三维影像后处理功能,支持海量数据存储、迁移管理
PACS系统源码 支持专业三维影像后处理功能,系统有演示和自主知识产权. 私信了解更多内容! 系统主要功能: (一)影像处理 1.数据接收功能:接收.获取影像设备的DICOM3.0和非DICOM3.0 ...
- 学习笔记——mongodb nosql数据库
CAP原则1 CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不 ...
- java 连nosql_浅谈 Java 中 MongoDB NoSQL数据库使用指南
MongoDB是当今非常流行的一款NoSQL数据库,本文介绍如何使用MongoDB的Java驱动来操作MongoDB. 一.引入MongoDB Java Driver包 如果需要操作MongoDB的J ...
- MongoDB(NoSQL)数据库入门及基本操作
文章目录 一.NoSQL 简介 1.1 NoSQL的优点 1.2 NoSQL的缺点 1.3 NoSQL的分类 二.MongoDB 2.0 demo示例 2.1 install and connect ...
- 获取mongodb数据变更_支持mysql、MongoDB数据变更订阅/监听分发
1 概述 mysql.MongoDB数据变动监听分发 本项目意在简化监听mysql.MongoDB数据库的不同表的各种数据变动 项目依赖redis,mysql 使用场景:刷新缓存.异构系统... 2 ...
- 海量数据拆分到nosql系统的一种方案
获取某用户的好友最新动态. 我们大体上来说先按照用户ID将用户的好友一致性哈希到几个mongodb集群,然后把用户的最新信息也存储到mongodb中.然后利用消息系统保持数据库中的数据和mongdb中 ...
- hbase查看表结构_HBase
HBase 是一种分布式.可扩展.支持海量数据存储的NoSQL 数据库. 逻辑结构 物理存储结构 数据模型 逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列.HBase的 ...
最新文章
- C#枚举系统安装的所有打印机
- 消息服务发送短信,手机接收不到短信解决思路
- 学习结构[记录]类型(8) - 结构嵌套
- AtomicInteger源码注释
- camel_Apache Camel 2.14中的更多指标
- 虚拟机磁盘扩容parted
- mysql 碎片率_计算MySQL表碎片的SQL整理
- web前端黑客技术揭秘 读书笔记
- 春节假期前5天全国快递处理量达3.65亿件 同比增长224%
- android 横屏直播界面,Android安卓腾讯云互动直播随心播横屏的实现方式1.8.2
- 浅谈移动Web开发(上):深入概念
- 为什么说堡垒机是企业IT运维的“安全终结者”?
- 一道不知道哪里来的容斥题
- 随笔-546 评论-829 文章-21 读书笔记2013第11本:《别逗了,费曼先生》
- 怎么在Vue中使用和安装axios
- React-native学习-59:使用react-native-vector-icons图标库
- 360无线路由器dns服务器,路由器的首选dns服务器怎么填
- Android程序报错:Anroid 6.0 权限问题java.io.FileNotFoundException: ……:open failed: EACCES (Permission denied)
- Android7.1.1 remap鼠标右键为返回键
- Lucky!终于能够入职江苏‘’三新‘’供服公司了,快收下这份入职攻略吧!
热门文章
- yarn界面中的Minimum Allocation和Maximum Allocation与yarn-site.xml中参数的对应关系
- HDFS/zookeeper/hbase初始化
- LogisticRegression针对中文文本分类
- concat函数_三、P57-61 MySQL中常用函数
- extjs入门(06) 按钮占两行
- php文本数据库 搜索,一个文本数据库的搜索方法_php
- oracle 一次删除多张表
- 阿里P7架构师谈职业生涯规划,给遇到瓶颈,迷茫期的人群一些建议
- Linux 给用户添加sudo权限
- Java网络编程从入门到精通(21):HTTP消息的格式