MongoDB生产环境性能和可靠性注意事项

本文是翻译MongoDB Manuel中的MongoDB Production Notes一节内容。这节内容重点关注生产环境中影响性能和可靠性的各种注意事项,

本文是翻译mongodb manuel中的mongodb production notes一节内容。这节内容重点关注生产环境中影响性能和可靠性的各种注意事项,值得正在部署mongodb的工作者们关注。本文详细描述了影响mongodb,特别是生产环境的关键系统配置。以下是正文。

  安装包

  确保你安装了最新的稳定版本。这是了解最新版本的最佳场所,即使你稍后选择从包管理器安装。

  生产环境始终使用64位版本。32位版本是为测试和部署环境准备的,不适于生产环境部署,因为它只能存储2GB以内的数据。了解更多内容请查看32位限制。

  32位版本的存在是为满足非正式环境的使用场景。

  操作系统

  MongoDB发行版目前可用于Max OS X,Linux,Windows Server 2008 R2 64位版,Windows 7(32位及64位版),Windows Vista,以及Solaris平台。

  注意:在可能的情况下,MongoDB使用GNU C库(glibc)。MongoDB要求版本至少在glibc-2.12-1.2.el6以避免早先版本一个已知的Bug。为了效果最佳请使用至少2.13版本。

  并发

  早先版本的MongoDB中所有写操作都集中使用实例中的唯一一个读写锁。从2.2开始,每个数据库开始具有一个独立的读写锁,这使得一个数据库可以并发读,同时每个数据库有了独立的写控制。查看并发页了解更多信息。

  日志

  MongoDB使用预先写日志到磁盘日志的办法来保证MongoDB能够快速从崩溃或其他严重错误中恢复写操作。

  为了保证mongod能够从崩溃中恢复并继续处于可用状态,你应该启用日志。查看日志页以了解更多内容。

  网络

  使用可信任网络环境

  始终在可信任环境中运行MongoDB,并启用网络策略禁止未知机器,系统和网络访问。犹如依赖网络访问的任何一个敏感系统一样,你的MongoDB环境应该只为指定的,需要访问的系统开发,例如应用程序服务器,监控服务及其他MongoDB组件。

  注意:默认情况下认证功能未开启,mongod推断自己处于可信任环境中。如有必要你可以启用安全认证模式。

  查看安全章节的内容以了解更多信息。特别是:

  ●配置选项

  ●防火墙

  ●为MongoDB配置Linux iptables防火墙

  ●为MongoDB配置Windows netsh防火墙

  对于Windows用户,在Windows上部署MongoDB时考虑Windows Server TCP技术文章中的内容。

 

  连接池

  为避免单个mongod或mongos实例连接资源越负荷,请确保客户端维护了合理数量的连接池配置。

  connPoolStats数据库命令能够返回一个分片集群里mongos和mongod实例中当前数据库打开连接的信息。

  硬件考量

  MongoDB的设计是基于兼容大多数硬件考虑,几乎没有特别的要求或限制。MongoDB的核心组件能够运行于小端字节优先的硬件,主要是x86/x86_64处理器上。客户端类库(例如驱动)在大端优先或小端优先系统上都可以运行。

  硬件需求和限制

  能够让MongoDB最有效率地运行的硬件应该包含以下特性:

  分配了足够的内存和CPU

  犹如对于所有软件一样,更多的内存和更快的CPU时钟频率对于性能很重要。

  基本上,数据库并非受限于CPU。因此,增加核心数量虽然有帮助,但不会提供显著的回报。

可灵AI 可灵AI

可灵AI:新一代AI创意生产力平台

