应用性能高低依赖于数据库性能,MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

本文针对实时监控 MongoDB 数据库,总结了一些使用的工具以及需要重点注意的性能方面。

1,实时监控 MongoDB 工具

MongoDB 用自己的工具来统计现在运行的 MongoDB 服务器的数据,并进行实时报告分析:

  • mongostat:可以展示像 opcounts,lock%,内存使用以及副本集更新状态等关键指标,因为可以实时看到发生的状况,所以一般用于故障除疑。
  • mongotop:mongostat 提供的是全局指标,而 mongotop 则提供追踪 MongoDB 实例花费在读写操作数据的时间指标,提供每个集合级别的统计数据。
  • is.status():返回的是当前服务器节点执行操作后副本集的状态,通过这个来实时查看集群的变化。
  • sh.status():返回你的分片集群的状态,尤其是每块碎片的数量,显示关于分片集群的现有区块的信息的格式化的报告,如果区块大于等于20就不显示详细块信息。

2,内存使用量和页面错误

内存可能是你可以给 MongoDB 的最重要的资源,因为 Mongodb 是相当吃内存的,如果控制不好的话,mongodb会挂掉。。。所以你要确保你给的内存总是有足够的!经验之谈是提供符合索引数量的足够的 RAM,如果可能的话,为所有数据提供足够的内存。

常驻内存是这里的关键指标,MongoDB 内存 mem 记录了 Mongod 的系统架构和内存使用。

页面错误和内存相关因为页面错误发生时是 MongoDB 去磁盘里面查找数据而不是内存中,如果内存的数量不能满足性能需求,那么你将会看到页面错误,随着页面错误率的上升,opcounters 最终会低于期望值,所以这时你应该增加可用的 RAM。

3,连接数

连接到 MongoDB 的每个连接都有助于追踪系统所需的内存的开销。这最初由 Unix 通过 ulimit 来设置限制,但随后成为由服务器资源,特别是存储器限制。

过高数量的连接数还可以指明问题,例如你的应用程序代码打开太多的连接,造成某地方产生很高的 lock% 。

有时客户端和数据库之间的连接数超出服务器处理请求的能力,这可能会导致在 MongoDB 环境的应用程序性能的下降。

4,数据库操作

不多说,实时掌握数据库操作的统计数据以及复制和分片操作的详细信息,确保每秒数据库操作(inserts,query,update,delete,getmore 等 command 命令)的总数有助于分析和跟踪数据库的负载。

5,锁

MongoDB 使用一个全局锁来确保一致性。但是,如果某些操作是长时间运行的或形成一个队列,操作等待锁就会大大降低应用程序性能。

在 MongoDB 2.6版本中,锁是数据库级别的,一直持续 MongoDB 2.8,写操作都是一个全局性数据库锁,MongoDB 使用的这种「readers-writer」锁,虽然支持并发但有很大的局限性,当一个读锁存在,许多读操作可以使用这把锁,然而当一个写锁存在时,其它读写操作不能使用共享这个锁,写入优先于读取,当两个操作一个读取和一个写入正在等待锁,MongoDB 会授予写锁,所以如果写锁发生的过于频繁,那么你应用的性能出现文件也就不奇怪了。当然如果你的应用中真的有大量的写操作,可以考虑 Cassandra 数据库。

6,复制集

MongoDB 复制集通过将数据部署在多个不同的服务器上,防止因单机故障而造成数据的丢失,借助数据冗余来提高数据的可靠性和安全性。而且还可以通过复制技术构建分布式数据库,提高系统的访问性能和安全性。

复制集同步数据过程是:Primary 节点写入数据,Secondary 通过读取 Primary 的 oplog 得到复制信息,开始复制数据并且将复制信息写入到自己的 oplog,复制延迟是 Primary 节点上写入到 Secondary 节点读取 oplog 再写入操作的延迟,复制延迟可能是一个显著的问题,严重影响 MongoDB 副本集部署,过度复制延迟使「滞后」的节点将很快成为 Primary ,增加了分布式读操作不一致的可能性。

7,片键

分片是在多台计算机存储数据记录的过程中 MongoDB 来满足数据增长需求的特有方式。随着数据量的增加,一台服务器可能不足以存储数据或提供大量的读写操作。分片解决了水平扩展的问题,通过分片,可以添加更多的机器来支持数据增长以及满足读写操作的需求。

MongoDB 在集合的水平上分割数据和分片,通过一个片键( shard key )来分割分片。

为了将一个集合分片,需要选择一个片关键字。一个片键是一个索引字段,或是存在于每个集合文档中的一个复合索引字段。选择正确的分片键可以对应用性能,功能以及数据库和集群的运作有很大的影响,合适的分片键选择取决于你的数据的架构和应用程序的查询和写入数据的方式。而且 Mongodb 数据库是否能高效运转也取决于你指定了文档的哪个字段作为分片字段。由于分片字段都是预先选择且选定后无法更改的,而且考虑到 MongoDB 纵向扩展能力的限制,选择时就需要深思熟虑了。分片键应该满足以下条件:

  • 分配 -- 分片键最糟糕的情况是自增的值(当所有的写操作将被平衡到单个碎片时就意味着"热碎片"的发生,而这就是瓶颈)。理想的分片重点应该读和写是尽可能多的"随机分布"。
  • 理想的片键主要功能应该是用于查询,如果大部分的查询请求都能够命中尽可能少的分片那就最好了。
  • 一个好的片键使得 MongoDB 分配内容变的容易。MongoDB 会根据你的设置将你的数据划分到有着相同片键的数据块 (Chunk) 中。而后这些数据块将根据片键的大致顺序分散到副本集中。

