MongoDB的磁盘IO问题的解决方法-Metrics

Java操作MongoDB

在Ubuntu 13.10下安装了下Mongodb数据库,现在记下安装操作方法以及自动启动的方法: 在Ubuntu 13.10下安装了下Mongodb数据库,,现在记下安装操作方法以及自动启动的方法: 1. apt-get update 更新软件库

有点标题党的意思,不过下面三招确实比较实用,内容来自Conversocial公司的VP Colin Howe在London MongoDB用户组的一个分享。

申请:下面几点并非放四海皆准的法则,具体是否能够使用,还需要根据自己的应用场景和数据特点来决定。

1.使用组合式的大文档

我们知道MongoDB是一个文档数据库,其每一条记录都是一个JSON格式的文档。比如像下面的例子,每一天会生成一条这样的统计数据:

{ metric: "content_count", client: 5, value: 51, date: ISODate("2012-04-01 13:00") }

{ metric: "content_count", client: 5, value: 49, date: ISODate("2012-04-02 13:00") }

而如果采用组合式大文档的话,就可以这样将一个月的数据全部存到一条记录里:

{ metric: "content_count", client: 5, month: "2012-04", 1: 51, 2: 49, ... }

通过上面两种方式存储,预先一共存储大约7GB的数据(机器只有1.7GB的内存),测试读取一年信息,这二者的读性能差别很明显:

第一种: 1.6秒

第二种: 0.3秒

那么问题在哪里呢?

实际上原因是组合式的存储在读取数据的时候,可以读取更少的文档数量。而读取文档如果不能完全在内存中的话,其代价主要是被花在磁盘seek上,第一种存储方式在获取一年数据时,需要读取的文档数更多,所以磁盘seek的数量也越多。所以更慢。

实际上MongoDB的知名使用者foursquare就大量采用这种方式来提升读性能。见此

2.采用特殊的索引结构

我们知道,MongoDB和传统数据库一样,都是采用B树作为索引的数据结构。对于树形的索引来说,保存热数据使用到的索引在存储上越集中,索引浪费掉的内存也越小。所以我们对比下面两种索引结构:

db.metrics.ensureIndex({ metric: 1, client: 1, date: 1})

db.metrics.ensureIndex({ date: 1, metric: 1, client: 1 })

采用这两种不同的结构,在插入性能上的差别也很明显。

当采用第一种结构时,数据量在2千万以下时,能够基本保持10k/s 的插入速度,而当数据量再增大,其插入速度就会慢慢降低到2.5k/s,当数据量再增大时,其性能可能会更低。

而采用第二种结构时,插入速度能够基本稳定在10k/s。

其原因是第二种结构将date字段放在了索引的第一位,这样在构建索引时,新数据更新索引时,不是在中间去更新的,只是在索引的尾巴处进行修改。那些插入时间过早的索引在后续的插入操作中几乎不需要进行修改。而第一种情况下,由于date字段不在最前面,所以其索引更新经常是发生在树结构的中间,导致索引结构会经常进行大规模的变化。

3.预留空间

与第1点相同,这一点同样是考虑到传统机械硬盘的主要操作时间是花在磁盘seek操作上。

比如还是拿第1点中的例子来说,我们在插入数据的时候,预先将这一年的数据需要的空间都一次性插入。这能保证我们这一年12个月的数据是在一条记录中,是顺序存储在磁盘上的,那么在读取的时候,我们可能只需要一次对磁盘的顺序读操作就能够读到一年的数据,相比前面的12次读取来说,磁盘seek也只有一次。

db.metrics.insert([

{ metric: 'content_count', client: 3, date: '2012-01', 0: 0, 1: 0, 2: 0, ... }

{ .................................., date: '2012-02', ... })

{ .................................., date: '2012-03', ... })

{ .................................., date: '2012-04', ... })

{ .................................., date: '2012-05', ... })

{ .................................., date: '2012-06', ... })

{ .................................., date: '2012-07', ... })

{ .................................., date: '2012-08', ... })

{ .................................., date: '2012-09', ... })

{ .................................., date: '2012-10', ... })

{ .................................., date: '2012-11', ... })

{ .................................., date: '2012-12', ... })

])

结果:

如果不采用预留空间的方式,读取一年的记录需要62ms

如果采用预留空间的方式,读取一年的记录只需要6.6ms

以上就是MongoDB的磁盘IO问题的解决方法的详细内容,更多请关注php中文网其它相关文章!

Ubuntu下安装MongoDB 及自启动启动方法

在Ubuntu 13.10下安装了下Mongodb数据库,现在记下安装操作方法以及自动启动的方法: 在Ubuntu 13.10下安装了下Mongodb数据库,,现在记下安装操作方法以及自动启动的方法: 1. apt-get update 更新软件库

laravel使用mongodb数据库的方法教程

Mongodb,分布式文档存储数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。它在许多场景下可用于替代传统...

MongoDB无法启动的解决方法

遇到MongoDB突然无法启动,第一反应是删除mongod.lock。这个文件在MongoDB的数据库目录下,默认是/data/db。这是最常见的问题了,产生原因是MongoDB没有正常结束(比如被kill -9杀掉或是其他意外情况导致中断)。 还一些其他情况...

MongoDB五分钟教程:MongoDB Shell入门

...分钟的教程里,将会教大家如何在Windows环境下快速开始MongoDB的入门学习。本文介绍的是连接到MongoDB服务器的方法,以及M 在这五分钟的教程里,将会教大家如何在Windows环境下快速开始MongoDB的入门学习。本文介...

[MongoDB学习笔记-02] Node.js连接MongoDB的两种方法

MongoDB Node.js驱动程序是被官方所支持的原生Node.js驱动程序,他是至今为止最好的实现, 并且得到了MongoDB官方的支持。MongoDB团队已经采用MongoDB Node.js驱动程序作为标准方法。 npm install mongodb @1 .4 .3 // MongoD

关于node.js连接MongoDB数据库的2种方法

...gdb的基础知识,跟着网上大神的脚步(代码)去模拟连接mongodb数据库,下面这篇文章就给大家总结介绍了node.js连接MongoDB数据库的2种方法教程,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。

mac osx下安装MongoDB方法

简介一、进入mongodb官方网站下载安装包 下载地址:https://www.mongodb.com/download-center/community 从 MongoDB 3.0 版本开始只支持 OS X 10.7 (Lion) 版本及更新版本的系统。 二、下载及安装 #

如何升级PHP7操作MongoDB方法介绍

这篇文章分享给大家的内容是关于如何升级PHP7操作MongoDB的方法介绍,内容很有参考价值,希望可以帮到有需要的小伙伴。前言使用 PHP+MongoDB 的用户很多,因为 MongoDB 对非结构化数据的存储...

MongoDB复制错误及处理方法

...使用的命令是 ./mongorestore -h localhost:27100 /data/backup/mongodb 解决方法: 改为 ./mongorestore --port 27100 /data/backup/mongodb 2、error RS102 too stale to

实例详解PHP下 Mongodb 连接远程数据库方法

这篇文章主要介绍了PHP下 Mongodb 连接远程数据库的实例代码,需要的朋友可以参考下WINDOWS 下装MongoDB先去官网下载 :https://www.mongodb.com/download-center#atlas1、在mongodb的文件夹下创建 data、logs ...