- 浏览: 268187 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (263)
- mysql (5)
- boost (6)
- 工具 (10)
- IT生活 (7)
- 多线程 (3)
- Ruby (15)
- php (2)
- MongoDB (39)
- 移动互联网 (2)
- 测试 (8)
- c++ (28)
- 书 (1)
- 网站 (3)
- 网络编程 (14)
- 开源软件 (1)
- 分布式计算 (1)
- 得得得 (1)
- php,wordpress (1)
- error (5)
- 编译 (2)
- 学习 (1)
- 杀毒软件 (1)
- dd (0)
- linux (21)
- 数据库 (1)
- STL (1)
- c++/c (5)
- 软件设计 (1)
- 操作系统 (4)
- 库 (2)
- win32 (1)
- s (0)
- openssl (1)
- perl (2)
- debug (1)
- windows (4)
- python (12)
- windows 防火墙 (1)
- vs (1)
- vim (2)
- vc (1)
- 浏览器插件的危害 (1)
- curl (0)
- 判断手机号码合法性的库 (0)
- 地址备注 (0)
- 安装 File::Slurp (1)
- cenos (2)
- shell (1)
- linunx (1)
- internet (1)
- software (1)
- widows (1)
- linux io (1)
- nginx (2)
- 算法 (2)
- google (1)
- protobuf (2)
- tengine (1)
- tools (1)
- lua (2)
- liunx (1)
- vcard (1)
- lua-iconv (1)
- 网络 (2)
- teat (0)
- ldconfig linux (0)
- awk (0)
- grep (0)
- windws (2)
- linux 命令 (1)
- tcp dump (1)
- vmware (1)
- question2answer (2)
- mongdb (1)
- 正则 (1)
- OCR (2)
- Windows Server (1)
最新评论
[转]十个 MongoDB 使用要点
- 博客分类:
- MongoDB
从 [url = "http://space.itpub.net/133735/viewspace-710117"]mongodb 阶段性技术总结[/url] 中抽取并整理了对大家有帮助的十个要点:
1.mongodb 表名和字段名统一用小写字母
mongodb 是默认区分大小写的,为了避免以前在 mysql 下遇到的大小写敏感导致程序访问频频出错,
建立规范,mongodb 的表名和字段名都用小写字母命名。
2.尽可能的缩短字段名的长度
mongodb 的 schema free 导致了每笔数据都要存储它的 key 以及属性,这导致了这些数据的大量冗余。
开发人员也许考虑到,从易读性出发设计的 key 名,基本都是按照字面意思去设计的,这导致 key 很长,对应的数据存储占用了很大的空间。
所以,在你的程序里维护一套字典即可,尽可能降低 key 的长度。
譬如:
static final String CONTENT = "content";
static final String CONTENT_TYPE = "ctype";
static final String CONTENT_LENGTH = "clen";
3.记住,mongodb 的查询每次只能用到一个索引
对于较复杂的表结构,可能会导致你频频使用联合索引。
但记住:
1)mongodb 单表最大索引数为 64 。
2)索引越多,插入或修改记录就会导致 mongodb 越慢。写锁会阻塞读请求,写得越慢,阻塞读请求越多、阻塞时间越长。
所以,索引越加越多的时候,你可能需要审视一下表结构设计的合理性。
4.客户端连接数大小的设置
mongodb-java-driver 的连接池,目前从观察到的情况是应用一开启便根据 connectionsPerHost 变量的设置,建立全部连接,然后提供给程序使用,并且一旦其中某个连接到数据库的访问失败,则会清空整个连接池到这台数据库的连接,并重新建立连接。
而 mongodb 对中断连接的垃圾清理工作则是懒惰的被动清理方式,如果驱动程序端配置的连接数过大,一旦发生重连,则会导致 mongo 服务器端堆积大量的垃圾连接以及对应数据,导致主机资源耗尽。
建议: mongodb 驱动的连接池大小的设置一般应该控制 100 左右。
( 参考阅读:PHP-FPM模式下可怕的 MongoDB-PHP-Driver 连接池无节制连接问题)
5.实例分离
mongodb 对数据库的访问全部加锁。
如是查询请求则设置共享锁。
数据修改请求则设置全局排他锁,且是实例级别的排他锁。
写锁会阻塞读请求,如果长时间持有写锁,会阻塞整个实例的读请求。
建议:
1)不同应用不应该共用同一个实例,防止互相阻塞!
2)如服务器资源不足,共用同一个实例,要保证读写特性相同,如都是读多写少,防止一台写多应用阻塞读请求。
(评语:旧版本的MongoDB (pre 2.0)拥有一个全局的写入锁,这个问题在2.0版本中的得到了显著的改善,并且在当前2.2版本中得到了进一步的加强。MongoDB 2.2使用数据库级别的锁在这个问题上迈进了一大步。所以用 MongoDB 2.2的人可以忽略此条目。)
6.需要重点关注的 mongodb 性能指标
关注主要性能指标:
1)Faults:显示 mongodb 每秒页面故障的数量,这个是 mongodb 映射到虚拟地址空间,而不是物理内存。这个值如果飙高的话,可能意味着机器没有足够的内存来存储数据和索引。
2)Flushes:每秒做了多少次 fsync,显示多少次数据被刷新进了磁盘。
3)locked:写锁。
4)idx miss:索引未命中比例。
5)qr | qw:读写锁的请求队列长度。
6)conn: 当前已经建立的连接数。
7.严重的空间碎片问题
mongodb 如果数据修改很频繁,会出现比较严重的空间碎片问题,表现在磁盘文件扩张与实际数据量不相符,内存不够用,索引命中率低,查询效率降低。
碎片整理,目前我们采用的版本没有太有效的方法。
可以用 db.repaireDatabase() 来整理数据库,这个过程非常的慢。
如果是 master/slave 模式,则相当于执行一次主从切换,然后从新建立从库。
如果是 replSet 架构,可以停掉数据库,然后删除数据目录,从新从复制组中全同步数据,这个时候要考虑 oplog 的尺寸。
一个大体的步骤:
1)先调用rs.freeze(1200),将每个不想让它成为 primary 的机器让它在 1200 秒内无法成为 primary(这步也可以不做);
2)将 primary stepDown,不出意外新的 primary 会起来;
3)将原 primary kill 掉;
4)删掉所有 data 数据(调用 repair 很慢,真不如干掉重新来);
5)再重启动原 primary 的进程;
6)以此循环完成整个复制组的全部重建。
8.连接池 WriterConcern 模式选择
有些应用配置了 WriterConcern.FSYNC_SAFE 模式;这种配置意味着客户端在插入数据或更新数据的时候,要求 mongodb 必须将所更新的数据写入磁盘并返回更新成功的信息给程序。
如果碰上应用程序访问压力大,mongodb 就会反应迟钝,并可能会假死。
针对此情况,需要评估数据的一致性需求,做出合适调整。
我们一般建议关闭此选项。
(评语:刘奎波的业务中心优化时就关闭了这个 WriterConcern.FSYNC_SAFE 模式)
9.开发时注意的细节
1)更新某条数据的时候,先查出来再更新会减小锁的时间;
2)只有真正需要的字段才select出来;
3)只有返回很少结果的查询才用索引,否则会加载太多数据,比没有用索引还慢!
4)属性比较多的时候,建立分层的关系能够提高查询效率,否则每个记录都要过一遍才能找到要的属性。(评语:貌似说的是以 Array 形式存储的 subdocument)
5)skip+limit 翻页,越往后面越慢。比较靠谱的做法是,先找出上次的id,翻页的时候不用 skip:
last_row_id = ObjectId('....');
db.activity_stream->find({_id:{$lt: last_row_id },user_id:20 } ).sort( {_id:-1} ).limit(10);
10.关于硬件资源的选择
虚拟机可以很好的隔离资源,并可动态的扩展。
我们建议 mongodb 的部署采用虚拟机的方式,每个虚拟机部署一个实例,使各节点分散在不同的物理机上,根据应用的前期预测,平衡虚拟机的之间的i/o。
参考资源:
1)horizonhyg,2012,Mongodb写入安全机制--GetLastError;
2)horizonhyg,2012,java连接mongo;
3)55最佳实践系列:MongoDB最佳实践
转:http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/25/2875962.html
1.mongodb 表名和字段名统一用小写字母
mongodb 是默认区分大小写的,为了避免以前在 mysql 下遇到的大小写敏感导致程序访问频频出错,
建立规范,mongodb 的表名和字段名都用小写字母命名。
2.尽可能的缩短字段名的长度
mongodb 的 schema free 导致了每笔数据都要存储它的 key 以及属性,这导致了这些数据的大量冗余。
开发人员也许考虑到,从易读性出发设计的 key 名,基本都是按照字面意思去设计的,这导致 key 很长,对应的数据存储占用了很大的空间。
所以,在你的程序里维护一套字典即可,尽可能降低 key 的长度。
譬如:
static final String CONTENT = "content";
static final String CONTENT_TYPE = "ctype";
static final String CONTENT_LENGTH = "clen";
3.记住,mongodb 的查询每次只能用到一个索引
对于较复杂的表结构,可能会导致你频频使用联合索引。
但记住:
1)mongodb 单表最大索引数为 64 。
2)索引越多,插入或修改记录就会导致 mongodb 越慢。写锁会阻塞读请求,写得越慢,阻塞读请求越多、阻塞时间越长。
所以,索引越加越多的时候,你可能需要审视一下表结构设计的合理性。
4.客户端连接数大小的设置
mongodb-java-driver 的连接池,目前从观察到的情况是应用一开启便根据 connectionsPerHost 变量的设置,建立全部连接,然后提供给程序使用,并且一旦其中某个连接到数据库的访问失败,则会清空整个连接池到这台数据库的连接,并重新建立连接。
而 mongodb 对中断连接的垃圾清理工作则是懒惰的被动清理方式,如果驱动程序端配置的连接数过大,一旦发生重连,则会导致 mongo 服务器端堆积大量的垃圾连接以及对应数据,导致主机资源耗尽。
建议: mongodb 驱动的连接池大小的设置一般应该控制 100 左右。
( 参考阅读:PHP-FPM模式下可怕的 MongoDB-PHP-Driver 连接池无节制连接问题)
5.实例分离
mongodb 对数据库的访问全部加锁。
如是查询请求则设置共享锁。
数据修改请求则设置全局排他锁,且是实例级别的排他锁。
写锁会阻塞读请求,如果长时间持有写锁,会阻塞整个实例的读请求。
建议:
1)不同应用不应该共用同一个实例,防止互相阻塞!
2)如服务器资源不足,共用同一个实例,要保证读写特性相同,如都是读多写少,防止一台写多应用阻塞读请求。
(评语:旧版本的MongoDB (pre 2.0)拥有一个全局的写入锁,这个问题在2.0版本中的得到了显著的改善,并且在当前2.2版本中得到了进一步的加强。MongoDB 2.2使用数据库级别的锁在这个问题上迈进了一大步。所以用 MongoDB 2.2的人可以忽略此条目。)
6.需要重点关注的 mongodb 性能指标
关注主要性能指标:
1)Faults:显示 mongodb 每秒页面故障的数量,这个是 mongodb 映射到虚拟地址空间,而不是物理内存。这个值如果飙高的话,可能意味着机器没有足够的内存来存储数据和索引。
2)Flushes:每秒做了多少次 fsync,显示多少次数据被刷新进了磁盘。
3)locked:写锁。
4)idx miss:索引未命中比例。
5)qr | qw:读写锁的请求队列长度。
6)conn: 当前已经建立的连接数。
7.严重的空间碎片问题
mongodb 如果数据修改很频繁,会出现比较严重的空间碎片问题,表现在磁盘文件扩张与实际数据量不相符,内存不够用,索引命中率低,查询效率降低。
碎片整理,目前我们采用的版本没有太有效的方法。
可以用 db.repaireDatabase() 来整理数据库,这个过程非常的慢。
如果是 master/slave 模式,则相当于执行一次主从切换,然后从新建立从库。
如果是 replSet 架构,可以停掉数据库,然后删除数据目录,从新从复制组中全同步数据,这个时候要考虑 oplog 的尺寸。
一个大体的步骤:
1)先调用rs.freeze(1200),将每个不想让它成为 primary 的机器让它在 1200 秒内无法成为 primary(这步也可以不做);
2)将 primary stepDown,不出意外新的 primary 会起来;
3)将原 primary kill 掉;
4)删掉所有 data 数据(调用 repair 很慢,真不如干掉重新来);
5)再重启动原 primary 的进程;
6)以此循环完成整个复制组的全部重建。
8.连接池 WriterConcern 模式选择
有些应用配置了 WriterConcern.FSYNC_SAFE 模式;这种配置意味着客户端在插入数据或更新数据的时候,要求 mongodb 必须将所更新的数据写入磁盘并返回更新成功的信息给程序。
如果碰上应用程序访问压力大,mongodb 就会反应迟钝,并可能会假死。
针对此情况,需要评估数据的一致性需求,做出合适调整。
我们一般建议关闭此选项。
(评语:刘奎波的业务中心优化时就关闭了这个 WriterConcern.FSYNC_SAFE 模式)
9.开发时注意的细节
1)更新某条数据的时候,先查出来再更新会减小锁的时间;
2)只有真正需要的字段才select出来;
3)只有返回很少结果的查询才用索引,否则会加载太多数据,比没有用索引还慢!
4)属性比较多的时候,建立分层的关系能够提高查询效率,否则每个记录都要过一遍才能找到要的属性。(评语:貌似说的是以 Array 形式存储的 subdocument)
5)skip+limit 翻页,越往后面越慢。比较靠谱的做法是,先找出上次的id,翻页的时候不用 skip:
last_row_id = ObjectId('....');
db.activity_stream->find({_id:{$lt: last_row_id },user_id:20 } ).sort( {_id:-1} ).limit(10);
10.关于硬件资源的选择
虚拟机可以很好的隔离资源,并可动态的扩展。
我们建议 mongodb 的部署采用虚拟机的方式,每个虚拟机部署一个实例,使各节点分散在不同的物理机上,根据应用的前期预测,平衡虚拟机的之间的i/o。
参考资源:
1)horizonhyg,2012,Mongodb写入安全机制--GetLastError;
2)horizonhyg,2012,java连接mongo;
3)55最佳实践系列:MongoDB最佳实践
转:http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/25/2875962.html
发表评论
-
mongodb 从3.0 升级到3.2
2016-06-15 19:27 1425下载mongodb: curl "https://f ... -
MongoDB 日志切换
2016-06-13 17:47 819MongoDB默认情况下不会自动的切换轮转日志的,这将会导致日 ... -
mongodb c++ driver 从2.4.6 升级到3.0.1 注意点 (windows版本)
2015-09-15 17:58 6841. 使用mongodbclient的静态库需要定义下面的值 ... -
check_mongodb nagios
2015-08-17 17:22 0nagios check_mongodb插件监控mongodb ... -
Mongodb profiling
2015-08-06 10:14 404Mongodb profiling是Mngodb提供的类似于m ... -
linux mongdb 备份操作笔记
2015-07-22 09:21 586目的:添加一个延迟1小时的sencodary作为冷备数据库 ... -
mongodb 操作失失误救策略
2015-07-14 20:47 431杀掉某个正在处理的操作: db.currentOp() db ... -
mongodb oplog
2015-06-30 10:53 515mongodb oplog的使用 所在位置: Master/ ... -
mongodb 升级的问题导致添加帐号出现问题
2015-06-05 11:47 937mongodb 原有数据库版本:2.2.2 更新到数据库版本 ... -
libmongodbclient 2.6.6
2015-02-25 11:43 486mongodb c++ driver 2.6之后的版本不能从m ... -
mongodb 搜索结果保存到文件中
2013-07-22 16:44 1928第一种方式: mongo localhost:11111/te ... -
getLastError mongodb
2013-04-03 10:32 0一、简介 很多人抱怨mongodb是内存数据库,也没有事务,会 ... -
getLastError mongodb
2013-03-30 18:24 929http://docs.mongodb.org/manual/ ... -
利用mongodb c++ driver来编译
2012-12-04 15:12 0编译库时错误: 引用 E:\code_64\v2.2.2\m ... -
scons 64 mongodb
2012-08-01 19:52 972编译64位mongodb spin_lock.cpp cl ... -
scons 编译 mongodb client lib
2012-07-31 20:09 1211Use scons to build MongoDB and ... -
MongoDB 客户端 MongoVue
2012-05-14 11:13 942今天在同事那里看到了 ... -
mongodb 2.0.0 replica set + authentication bug
2012-04-26 13:56 919mongodb 2.0.0 replica set + aut ... -
array in mongodb ( c++ driver)
2012-04-25 17:31 2223BSONArray BSONArrayBuilder ... -
(转) RockMongo查询操作用法总结
2012-04-11 20:40 27811.简单查询 //xid=560870 and type=vi ...
相关推荐
### MongoDB使用手册_v1.0 知识点详解 #### 一、MongoDB简介 **1.1 功能特点** ...以上内容涵盖了 MongoDB 使用手册_v1.0 中的基础知识和技术要点,可以帮助初学者快速入门并掌握 MongoDB 的基本操作。
本文将根据提供的文件信息,深入探讨MongoDB在管理接近10亿文档时的最佳实践和技术要点。 #### 二、关键知识点详解 ##### 1. **接近10亿文档的管理** - **统计信息**:如文件中所示,截至2010年4月25日,MongoDB...
### MongoDB权威指南知识点...通过上述内容,我们可以看出,《MongoDB权威指南》主要围绕MongoDB的基本概念、安装配置、操作命令、高级特性等方面进行了详细介绍,旨在帮助读者全面掌握MongoDB的使用方法和技术要点。
根据提供的信息,我们可以总结出以下关于 MongoDB 的关键知识点: ### MongoDB 概览 - **官方文档**:用户提及“mongodb 官方文档”,这表明...通过系统地学习这些内容,可以全面掌握 MongoDB 的使用方法和技术要点。
在监控MongoDB分片集群时,我们关注的要点包括: 1. **分片状态**:确保所有分片都在线并正常工作,没有出现数据不平衡或分片故障的情况。 2. **复制集状态**:每个分片可能包含一个或多个副本集,需要监控副本集的...
此书名明确了本书的核心内容:如何使用Node.js、MongoDB及Backbone这三个关键技术来构建Web应用程序。这三个技术组合在一起提供了一个全栈的开发解决方案。 - **Node.js**:作为后端服务器端的技术,它使用...
1. **总结**:回顾MongoDB的核心概念和技术要点。 2. **发展趋势**:预测未来MongoDB可能的发展方向和技术革新。 通过上述内容的学习,读者可以系统地掌握MongoDB的基本操作及高级特性,并能够在实际项目中灵活运用...
ASP.NET MVC4 使用 MongoDB 制作相册管理 本文档详细介绍了如何使用 ASP.NET MVC4 和 MongoDB 制作相册管理系统。该系统采用了 ASP.NET MVC4 框架和 MongoDB 数据库,实现了照片的上传、存储和显示功能。 一、 ASP...
通过以上知识点的介绍,《深入学习MongoDB》这本书不仅涵盖了MongoDB的基本概念和技术要点,还深入探讨了高级特性和最佳实践,对于希望深入了解并掌握MongoDB的开发者来说是一本非常有价值的参考书。
10. **驱动程序**:MongoDB有多种官方和社区支持的驱动程序,如MongoDB Java驱动、Python PyMongo、Node.js MongoDB驱动等,这些驱动使得在不同编程语言中使用MongoDB变得简单。 11. **安全性**:MongoDB提供身份...
需要考虑的要点包括:根据用户需求设计模式、如果将对象组合在一起使用,则将它们组合到一个文档中、连接是在写的时候进行的,而不是在读取的时候进行的、对于大多数常见的用例,优化您的架构模式、在架构中进行复杂...
《大数据存储MongoDB实战指南》从学习与实践者的视角出发,本着通俗精简、注重实践、突出精髓的原则,精准剖析了MongoDB的诸多概念和要点。资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
本文档将基于提供的“MongoDB部署配置简要手册”中的内容,详细介绍MongoDB的部署步骤和配置要点。 #### 二、环境准备与安装 在部署MongoDB之前,需要先准备好相应的硬件环境和软件环境。这里以Linux系统为例,...
MongoDB 是一个文档数据库,提供高性能、高可用性和易扩展性。下面是 MongoDB 相关知识点的详细解释: 1. MongoDB 中的命名空间是什么? 答案: MongoDB 在集合中存储 BSON(二进制交换和结构对象表示法)对象。...
下一代数据库主要解决几个要点:非关系型的、分布式的、开源的、水平可扩展的。原始的目的是为了大规模web应用,这场运动开始于2009年初,通常特性应用如:模式自由、支持简易复制、简单的API、最终的一致性(非ACID...
首先,`MongoDB.pptx`很可能是一个演示文稿,通常会包含MongoDB的基本概念、核心特性、安装步骤以及基本操作。它可能会涵盖以下内容: 1. **MongoDB概述**:解释MongoDB是什么,为什么选择MongoDB(比如JSON文档...