MongoDB调研笔记

本文是一篇关于MongoDB的调研笔记,讨论了MongoDB的部署启动、主从备份、冷备份、开发工具、性能监控及其优缺点。MongoDB作为分布式文档型数据库,适用于web2.0项目,但与Oracle相比在性能上存在差距。文中提到了MongoDB在冷备份中使用dump和restore工具,以及监控性能的方法,如通过profile进行优化。MongoDB的优点包括高可配置性和插入查询性能,但缺点在于数据膨胀、读写调度控制不足以及不支持多表联合查询和事务。
摘要由CSDN通过智能技术生成

       公司出于成本上的考虑,打算把历史数据从Oracle移植到一个开源数据库上,正好被分到了MongoDB的调研任务,既然写完了调研报告,这里也自己留一份简单的总结备查吧。

       笔记而已,写的有点乱。

       MongoDB是一个分布式文档型数据库,目前多大多用于web2.0项目上,可能不太适合我们目前的项目,大多用来辅助关系型数据库进行存储,当然也有单独使用的情况,号称在海量数据的处理上表现优异。但是实际测试表现并不理想,远没有达到Oracle的水平,性能接近MySQL。但是其注重可扩展性,关注点不同,各有各的优势。

       MongoDB最著名的应用的宕机的例子就是4square的由于自动分片问题导致11小时宕机无法处理,直到10gen支持才解决。

       部署和启动

        MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

        部署较容易,在MongoDB官网下载对应操作系统的可用版本,mongod.exe –dbpath=/opt/MongDB/data指定数据库数据目录,完成启动。浏览器输入http://localhost:27017/ 会出现端口设置的提示。

       主从备份

             有两种模式,主从模式和互为主从。两种模式都不一定需要两台机器,可以在同一台机器上部署2个数据库为主从。但是不建议这么做,因为这样容灾考虑上不好。

        主从模式命令:master机 mongod --dbpath ./data/mongodb1 --master --logpath ./data/mongdb1.log --logappened

                                 slave机    mongod --dbpath ./data/mongodb2 --source 127.0.0.1:27017 --autoresync --slavedelay 30 --logpath ./data/mongodb2.log --port 27018 --logappend

         --autoresync可使从节点在不同步情况发生10秒钟之后,自动重启复制操作。如果指定了--autoresync参数,从节点在10分钟以内自动重新同步数据的操作只会执行一次。

        互为主从模式,就在master机和slave机的命令上都加入 --master --slave,可以根据机器负载自动切换主从。

        冷备份

       数据冷备份可以通过MongoDB提供的 dump和restore工具来完成。

       命令语法:

       >mongodump -h dbhost -d dbname -o dbdirectory

       -h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017

       -d:需要备份的数据库实例,例如:test

       -o:备份的数据存放位置,例如:/data/dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。

       >mongorestore -h dbhost -d dbname --directoryperdb dbdirectory

       -h:MongoDB所在服务器地址

       -d:需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2

       --directoryperdb:备份数据所在位置,例如:/data/dump/test。

--drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除。

             分布式的测试没做。

        开发辅助工具

        自带工具:和Oracle一样,MongoDB也自带了一些辅助开发工具:mongo.exe,mongoexport.exe,mongoimport.exe,mongodump.exe,mongorestore.exe。其中mongo.exe对应Oracle的sqlPlus,mongoexport.exe和mongoimport.exe是数据导入导出工具,mongodump.exe和mongorestore.exe是数据库备份恢复工具。这些工具都是黑屏工具。

       现在还有一些第三方开发的MongoDB的开发辅助工具,这里个人推荐一个国人自己写的基于php的开发工具——rockmongo,可以在code.google上下载,MongoDB官网也有链接,界面类似于pl/sql develop。

       性能监控

            mongodb可以通过profile来监控数据,进行优化。查看当前是否开启profile功能用命令:

       db.getProfilingLevel()  返回level等级,值为0|1|2,分别代表意思:0代表关闭,1代表记录慢命令,2代表全部。

       开始profile功能为:

       db.setProfilingLevel(level);  #level等级,值同上。level为1的时候,慢命令默认值为100ms,更改为db.setProfilingLevel(level,slowms)如db.setProfilingLevel(1,50)这样就更改为50毫秒。

       通过db.system.profile.find() 查看当前的监控日志,参数分析:

      

       如果发现时间比较长,那么就需要作优化。比如nscanned数很大,或者接近记录总数,那么可能没有用到索引查询。reslen很大,有可能返回没必要的字段。nreturned很大,那么有可能查询的时候没有加限制。

