mongodb小结

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

转自:http://www.wentrue.net/blog/?p=772

 

用了一阵子mongodb,作一些小结,作为将来的参考。按照以往的习惯,先作一个总览,然后再挑出一些自己比较关注的几个点,作为珠玑,加以串联阐述。

mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理。关于它的一个最简洁描述为:scalable, high-performance, open source, schema-free, document-oriented database。我对于文档型数据库有一些个人的偏好,这种偏好是从半年前研究couchdb而来的,因为我觉得用它来描述一个具有个性化特征的实体对象正合适,比如网站上的用户或商品书籍之类的条目。

一些概念:

跟mysqld一样,一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection可以存放多个文档(document),每个文档都以BSON(binary json)的形式存放于硬盘中。跟关系型数据库不一样的地方是,它是的以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。跟一般的key-value数据库不一样的是,它的value中存储了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。可以说是兼备了key-value数据库的方便高效与关系型数据库的强大功能。

索引

跟关系型数据库类似,mongodb可以对某个字段建立索引,可以建立组合索引、唯一索引,也可以删除索引。当然建立索引就意味着增加空间开销,我的建议是,如果你能把一个文档作为一个对象的来考虑,在线上应用中,你通常只要对对象ID建立一个索引即可,根据ID取出对象某些数据放在memcache即可。如果是后台的分析需要,响应要求不高,查询非索引的字段即便直接扫表也费不了太多时间。如果还受不了,就再建一个索引得了。

默认情况下每个表都会有一个唯一索引:_id,如果插入数据时没有指定_id,服务会自动生成一个_id,为了充分利用已有索引,减少空间开销,最好是自己指定一个unique的key为_id,通常用对象的ID比较合适,比如商品的ID。

capped collection

capped collection是一种特殊的表,它的建表命令为:

db.createCollection("mycoll", {capped:true, size:100000})

允许在建表之初就指定一定的空间大小,接下来的插入操作会不断地按顺序APPEND数据在这个预分配好空间的文件中,如果已经超出空间大小,则回到文件头覆盖原来的数据继续插入。这种结构保证了插入和查询的高效性,它不允许删除单个记录,更新的也有限制:不能超过原有记录的大小。这种表效率很高,它适用于一些暂时保存数据的场合,比如网站中登录用户的session信息,又比如一些程序的监控日志,都是属于过了一定的时间就可以被覆盖的数据。

复制与分片

mongodb的复制架构跟mysql也很类似,除了包括master-slave构型和master-master构型之外,还有一个Replica pairs构型,这种构型在平常可以像master-slave那样工作,一但master出现问题,应用会自动了连接slave。要做复制也很简单,我自己使用过master-slave构型,只要在某一个服务启动时加上–master参数,而另一个服务加上–slave与–source参数,即可实现同步。

分片是个很头疼的问题,数据量大了肯定要分片,mysql下的分片正是成为无数DBA的噩梦。在mongodb下,文档数据库类似key-value数据库那样的易分布特性就显现出来了,无论构造分片服务,新增节点还是删除节点都非常容易实现。但mongodb在这方面做还不足够成熟,现在分片的工作还只做到alpha2版本(mongodb v1.1),估计还有很多问题要解决,所以只能期待,就不多说了。

性能

在我的使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。mysql实际无法胜任大数据量下任意字段的查询,而mongodb的查询性能实在让我惊讶。写入性能同样很令人满意,同样写入百万级别的数据,mongodb比我以前试用过的couchdb要快得多,基本10分钟以下可以解决。补上一句,观察过程中mongodb都远算不上是CPU杀手。

GridFS

gridfs是mongodb一个很有趣的类似文件系统的东西,它可以用一大块文件空间来存放大量的小文件,这个对于存储web2.0网站中常见的大量小文件(如大量的用户头像)特别有效。使用起来也很方便,基本上跟一般的文件系统类似。

用合适的数据库做适合的事情

mongodb的文档里提到的user case包括实时分析、logging、全文搜索,国内也有人使用mongodb来存储分析网站日志,但我认为mongodb用来处理有一定规模的网站日志其实并不合适,最主要的就是它占空间过于虚高,原来1G的日志数据它可以存成几个G,如此下去,一个硬盘也存不了几天的日志。另一方面,数据量大了肯定要考虑sharding,而mongodb的sharding到现在为止仍不太成熟。由于日志的不可更新性的,往往只需APPEND即可,又因为对日志的操作往往只集中于一两列,所以最合适作为日志分析的还是列存储型的数据库,特别是像infobright那样的为数据仓库而设计的列存储数据库。

