(原)MongoDB在系统中的使用 - 衍悔

标签: mongodb 系统 | 发表时间:2014-11-11 18:24 | 作者:衍悔
出处:

序)Nosql并不是要取代原有的数据产品,而是为不同的应用场景提供更多的选择。

 

一)结构类型

  传统数据库的领域在于结构化文档,对于非结构化文档和半结构化文档,它能处理,但是有一定的缺陷,那么什么又是结构化文档,概括如下:

  结构化信息——这种信息可以在关系数据库中找到,多年来一直主导着IT应用。这是关键任务OLTP系统业务所依赖的信息,另外,还可对结构数据库信息进行排序和查询;

  半结构化信息——这是IT的第二次浪潮,包括电子邮件,文字处理文件以及大量保存和发布在网络上的信息。半结构化信息是以内容为基础,可以用于搜索,这也是谷歌存在的理由;

  非结构化信息——该信息在本质形式上可认为主要是位映射数据。数据必须处于一种可感知的形式中(诸如可在音频、视频和多媒体文件中被听或被看)。许多大数据都是非结构化的,其庞大规模和复杂性需要高级分析工具来创建或利用一种更易于人们感知和交互的结构。

 

二)MongoDB和行导向数据库的区别

  老实说,我觉得Nosql领域比较奇葩的东西算是Hive,不过在此不介绍它,对于项目中使用到MongoDB,也是有一定原因的,我一直以为Nosql这种东西和行导向数据库并不冲突,它仅仅是行导向数据的一个补充,对于MongoDB,它和我们用的mysql,Oracle等有什么区别,曾经我也查找过一些东西,发现网上很多相关的文章都是千篇一律,几乎一模一样,没啥价值,于是捉摸自己总结下。

  举个栗子:

uid name age
1 张三 18

 

 

  在上面的表中,很直接,数据也很直观,但是如果我们需要存储另外一个东西:头像,一般人会这样干:

uid name age photo
1 张三 18 ./upload/1.png

 

 

  尽管不同数据库都提供了直接存储二进制的数据库字段,但是我还是会选择以上的存储方式,我相信也有很多人也会这样做,这样做其实没有什么不好,但是如果我们的文件很大,几个GB,那么无论读还是写都会很耗时,成为系统的瓶颈,基于这种情况,才会诞生云计算以及Nosql这些东西,也就是说Hadoop,Hbase等诞生的原因是:

  多年来磁盘存储容量快速增加的同时,访问速度-磁盘数据读取速度却未能与时俱进,寻址时间的提高远远慢于传输速率的提高,寻址是将磁盘移动到特定磁盘位置进行读写操作,它是导致磁盘操作延迟的主要原因,而传输速率取决与磁盘的带宽。

  于是人们想出了一个办法:既然在一个服务器读取一个文件需要100个小时,那么将文件放在100个服务器,每个服务器放1%的数据,那么1小时就搞定了,这也是Hadoop的核心思想,MongoDB数据库继承了这一思想,它的区块划分,以及节点分裂,都延续了这样的思想,另一方面,MongoDB又吸取了memcached的东西,提前申请一片内存区域以及文件区域,将内存中的地址和物理地址对应起来,可以极高的提高速度,这也是MongoDB相当的消耗内存和磁盘的原因之一。

  

三)MongoDB应用范围

  1:MongoDB与传统数据库整合:

id user_id title content time
1 张三 文章标题 文章内容 时间

 

 

  在以上表中,如果内容是一个包含上千上万字的文章,一般会该字段的内容丢入MongoDB,然后在此放入MongoDB的ID。

  2:MongoDB取代传统数据库:

  在某些事物要求不高的场合,以及允许出现部分错误的系统中,可以使用MongoDB取代传统数据库,例如论坛,博客等系统,举个栗子:

  博客有人发表了一篇文章,MongoDB存储如下:

  

> db.article.insert({"title":"测试文章","content":"测试内容", "time":"17822455", "uid":"1"});
WriteResult({ "nInserted" : 1 })
> db.article.findOne();
{
"_id" : ObjectId("546168c9573c0742d8be1544"),
"title" : "测试文章",
"content" : "测试内容",
"time" : "17822455",
"uid" : "1"
}
>

  现在有一个人对这篇文章进行了评论,如下:

  

> var articleInfo = db.article.findOne({"_id":ObjectId("54616db1d92589121def0c70")});
> articleInfo;
{
"_id" : ObjectId("54616db1d92589121def0c70"),
"title" : "测试文章",
"content" : "测试内容",
"time" : "17822455",
"uid" : "1"
}
> articleInfo.commentary={"uid":"2",info :{"content":"这篇文章不错","times":"145881444"}};
{
"uid" : "2",
"info" : {
"content" : "这篇文章不错",
"times" : "145881444"
}
}
> db.article.update({"_id": ObjectId("54616db1d92589121def0c70")},articleInfo);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.article.findOne({"_id":ObjectId("54616db1d92589121def0c70")});
{
"_id" : ObjectId("54616db1d92589121def0c70"),
"title" : "测试文章",
"content" : "测试内容",
"time" : "17822455",
"uid" : "1",
"commentary" : {
"uid" : "2",
"info" : {
"content" : "这篇文章不错",
"times" : "145881444"
}
}
}
>

 

  现在又有一个人对它评论如下:

  于是MongoDB的存储结构成了这样:

  

