公司出于成本上的考虑,打算把历史数据从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你懂得