这里值的含义是:

        ts:命令执行时间

        info:命令的内容

               query:代表查询

               order.order: 代表查询的库与集合

               reslen:返回的结果集大小,byte数

               nscanned:扫描记录数量

               nquery:后面是查询条件

               nreturned:返回记录数及用时

               millis:所花时间

        通过db.serverStatus()查看mongod的运行状态:

> db.serverStatus()

{

"host" : "baobao-laptop",#主机名

"version" : "1.8.2",#版本号

"process" : "mongod",#进程名

"uptime" : 15549,#运行时间

"uptimeEstimate" : 15351,

"localTime" : ISODate("2011-07-23T06:07:31.220Z"),当前时间

"globalLock" : {

"totalTime" : 15548525410,#总运行时间(ns)

"lockTime" : 89206633, #总的锁时间(ns)

"ratio" : 0.005737305027178137,#锁比值

"currentQueue" : {

"total" : 0,#当前需要执行的队列

"readers" : 0,#读队列

"writers" : 0#写队列

},

"activeClients" : {

"total" : 0,#当前客户端执行的链接数

"readers" : 0,#读链接数

"writers" : 0#写链接数

}

},

"mem" : {#内存情况

"bits" : 32,#32位系统

"resident" : 337,#占有物理内存数

"virtual" : 599,#占有虚拟内存

"supported" : true,#是否支持扩展内存

"mapped" : 512

},

"connections" : {

"current" : 2,#当前链接数

"available" : 817#可用链接数

},

"extra_info" : {

"note" : "fields vary by platform",

"heap_usage_bytes" : 159008,#堆使用情况字节

"page_faults" : 907 #页面故作

},

"indexCounters" : {

"btree" : {

"accesses" : 59963, #索引被访问数

"hits" : 59963, #所以命中数

"misses" : 0,#索引偏差数

"resets" : 0,#复位数

"missRatio" : 0#未命中率

}

},

"backgroundFlushing" : {

"flushes" : 259, #刷新次数

"total_ms" : 3395, #刷新总花费时长

"average_ms" : 13.108108108108109, #平均时长

"last_ms" : 1, #最后一次时长

"last_finished" : ISODate("2011-07-23T06:07:22.725Z")#最后刷新时间

},

"cursors" : {

"totalOpen" : 0,#打开游标数

"clientCursors_size" : 0,#客户端游标大小

"timedOut" : 16#超时时间

},

"network" : {

"bytesIn" : 285676177,#输入数据(byte)

"bytesOut" : 286564,#输出数据(byte)

"numRequests" : 2012348#请求数

},

"opcounters" : {

"insert" : 2010000, #插入操作数

"query" : 51,#查询操作数

"update" : 5,#更新操作数

"delete" : 0,#删除操作数

"getmore" : 0,#获取更多的操作数

"command" : 148#其他命令操作数

},

"asserts" : {#各个断言的数量

"regular" : 0,

"warning" : 0,

"msg" : 0,

"user" : 2131,

"rollovers" : 0

},

"writeBacksQueued" : false,

"ok" : 1

}

       优缺点

       优点:

       拥有较高的可配置型,可以最大程度的降低运维人员的压力。容易使用和理解的api.不低的插入和查询性能,同样降低开发人员的压力。document模型的数据存储,并通过一些内部设计来避免表之间的join,可提供一个简单方便的容易扩展的架构。而且确保无人误用导致数据不可切分。MongoDB适合给人手不足的中小型团队提供的一个处理海量数据的,高并发高可用性的数据化持久工具。开源免费,压榨机器性能。

        缺点:

        首先,由于schema free和BSON 的引入使得数据膨胀明显,一般膨胀5~10倍非常容易,因为每一个doc都会完整存储所有的键和值,即使结构一样的doc,所以存储文件会急剧增大,如果使用32位操作系统很容易达到单个文件体积上限。所以对于MongoDB必须使用64位操作系统。第二,mmap(2)的使用使得读写调度控制以及cache控制不够细,倒是方便了程序员写程序的难度。但在数据量极大的超过内存的时候,仅凭OS的交换策略不能满足实际需要,这个时候性能抖动剧烈。第三,不支持多表联合查询,不支持事务性操作。还有,安全性不高,需要操作系统为它分配内存,占用和消耗巨大内存(这点不同的人有不同的说法,可能是集群和开发环境造成的),读写锁粒度太粗等。

       最后是NoSQL和RDBMS系统的查询语言的对比

            

              需要注意的是,NoSQL不支持多表联合查询,只能查询单表,几乎可以达到SQL的同样水平。

 

mongodb的vs2005驱动,只能上传.jpg文件,rar你懂得

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值