> db.article.update({"_id":ObjectId("54617115d92589121def0c72")}, {"$push": {"commentary":{"uid":3,info :{"content":"我也这篇文章不错","times":"1444"}}}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.article.findOne({"_id":ObjectId("54617115d92589121def0c72")});
{
"_id" : ObjectId("54617115d92589121def0c72"),
"title" : "测试文章",
"content" : "测试内容",
"time" : "17822455",
"uid" : "1",
"commentary" : [
{
"uid" : 2,
"info" : {
"content" : "这篇文章不错",
"times" : "1444"
}
},
{
"uid" : 3,
"info" : {
"content" : "我也这篇文章不错",
"times" : "1444"
}
}
]
}
>

  由此可见,如果再有评论,继续往后加就OK,MongoDB对此的存储是一目了然,伸缩性很强,如果不能够在代码中实现对数据一致性的处理,那么还是使用回关系型数据库为妙,在这种事务性不太强的场合,使用MongoDB是可以取代掉关系型数据库的。

四)MongoDB使用

  由于之前使用logback处理日志,自己还得写一大堆的shell脚本,各种awk处理文本分析用户行为丢入postgres,可能自己技术不到家,但是自己能够想出的东西也就这些,于是在这个项目中毅然决定用MongoDB作为日志分析系统。如果不在分布式中,使用Nosql没有价值,码字太辛苦了。。

  

 


本文链接: (原)MongoDB在系统中的使用,转载请注明。

相关 [mongodb 系统] 推荐:

【Monogdb】MongoDB的日志系统

- - CSDN博客数据库推荐文章
记得前几天有个小伙伴要查看mongodb的日志,从而排查问题,可能总找不到日志放在何处,今天就系统说一下mongodb的日志系统. mongodb中主要有四种日志. 分别是系统日志、Journal日志、oplog主从日志、慢查询日志等. 这些 日志记录着Mongodb数据库不同方便的踪迹. 系统日志在Mongdb数据中很中重要,它记录mongodb启动和停止的操作,以及服务器在运行过程中发生的任何异常信息;配置系统日志也非常简单,在运行mongod时候增加一个参数logpath,就可以设置;.

10gen发布MongoDB监控系统MMS(附使用教程)

- gOODiDEA - NoSQLFan
MongoDB如日中天,10gen也刚刚拿到了一笔2000万美元的融资,但是10gen在全球宣传MongoDB时,发现人们经常问到这样一个问题“What should I be monitoring in production?”(我应该怎么对MongoDB进行监控呢. ),而在此之前,已经有很多非官方的开源系统提供对MongoDB的操作及监控.

(原)MongoDB在系统中的使用 - 衍悔

- - 博客园_首页
序)Nosql并不是要取代原有的数据产品,而是为不同的应用场景提供更多的选择.   传统数据库的领域在于结构化文档,对于非结构化文档和半结构化文档,它能处理,但是有一定的缺陷,那么什么又是结构化文档,概括如下:.   结构化信息——这种信息可以在关系数据库中找到,多年来一直主导着IT应用. 这是关键任务OLTP系统业务所依赖的信息,另外,还可对结构数据库信息进行排序和查询;.

[mongodb] java操作mongodb

- - 数据库 - ITeye博客
           //实例化Mongo对象,连接27017端口.                               //连接名为yourdb的数据库,假如数据库不存在的话,mongodb会自动建立. //从Mongodb中获得名为yourColleection的数据集合,如果该数据集合不存在,Mongodb会为其新建立.

【MongoDB】MongoDB之优化器Profiler

- - CSDN博客数据库推荐文章
在mysql数据库中,慢查询日志经常作为优化数据库的依据, mongodb中依然有类似的功能. Mongodb自带的profiler,可以方便地记录所有耗时的操作,以便于调优;. 一、开始profiler功能. 开启profier功能有两种:. 第一种就是直接在启动参数里面进行设置,就在茄冬mongodb时候添加-profile=级别.

夜说mongodb

- Lianhui Wang - NoSQLFan
前两天本站刚刚分享了wordnik使用MongoDB经验的文章:《Wordnik 的 MongoDB 使用经历》,今天又看到一位朋友对这方面做的总结,分享在这里,供大家参考. 赋闲以后很长没有更新博客了,说忙完全是借口,多半因为没有兴致所致. 今天凌晨比赛多多,趁着比赛的前奏和间隙,遂浏览些技术文章.

MongoDB与内存

- 高春辉 - 火丁笔记
但凡初次接触MongoDB的人,无不惊讶于它对内存的贪得无厌,至于个中缘由,我先讲讲Linux是如何管理内存的,再说说MongoDB是如何使用内存的,答案自然就清楚了. 据说带着问题学习更有效,那就先看一个MongoDB服务器的top命令结果:. 这台MongoDB服务器有没有性能问题. 先讲讲Linux是如何管理内存的.

白话MongoDB(一)

- Ease - 江边潮未尽,枫红一季秋
按照官方的说法,MongoDB是一种可扩展的高性能的开源的面向文档(document-oriented )的数据库,采用C++开发. 注意mongo不是mango(芒果),这个词是从humongous中截取出来的,其野心不言而明,直指海量数据存储. 和其他很多NoSQL不太一样,MongoDB背后有一个专门的商业公司在提供支持和推广,有点类似MySQL AB的模式.

MongoDB 索引

- - 博客园_首页
索引是用来加快查询的,数据库索引与数据的索引类似,有了索引就不需要翻遍整本书,数据库可以直接在索引中查找,. 使得查询速度很快,在索引中找到条目后,就可以直接跳转到目标文档的位置.. 要掌握如何为查询配置最佳索引会有些难度.. MongoDB索引几乎和关系型数据库的索引一样.绝大数优化关系型数据库索引的技巧同样适用于MongoDB..