可灵AI 10856 查看详情 可灵AI

  使用固态硬盘(SSD)

  MongoDB使用SATA SSD能得到很好的效果和很好的性价比。

  在足够经济的情况下请使用SSD。传统硬盘也可能很有效率,但SSD对于随机IO访问的良好支持更符合mongod的数据更新模型。

  传统硬盘通常也是个好的选择,因为使用更昂贵的硬盘来提高随机IO性能并不是那么有效(只能是每次2倍)。使用SSD或增加RAM的容量可能对于提升IO更有效率。

  避免使用远程文件系统

  远程文件存储系统可能对MongoDB造成性能问题。查看远程文件系统了解更多关于MongoDB和存储的信息。

  MongoDB和NUMA硬件

  重要:这里讨论的NUMA仅限于Linux系统,因此不影响运行于其他类Unix系统或Windows系统。

  在运行NUMA的系统中运行MongoDB可能造成一系列问题,包括一段时间内的效率低下和高系统进行使用率。

  当运行MongoDB在NUMA硬件上时,你应该为MongoDB禁用NUMA并使用Interleave内存策略。

  注意:MongoDB 2.0以上版本如果部署在Linux系统上,启动时会检查系统配置,如果系统是基于NUMA的,会给出警告。

  为禁用NUMA并启用interleave内存策略,请使用numactl并使用以下方式启动mongod

  numactl –interleave=all /usr/bin/local/mongod

  然后,为了禁用proc配置中的zone reclaim,请使用以下命令:

  echo 0 > /proc/sys/vm/zone_reclaim_mode

  为了彻底禁用NUMA,你必须操作以上两步。了解更多信息,请查看/proc/sys/vm/*文档。

  查看MySQL“疯狂交换”问题和NUMA效果一文,它描述了NUMA对数据库造成的影响。这篇博客确定了NUMA对MySQL的影响,但对于MongoDB的影响也是类似的。这篇文章介绍了NUMA和它的目标,并指出了为什么这些目标和生产环境数据库的需求是不相容的。

 

  磁盘和存储系统

  虚拟内存

  为你的系统分配虚拟内存。分配虚拟内存可以避免内存争抢问题,同时可以阻止Linux系统的OOM Killer杀死mongod。

  mongod使用的映射内存文件到内存的方法可以确保操作系统从来不会把MongoDB数据放进虚拟内存。

  RAID

  绝大多数MongoDB应该使用RAID-10磁盘系统。

  RAID-5和RAID-6典型情况下不能为MongoDB提供足够好的性能。

  MongoDB应该避免使用RAID-0。RAID-0提供了足够好的写性能,但它只能提供有限的可用性,并且可能导致读操作性能低下,特别是在Amazon EBS卷上。

  远程文件系统

?

  MongoDB不推荐使用网络文件系统(NFS),因为一些版本的NFS性能低下。

  当数据文件和日志文件同时位于NFS上时就会发生性能问题。如果你把日志放到本地或iscsi上则可能得到更好的性能体验。如果必须使用NFS,添加以下NFS选项到你的/etc/fstab文件:bg,nolock及noatime。

  把不同的组件放到不同的存储设备

  为了提高性能,考虑把你的数据库的数据,数据日志和应用日志按照你的应用程序的读写模式放到不同的存储设备上。

  注意:这会影响你创建数据快照的能力。因为文件会在不同的设备和卷上。

  架构

  Write Concern

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/542725.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
NASA 利用 AI 预测太阳风暴,地球可提前半小时应对危机
上一篇 2025年11月9日 16:01:31
快手视频如何上热门_快手视频上热门的技巧与策略
下一篇 2025年11月9日 16:01:33

相关推荐

  • Go语言mgo查询构建:深入理解bson.M与日期范围查询的正确实践

    本文旨在解决go语言mgo库中构建复杂查询时,特别是涉及嵌套`bson.m`和日期范围筛选的常见错误。我们将深入剖析`bson.m`的类型特性,解释为何直接索引`interface{}`会导致“invalid operation”错误,并提供一种推荐的、结构清晰的代码重构方案,以确保查询条件能够正确…

    2026年5月10日
    100
  • Python中怎样使用pymongo?

    在python中使用pymongo可以轻松地与mongodb数据库进行交互。1)安装pymongo:pip install pymongo。2)连接到mongodb:from pymongo import mongoclient; client = mongoclient(‘mongod…

    2026年5月10日
    000
  • .NET中的仓储模式(Repository Pattern)是什么?如何解耦业务逻辑和数据访问?

    仓储模式是.NET中用于分离业务逻辑与数据访问的抽象层,通过定义如IUserRepository接口并结合依赖注入,实现对数据访问的具体技术解耦;业务逻辑仅依赖接口,可通过SqlUserRepository等具体实现操作数据库,而无需知晓底层细节;该模式提升可维护性、支持单元测试、降低耦合,并可配合…

    2026年5月10日
    000
  • 解决Python 3.11环境下Motor库异步协程导入错误的指南

    本文旨在解决在Python 3.11环境中使用Motor库时遇到的`ImportError: cannot import name ‘coroutine’ from ‘asyncio’`错误。该问题通常源于Motor库版本过旧,未能适配Python 3…

    2026年5月10日
    000
  • Discord机器人“禁闭”指令的实现与优化

    本教程详细探讨了Discord机器人中“禁闭”指令(Jail Command)的实现方法与常见问题解决方案。内容涵盖了如何创建和管理“禁闭”角色、正确配置频道权限覆盖以限制用户访问、以及在移除用户角色时如何优雅地处理特殊角色(如@everyone)以避免潜在错误。通过优化代码结构和强化权限检查,旨在…

    2026年5月10日
    000
  • HTML表单如何实现白名单功能?怎样只允许授权用户?

    要实现%ignore_a_1%的白名单功能并确保只有授权用户操作,核心答案是必须依赖后端服务器进行严格的身份认证、会话管理、授权检查和数据验证,前端仅能提供用户体验层面的初步提示而不能保障安全;具体而言,首先通过用户身份认证(如用户名/密码或oauth)确认用户身份,服务器创建会话并返回标识符,后续…

    2026年5月10日
    800
  • 解决 Node.js 连接本地 MongoDB 后程序卡死的问题

    本文旨在帮助开发者解决 Node.js 应用连接本地 MongoDB 数据库时,程序在建立连接后卡死的问题。通过分析可能的原因,并提供相应的解决方案,确保 Node.js 应用能够稳定可靠地与 MongoDB 数据库进行交互。文章将涵盖数据库连接配置、端口冲突、跨平台兼容性等方面,并提供代码示例进行…

    2026年5月10日
    000
  • Node.js Express 服务器启动与常见问题排查

    本教程旨在指导开发者正确初始化和启动 node.js express 服务器,解决服务器无响应或未运行的问题。文章将详细阐述 express 应用的创建、路由定义及端口监听等核心步骤,并针对常见的服务器启动失败、请求体解析错误以及数据持久化等问题提供专业的排查思路和解决方案,确保开发者能顺利构建稳定…

    2026年5月10日
    000
  • MongoDB 动态查询:获取集合中最近N年的数据

    本文详细介绍了如何在 MongoDB 中动态查询集合内最近N年的数据,而非基于当前系统时间。通过利用聚合管道的 $setWindowFields、$sort 和 $limit 等阶段,我们能够智能地识别集合中的最新日期,并以此为基准,灵活地提取指定时间范围内的记录,无需硬编码日期,极大地提升了查询的…

    2026年5月10日
    100
  • Golang结构体标签解析错误怎么办?Golang反射标签使用指南

    Golang结构体标签解析错误怎么办?Golang反射标签使用指南Golang结构体标签解析错误怎么办?Golang反射标签使用指南Golang结构体标签解析错误怎么办?Golang反射标签使用指南Golang结构体标签解析错误怎么办?Golang反射标签使用指南

    golang结构体标签解析错误通常由格式不正确、类型不匹配或反射使用不当引起。首先,确保标签格式正确,键值对用冒号分隔,多个键值对之间用空格分隔;其次,检查字段与标签值的类型是否匹配;再者,使用reflect包正确获取标签值,注意索引范围和字段可导出性;最后,处理可能出现的错误,如标签不存在返回空字…

    2026年5月10日 用户投稿
    000
  • Go mgo 教程:高效存储扁平化 Go 嵌套结构体

    本教程旨在解决使用 `mgo` 库将 Go 语言中的嵌套结构体存储到 MongoDB 时,默认行为导致文档结构出现嵌套的问题。我们将深入探讨如何利用 `bson` 包提供的 `inline` 标签,将嵌入式结构体的字段提升到父级文档中,从而实现扁平化的 MongoDB 文档结构,提升数据存储的直观性…

    2026年5月10日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 使用HTML表单GET方法创建带查询参数的动态搜索链接

    本教程详细阐述了如何在网页中,通过简单地将HTML表单的提交方法从`POST`更改为`GET`,来自动生成包含用户选择搜索条件的动态URL查询参数。这使得搜索结果页面的链接可分享、可收藏,并简化了%ignore_a_1%生成复杂URL的逻辑,后端可直接从URL中解析查询参数进行数据检索。 引言:动态…

    2025年12月23日
    000
  • Web表单提交:如何利用GET方法构建动态查询链接

    本文将指导您如何利用html表单的get方法,根据用户输入的搜索条件动态生成带有查询参数的url。当用户在表单中输入数据并提交时,get方法会自动将表单字段及其值附加到url作为查询字符串,从而创建如`/search?param1=value1&param2=value2`的链接。这对于实现…

    2025年12月23日
    000
  • Node.js中多字段多文件上传与MongoDB路径存储:Multer实践指南

    本教程详细讲解如何在node.js中使用multer处理html表单中的多字段文件上传,并将文件保存到服务器指定目录。核心内容包括multer配置,express路由集成,以及如何在控制器中正确获取上传文件信息并将其存储路径而非文件本身的数据存入mongodb,优化数据库性能和可维护性。 在现代We…

    2025年12月23日
    300
  • Node.js 多字段图片上传与 MongoDB 路径存储实践教程

    本教程详细阐述了如何在 Node.js 环境下,利用 Multer 中间件处理来自 HTML 表单的多个文件字段上传,并将图片分别存储到服务器的不同目录。更重要的是,教程纠正了直接将图片二进制数据存入 MongoDB 的常见误区,转而采用最佳实践——仅在数据库中存储图片的文件路径,从而优化数据库性能…

    2025年12月23日
    000
  • MongoDB/Mongoose中从数组中按ID删除子文档的教程

    本教程详细阐述了如何在mongodb/mongoose环境中,从一个文档的嵌套数组中,根据子文档的_id删除特定对象。我们将利用mongoose自动生成的_id字段和mongodb的$pull操作符,通过构建后端api路由,实现对特定子文档的精确、高效删除,并提供前端集成示例。 在构建复杂的应用程序…

    2025年12月23日
    000
  • 在MongoDB中通过子文档ID删除数组中的对象

    在MongoDB中处理复杂的数据结构时,我们经常会遇到需要在文档内部的数组中存储一系列子文档(或称内嵌文档)的场景。例如,在一个电影数据库中,一部电影文档可能包含一个`references`数组,其中每个元素都是一个描述电影引用的独立对象。当需要删除某个特定引用而非整个电影文档时,就需要一种精确的方…

    2025年12月23日
    000
  • MongoDB中通过子文档ID从数组删除对象的教程

    本教程详细介绍了如何在%ignore_a_1%中,利用mongoose框架从父文档的数组字段中删除特定的子文档。我们将探讨mongodb的`$pull`操作符,并提供完整的服务器端(node.js/express)和客户端(ejs)代码示例,指导你如何通过子文档的`_id`高效地移除数组中的元素,确…

    2025年12月23日
    000
  • 从MongoDB数组中按ID删除内嵌文档的教程

    本教程详细介绍了如何在mongodb中使用mongoose和`$pull`操作符,从一个文档的数组字段中删除特定的内嵌文档。我们将通过一个电影参考数据库的示例,演示如何根据内嵌文档的唯一id(`_id`)来精准定位并移除数组中的元素,确保数据管理的精确性和效率。 在构建数据库应用程序时,经常会遇到需…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信