由于mongodb不支持事务操作,所以事务要求严格的系统(如果银行系统)肯定不能用它。

mongodb占用空间过大的原因,在官方的FAQ中,提到有如下几个方面:

1、空间的预分配:为避免形成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,而且申请的量从64M、128M、256M那样的指数递增,直到2G为单个文件的最大体积。随着数据量的增加,你可以在其数据目录里看到这些整块生成容量不断递增的文件。

2、字段名所占用的空间:为了保持每个记录内的结构信息用于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果value域相对于key域并不大,比如存放数值型的数据,则数据的overhead是最大的。一种减少空间占用的方法是把字段名尽量取短一些,这样占用空间就小了,但这就要求在易读性与空间占用上作为权衡了。我曾建议作者把字段名作个index,每个字段名用一个字节表示,这样就不用担心字段名取多长了。但作者的担忧也不无道理,这种索引方式需要每次查询得到结果后把索引值跟原值作一个替换,再发送到客户端,这个替换也是挺耗费时间的。现在的实现算是拿空间来换取时间吧。

3、删除记录不释放空间:这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。

4、可以定期运行db.repairDatabase()来整理记录,但这个过程会比较缓慢。

因为官方文档中对各方面的内容已经有很详细的叙述,所以我并没有再过多的引用原文与代码,只是结合自己的使用归纳一些心得,有兴趣的朋友不妨直接去翻文档中自己感兴趣的问题,超群的博客上有一个很好的入门介绍。

最后总结一句,文档型数据库有点像波粒二象性,总能在适当的时候表现出它作为关系型数据库或key-value数据库的优势来。

实战案例:

昨天我访问mongodb的python程序开始出错,经常抛出AssertionError异常,经查证只是master查询异常,slave正常,可判断为master的数据出了问题。

修复过程:

1、在master做db.repairDatabase(),不起作用;

2、停止slave的同步;

3、对slave作mongodump,备份数据;

4、对master作mongostore,把备份数据恢复,使用–drop参数可以先把原表删除。

5、恢复slave的同步。

MongoDB升级小结 背景最近业务mongo升级,因为需要调整业务代码和线下测试,工作持续了一个月才有了阶段性的成果。 业务代码主要是Python,在升级之前,我们已更新到了合适版本的pymongo,并在线下做了测试。 为了从2.4升级到3.0,需要先从2.4升级到2.6,然后再从2.6升级到3.0。 mongo没有用yum安装,直接拷贝的mongo的bin文件,在机器上运行mongd启动。 阅读详情

相关推荐

MongoDB实战宝典:从入门到精通,一篇文章让你掌握所有要点!

MongoDB是一个开源的、高性能的、面向文档的NoSQL数据库。它由C++语言编写,旨在为快速开发大型分布式应用程序提供支持。MongoDB以其灵活性和强大的数据处理能力而闻名,在众多现代应用程序中扮演着重要角色。MongoDB的配置文件通常是,这个文件包含了数据库实例的配置设置。默认情况下,MongoDB在启动时会查找当前目录下的文件。如果需要指定不同的配置文件,可以在启动mongod时使用--config选项。配置文件采用YAML格式,由多个节组成,每个节包含了相关的配置项。

邓邓子的博客 1525

mongodb实践总结

mongdodb实践总结(中文版),一份工作中常遇到mongodb问题的总结文档

mongoDB总结大全

mongodb知识点总结, 涉及到mongodb的简单介绍 mongodb相关概念介绍 mongodb的安装(linux) mongodb的启动和连接 mongodb数据库和集合的操作,文档的增删改查相关操作 mongodb索引的建立和删除 mongodb的备份和恢复 mongodb的php扩展的安装 mongodb角色认证和页面访问 参考文件 官网:www.mongodb.org 中文社区:http://www.mongoing.com/ 菜鸟教程和某课网 https://my.oschina.net/WYU3CHEN/blog/1486475 https://my.oschina.net/WYU3CHEN/blog/1492853

MongoDB详解,用心看这篇就够了【重点】

1.1 MongoDB概述 MongoDB是一个基于分布式文件存储数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 Mo

ᶻᶻᶻ 枕星河的博客 9万+

实验四 第五章 MongoDB分片

经过了本次实验,对MongoDB副本集的认识更深入了,对分片的知识也有更详细的掌握,认识了分片策略,熟悉了分配集群的架构,并能进行分片集群的部署。和创建第一个节点的方式相同,开启服务后不需要再添加分配,会由配置服务自动同步。但是配置集中不需要添加仲裁节点,将两个节点以从节点的方式加入即可。分片的安全认证与副本集的安全认证基本一致,详细操作在实验报告三。是mongos的服务,不是mongod的服务。第一个副本集的副本节点。第一个副本集的仲裁节点。第二个副本集的副本节点。第二个副本集的仲裁节点。