8,集成监控工具 Cloud Insight

想要看以上数据指标,需要一定的监控手段,MongoDB 本身有一堆自己的工具,此外还有开源工具以及第三方厂家提供的监控软件,总结为一点,监控很重要,Cloud Insight 全面监控 MongoDB,一工具在手,默认60个数据指标,MongoDB 发生什么都了然于心。

顺道推荐这些文章:

大规模运行 MongoDB 应该知道的10件事

本文由 Cloud Insight 工程师整理编译, Cloud Insight 集监控、管理、计算、协作、可视化于一身,帮助所有 IT 公司,减少在系统监控上的人力和时间成本投入,让运维工作更加高效、简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

想使用 MongoDB ,你应该了解这8个方面!的更多相关文章

  1. 想使用 MongoDB ,你应该了解这8个方面!

    想使用 MongoDB ,你应该了解这8个方面! 应用性能高低依赖于数据库性能,MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解 ...

  2. 【MongoDB】从入门到精通mongdb系列学习宝典,想学mongodb小伙伴请进来

    最近一段时间在学习MongoDB,在学习过程中总共编写了四十余篇博客.从mongodb软件下载到分片集群的搭建. 从理论讲解到实例练习.现在把所有博客的内容做个简单目录,方便阅读的小伙伴查询. 一. ...

  3. 【先定一个小目标】Windows下安装MongoDB 3.2

    1.MongoDB 安装 官网提供了三个版本下载: - MongoDB for Windows 64-bit 适合 64 位的 Windows Server 2008 R2, Windows 7 , ...

  4. 配置mongoDB服务

    上一节说到mongoDB的环境搭建,但是那种方法启动mongoDB太繁琐了. 今天先说说简化mongoDB启动的配置. 首先在命令行中运行的”C:\Program Files\MongoDB 2.6  ...

  5. MongoDB学习系列(3)--解决MongoDB Unexpected Shutdown问题

    晚上准备继续学习PHP+MongoDB,点击Run_MongoDB_Service.bat文件,这个文件是我写的bat文件,就是快速启动MongoDB.但是命令行一闪而过,我很奇怪.昨天晚上写代码还是 ...

  6. MongoDB学习笔记一

    操作系统:Windows7 1.下载MongoDB 2.6.5服务端,并安装 网址:http://pan.baidu.com/s/1dDfoJAh 说明:网上很多都不需要安装的,这个需要安装. 2.添 ...

  7. Mongodb在windows下的安装和启动

    在windows下安装的参考官方地址:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/ Mongodb的安装与启 ...

  8. mongodb使用和下载

    1.下载地址:http://www.mongodb.org/downloads 2.解压缩到自己想要安装的目录,比如d:\mongodb 3.创建文件夹d:\mongodb\data\db.d:\mo ...

  9. 开发基于C#.NET的mongodb桌面版的应用程序(1)

    1.之前没有使用过C#开发过相应的桌面应用程序,现在既然要从零到有进行开发,自然要掌握好C#桌面开发相关的原理与技术,以及站在多类型用户的角度开发具有实际生产意义的mongodb数据库管理软件. 2. ...

随机推荐

  1. 【Slickflow学习】.NET开源工作流项目转换(二)

    第一次自己写博客文章,大家多多指教.写博客主要记录一下学习的过程,给初学者提供下参考,也留给自己做备忘. Slickflow .NET开源工作流-项目转换 上一篇文章里说了1.2版本的下载,下载解压后 ...

  2. 那些好用的iOS开发工具

    版权说明 本文首发于<程序员>杂志 2014 年 6 月刊,未经允许,请勿转载. 前言 从 苹果发明 iPhone 起,AppStore 上的一个又一个类似 flappy bird 的一夜 ...

  3. Unity3D 之射线检测

    这里来记录下射线检测的相关内容: 射线检测故名就是通过射线去检测是否和碰撞器产生了交集,和碰撞器与碰撞器发生交集一样,会返回一个真. 射线的用法很多:比如检测是否跳跃,通过向地面投射射线控制在地面时候 ...

  4. 优雅的实现Activiti动态调整流程(自由跳转、前进、后退、分裂、前加签、后加签等),含范例代码!

    最近对Activiti做了一些深入的研究,对Activiti的流程机制有了些理解,对动态调整流程也有了一些实践方法. 现在好好总结一下,一来是对这段时间自己辛苦探索的一个记录,二来也是为后来者指指路~ ...

  5. WPF 中,如何使用自定义的resources

    第一步,先自己自定义一个Resources 1.新建一个xaml文件,在其中自定义好自己的Resources 这个Resource 的根节点是 <ResourceDictionary xmlns ...

  6. javascript Date类型 学习笔记

    1 创建一个新的日期对象,如果不带参数,则对象自动获得当前的日期和时间 var d = new Date() 2 如果需要指定特定的日期,则可以通过Date.parse() 或者 Date().UTC ...

  7. props验证

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. jQuery 源码分析 8: 回头看jQuery的构造器(jQuery.fn,jQury.prototype,jQuery.fn.init.prototype的分析)

    在第一篇jQuery源码分析中,简单分析了jQuery对象的构造过程,里面提到了jQuery.fn.jQuery.prototype.jQuery.fn.init.prototype的关系. 从代码中 ...

  9. NodeJS连接MongoDB数据库时报错

    今天第一次尝试连接MongoDB数据库,具体步骤也很简单. 首先,通过NodeJS运行环境安装MongoDB包,进入要安装的目录,执行语句 npm install mongodb 安装成功后,通过如下 ...

  10. 常用AWK命令

    常用AWK命令 Awk is a programming language which allows easy manipulation of structured data and the gene ...