应用性能高低依赖于数据库性能,MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。html
本文针对实时监控 MongoDB 数据库,总结了一些使用的工具以及须要重点注意的性能方面。mongodb
MongoDB 用本身的工具来统计如今运行的 MongoDB 服务器的数据,并进行实时报告分析:数据库
mongostat:能够展现像 opcounts,lock%,内存使用以及副本集更新状态等关键指标,由于能够实时看到发生的情况,因此通常用于故障除疑。安全
mongotop:mongostat 提供的是全局指标,而 mongotop 则提供追踪 MongoDB 实例花费在读写操做数据的时间指标,提供每一个集合级别的统计数据。服务器
is.status():返回的是当前服务器节点执行操做后副本集的状态,经过这个来实时查看集群的变化。架构
sh.status():返回你的分片集群的状态,尤为是每块碎片的数量,显示关于分片集群的现有区块的信息的格式化的报告,若是区块大于等于20就不显示详细块信息。并发
内存多是你能够给 MongoDB 的最重要的资源,由于 Mongodb 是至关吃内存的,若是控制很差的话,mongodb会挂掉。。。因此你要确保你给的内存老是有足够的!经验之谈是提供符合索引数量的足够的 RAM,若是可能的话,为全部数据提供足够的内存。运维
常驻内存是这里的关键指标,MongoDB 内存 mem 记录了 Mongod 的系统架构和内存使用。分布式
页面错误和内存相关由于页面错误发生时是 MongoDB 去磁盘里面查找数据而不是内存中,若是内存的数量不能知足性能需求,那么你将会看到页面错误,随着页面错误率的上升,opcounters 最终会低于指望值,因此这时你应该增长可用的 RAM。工具
链接到 MongoDB 的每一个链接都有助于追踪系统所需的内存的开销。这最初由 Unix 经过 ulimit 来设置限制,但随后成为由服务器资源,特别是存储器限制。
太高数量的链接数还能够指明问题,例如你的应用程序代码打开太多的链接,形成某地方产生很高的 lock% 。
有时客户端和数据库之间的链接数超出服务器处理请求的能力,这可能会致使在 MongoDB 环境的应用程序性能的降低。
很少说,实时掌握数据库操做的统计数据以及复制和分片操做的详细信息,确保每秒数据库操做(inserts,query,update,delete,getmore 等 command 命令)的总数有助于分析和跟踪数据库的负载。
MongoDB 使用一个全局锁来确保一致性。可是,若是某些操做是长时间运行的或造成一个队列,操做等待锁就会大大下降应用程序性能。
在 MongoDB 2.6版本中,锁是数据库级别的,一直持续 MongoDB 2.8,写操做都是一个全局性数据库锁,MongoDB 使用的这种「readers-writer」锁,虽然支持并发但有很大的局限性,当一个读锁存在,许多读操做可使用这把锁,然而当一个写锁存在时,其它读写操做不能使用共享这个锁,写入优先于读取,当两个操做一个读取和一个写入正在等待锁,MongoDB 会授予写锁,因此若是写锁发生的过于频繁,那么你应用的性能出现文件也就不奇怪了。固然若是你的应用中真的有大量的写操做,能够考虑 Cassandra 数据库。
MongoDB 复制集经过将数据部署在多个不一样的服务器上,防止因单机故障而形成数据的丢失,借助数据冗余来提升数据的可靠性和安全性。并且还能够经过复制技术构建分布式数据库,提升系统的访问性能和安全性。
复制集同步数据过程是:Primary 节点写入数据,Secondary 经过读取 Primary 的 oplog 获得复制信息,开始复制数据而且将复制信息写入到本身的 oplog,复制延迟是 Primary 节点上写入到 Secondary 节点读取 oplog 再写入操做的延迟,复制延迟多是一个显著的问题,严重影响 MongoDB 副本集部署,过分复制延迟使「滞后」的节点将很快成为 Primary ,增长了分布式读操做不一致的可能性。
分片是在多台计算机存储数据记录的过程当中 MongoDB 来知足数据增加需求的特有方式。随着数据量的增长,一台服务器可能不足以存储数据或提供大量的读写操做。分片解决了水平扩展的问题,经过分片,能够添加更多的机器来支持数据增加以及知足读写操做的需求。
MongoDB 在集合的水平上分割数据和分片,经过一个片键( shard key )来分割分片。
为了将一个集合分片,须要选择一个片关键字。一个片键是一个索引字段,或是存在于每一个集合文档中的一个复合索引字段。选择正确的分片键能够对应用性能,功能以及数据库和集群的运做有很大的影响,合适的分片键选择取决于你的数据的架构和应用程序的查询和写入数据的方式。并且 Mongodb 数据库是否能高效运转也取决于你指定了文档的哪一个字段做为分片字段。因为分片字段都是预先选择且选定后没法更改的,并且考虑到 MongoDB 纵向扩展能力的限制,选择时就须要深思熟虑了。分片键应该知足如下条件:
分配 -- 分片键最糟糕的状况是自增的值(当全部的写操做将被平衡到单个碎片时就意味着"热碎片"的发生,而这就是瓶颈)。理想的分片重点应该读和写是尽量多的"随机分布"。
理想的片键主要功能应该是用于查询,若是大部分的查询请求都可以命中尽量少的分片那就最好了。
一个好的片键使得 MongoDB 分配内容变的容易。MongoDB 会根据你的设置将你的数据划分到有着相同片键的数据块 (Chunk) 中。然后这些数据块将根据片键的大体顺序分散到副本集中。
想要看以上数据指标,须要必定的监控手段,MongoDB 自己有一堆本身的工具,此外还有开源工具以及第三方厂家提供的监控软件,总结为一点,监控很重要,Cloud Insight 全面监控 MongoDB,一工具在手,默认60个数据指标,MongoDB 发生什么都了然于心。
顺道推荐这些文章:
本文由 Cloud Insight 工程师整理编译, Cloud Insight 集监控、管理、计算、协做、可视化于一身,帮助全部 IT 公司,减小在系统监控上的人力和时间成本投入,让运维工做更加高效、简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
本文转自 OneAPM 官方博客