m0_52014276的博客 1119

Mongodb简介

简介

weixin_44819949的博客 454

MongoDB精华总结

MongoDB是属于文档型的NoSQL数据库,也就是文档数据库文档数据库区别于传统的其它数据库,它是用来管理文档。在传统的数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的基本单位, 一个文档相当于关系数据库中的一条记录。总体的数据结构与关系型数据库对比表格:其中document是bson格式的,例子: 其数据结构类型表格(参照官网的):存储引擎是数据库的组成部分,负责管理数据在内存和磁盘中的存储方式。 MongoDB支持多个存储引擎,因为不同的引擎对于特定的工作负载表现更好。3.

Admans的专栏 2056

MongoDB学习小结

(本文来源于我的工作笔记,是刚接触Mongo时整理的) 1,mongodb是面向文档类型的层次型数据库,documents -> collections -> databases -> mongodb; 2,在需要存储大数据量的情况下使用; 3,操作的语言是js,里面的对象是js生成的,例如mongo,collection,而里面的操作例如:find,sort,insert,update

Vince的修炼之路 1035

mongoDB小结

mongoDB小结 好长时间没有动手写博客了,坚持力还要再修炼修炼才是,哈哈就不发一堆感慨了,进入正题。 首先介绍一个非常非常好用的客户端,长得像一个绿色的火箭的东西Robo 3T.工具,做增删改查都很方便。 mongo安装 网上有很多mongo安装的教程,小编在这里就不一一介绍了,主要分为几个步骤: 1.下载mongo文件,直接从官网下载即可 2.上传文件到服务器,解压文件 ta...

董盛姣 474

MongoDB使用小结:一些常用操作分享

本文整理了一年多以来我常用的MongoDB操作,涉及mongo-shell、pymongo,既有运维层面也有应用层面,内容有浅有深,这也就是我从零到熟练的历程。 MongoDB的使用之前也分享过一篇,稍微高阶点:见这里:《MongoDB使用小结》 1、shell登陆和显示 假设在本机上有一个端口为17380的MongoDB服务,假设已经把mongo bin文件加入到系统PATH下。 登陆:...

weixin_30278237的博客 70

MongoDB 使用小结

一、MongoDB 设置账号和密码 使用ROTO 3T图形化客户端工具连接mongo时,MongoDB出现错误:Error: Failed to execute "listdatabases" command​ 错误:无法执行“listdatabases”命令,这时候需要用步骤2的命令创建一个管理员账户admin。 1.开启认证    MongoDB默认安装完成...

站在搜素引擎上的巨人 3587

Mongodb分片 学习小结

前一篇 https://www.cnblogs.com/frx9527/p/mongodb.html 学会搭建复制集Replication之后,就可以学习分片Sharding了。 教程建议看官方文档:https://docs.mongodb.com/manual/ 总结一下笔记,为了后续速查. 环境准备,安装,不再多述,如有问题查:https://docs.mongodb.com...

weixin_30480651的博客 179

mongodb的使用小结

最近在使用mongodb时遇到了一些小困难,这里记录下解决的过程 错误: ./mongostat: /usr/lib64/libssl.so.10: no version information available (required by ./mongostat) ./mongostat: /usr/lib64/libcrypto.so.10: no version information

wangzhaotongalex的专栏 6588

MongoDB 小结

MongoDB 小结

小楠的博客 747

Mongodb集群小结

上一篇写到集群的分片, 这次在这里做个小结: 在测试的时候发现以前的数据都是经过压缩之后再存储的。所以存在一个问题: 新建的切片上数据没有经过压缩,跟以前的数据压缩冲突。 解决办法: 把新建的切片也设置为存储压缩模式。如下: D:\MongoDBWiredTiger\bin>mongod --shardsvr --storageEngine wiredTiger --port 966

wsh_mar的专栏 326

安装MongoDB小结

安装包的下载url:  https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl安装参考的url:  http://www.runoob.com/mongodb/mongodb-window-install.html我的安装内容:bin下文件:mongod.cfg    内容:    systemLog:     destination: file ...

zuozhiyoulaisam的专栏 256

mongodb使用小结

1,关于聚合(aggregate) >db.collection.aggregate(组合条件) 经常与管道操作符搭配使用,常用的管道操作符 $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。 match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。...

weixin_43633810的博客 211
上一篇: MongoDB入门简介
下一篇: Windows下基于Eclipse的Hadoop开发环境完全配置(一)
雨落
博客等级 码龄16年 83粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值