将MongoDB加入到我们的服务支持列表中,是整个团队年初工作计划中的首要任务。但我们感觉如果先添加一项对NoSQL存储的支持,而不是先升级已支持的关系型数据库,可能对用户不太好,毕竟目前的用户都使用关系型数据库。
所以我们决定将引入MongoDB这项工作放到升级MySQL和PostgreSQL之后来做。到目前为止,MySQL 5.5的Beta版已在进行中,而PostgreSQL的9.1 Beta版也将进入流程,因此我们打算在2012年第一季度中应用这两个版本。
由于我们对MongoDB的关注,我们选择性地为几名使用MongoDB的用户提供了技术支持。在这个过程中,我们了解到了很多可能出现问题的地方。所以想借此文与大家分享Engine Yard眼中的MongoDB最佳实践。
如果你的MongoDB是定制化安装的,我们强烈建议你将自己的设置与本文讲到的内容进行对比,并进行必要的设置修改。
通常意义上的NoSQL最佳实践
已有很多文章对NoSQL选型方面进行过讨论。在选择一个数据库产品时,通常可能需要考虑以下因素:读写吞吐量、持久化、一致性以及延迟等。在Nathan Hurst的文章《Visual Guide to NoSQL Systems》中对这些方面都做了详尽的介绍。
数据库的选择是个大问题,本文不打算就这方面深入介绍,但希望读者能够自己去了解这方面的知识。一旦开发者了解得足够多,最后的结论永远都只有一个:没有任何一个数据库能够满足所有的应用场景。本文内容是基于选择MongoDB作为数据库存储上来说的。Engine Yard在这方面提出了如下四点建议。
全面测试。测试一定要使用切合实际场景的数据,并且需要尽量模拟业务场景的数据操作情况。否则,开发者会发现在上线后的实际场景下,可能导致一些性能瓶颈甚至发现整体架构上的设计缺陷。因此,尽可能使用实际场景的操作使用来进行测试,然后收集足够的测试数据。
千万别以为在关系型数据库上的使用方法可以被直接移植。MongoDB并不支持一些关系型数据库的功能,所以开发者最好先搞清楚MongoDB支持哪些功能。为了获得更好的性能,开发者最好多看10gen官方建议的文档设计和操作方法。另外,在使用MongoDB前,建议开发者做好对整个架构进行重构以适用新的存储模型的准备。为了更好地理解数据迁移的代价,建议阅读《The cost ofMigration》一文。
明确数据需要的一致性和可靠性。对MongoDB来说,可靠性不再过度地依赖将数据写入到磁盘的操作,更多的是通过将数据同步到其他节点的方式解决可靠性问题。绝不建议开发者在真实环境中使用没有备份的节点单独工作。这一点很重要,所以建议开发者了解其中的原因。
明确你对EBS的期望。如果你是Engine Yard云平台的用户(AWS EC2),那么应该知道,EBS的性能不太稳定。所以在测试时,你最好收集足够多的EBS设备吞吐数据以做考量。Engine Yard本身并没有对用户在EBS性能上做限制。
MongoDB最佳实践
以下是我们将MongoDB引入到服务支持列表过程中所遵循的原则。
总是使用Replica Sets。Replica Sets通过自动failover机制提供MongoDB的高可用性。在应用中,如primary机器出现故障,那么某一台secondary机器就会通过选举成为新的primary,整个集群仍然能够提供正常服务。我们的服务不会支持无同步机制的MongoDB布置方案。如果在开发者自己的环境中同步机制的代价过高,我们建议其使用一些云存储服务。Engine Yard目前已经与MongoHQ和MongoLab都建立了合作关系。开发者可以在合作者页面找到更多这方面的信息。
保持版本更新。保持版本更新很重要,10gen在每个版本中都会修复一些问题,使MongoDB的运行更出色。比如在2.0.x版本中,MongoDB的存储性能和并发性能就有极大提高,同时还包括索引优化、Bug修复以及compaction命令等一系列改进,以便开发者更方便地扩展其集群。如果你还在使用1.6.3版本,那就快升级吧。
不要在32位系统上使用MongoDB。在32位机器上,MongoDB只能存储约2.5GB的数据。因为MongoDB在内部实现上是通过内存映射的方式来提高性能的,所以在32位机器上其内存地址本身就限制了数据容量。在Engine Yard云服务中使用MongoDB,请使用Large instance来部署MongoDB。在实际产品中,我们也只支持64位的MongoDB。
默认开启journaling日志。MongoDB支持在写操作前记录journaling日志来提高节点的可用性。强烈建议在部署时开启journaling日志。注意数据文件的存放位置。在使用时,请确认你的数据文件处于一个持久化存储中(比如/data/mongodb目录)。也可以使用非持久化的设备进行数据文件存储,不过你最好小心再小心,因为这可能会对你的集群架构造成影响。推荐使用EBS进行MongoDB的数据文件存储。热数据最好能放在内存中。能够保持热数据(以及索引数据)一直放在内存中,这一点非常重要,它将对整个集群的性能造成影响。如果通过监控发现page fault的数量增加,那么很可能就是热数据量超出了可用内存大小。当热数据量超出了可用内存量时,通常有两种解决方法:增加内存和数据分片。建议先增加内存,再考虑通过数据分片的方式解决。
压力过大升级配置。如果机器负载达到65%,那么应该考虑升级机器配置。在日常使用中,最好保持负载低于65%。同时这也对数据恢复和纵向扩展有影响。当需要升级配置时,AWS建议按下面的顺序来做:Large、Extra Large、High Memory 4XL。而在更高配置的机器上,网络延迟也会更小。
分片需谨慎。分片策略会受数据访问特点的影响,所以在进行数据分片前,最好先理清楚数据的访问特点,并想明白是否确实需要分片。分片字段对性能的影响非常大,所以选择一个好的分片字段是非常重要的。Config节点对整个集群的健康运行是至关重要的,所以一旦你选择使用分片机制,就一定要保证有3个Config节点。永远不要删除Config节点的数据,要确保频繁地对这些数据进行日常备份。如果可能,通过域名来指定节点的地址,比如在/etc/hosts文件中指定相应的本地域名,这能让你在集群配置上更灵活。Config节点的压力很小,但还需运行在64位机器上。千万不要把3个Config节点都放在同一台机器上!
另外,如果你要部署一个分片集群,那么可以向Engine Yard专家服务预约咨询服务。
使用Mongo MMS图形化监控服务。如果你还没有完善的MongoDB监控,可以尝试Mongo MMS。Mongo MMS是10gen官方发布的一个监控服务,可以将集群的各项健康指标以图形化的方式汇总展示。
英文原文地址:http://www.nosqlwiki.com/2-mongodb-best-practices
分享到:
相关推荐
Mongodb是主流的NOSQL数据库之一,Mongodb最佳实践,详细介绍了Mongodb使用以及底层原理,和运维管理; 1.Mongodb数据结构,以及存储方式 2.增删改查使用,分页,排序,投影,以及多种扩展使用 3.丰富查询语句,比如...
MongoDB最佳实践是指一系列用于部署和管理MongoDB数据库的高级策略和技术,旨在确保数据库的高效运行、数据安全、以及系统的稳定性和可扩展性。MongoDB是一种高性能、可扩展的分布式文档数据库,广泛用于现代应用...
已经有很多关于 NoSQL 选择的文章了。影响你选择数据库的因素有:读/写操作的吞吐量, 持久性,一致性,延迟性等等。Nathan Hurst 的文章“Visual Guide to NoSQL System” 很好的总结...这篇文章假设你选择了MongoDB。
后端开发包括: 创建和共享数据库连接执行CRUD操作使用MongoDB聚合框架配置/管理数据库客户端处理异常和超时利用MongoDB最佳实践用户功能搜索电影(基本或复杂搜索) 注册为新用户以现有用户身份登录并创建/删除...
MongoDB最佳实践主要涵盖以下几个关键知识点: 1. **选择NoSQL数据库**:MongoDB作为一款流行的NOSQL数据库,因其灵活性、高性能和易扩展性受到许多开发者的青睐。选择NoSQL数据库时,需要考虑的因素包括读写吞吐量...
总的来说,MongoDB最佳实践涵盖了从部署前的准备、角色和职责的分配、确保连续可用性、系统扩展以及安全性的管理等各方面。随着应用需求的不断增长和变化,MongoDB作为一个NoSQL数据库,能够为现代应用提供灵活、可...
本篇文章将深入探讨 MongoDB 的性能最佳实践,旨在帮助你充分利用其潜力。 1. **数据模型设计** - **合适的文档结构**:设计紧凑且逻辑清晰的文档结构,减少嵌套深度和冗余字段,可以提升查询效率。 - **数组与子...
Eslint规则适用于NodeJS 语法和最佳实践。 免责声明:这是一项正在进行的工作。 仅当您希望通过报告错误或发送PR参与此项目的发展时,才使用它。 第一个稳定版本是 。 用法 将eslint安装为开发依赖项: npm ...
#### 五、MongoDB最佳实践 - **数据模型设计**:在设计数据模型时,应考虑数据的访问模式、性能需求等因素,合理选择嵌入式存储或引用式存储。 - **性能优化**:包括合理的索引设计、查询优化、内存和磁盘管理等...
#### 五、MongoDB最佳实践 1. **设计模式**:分享如何合理设计数据模型以适应不同的应用场景。 2. **性能优化**:提供关于提高查询速度、减少磁盘I/O等方面的建议。 3. **备份与恢复**:阐述定期备份数据的重要性,...
### 第十二章:MongoDB最佳实践 作为本书的总结部分,本章汇总了一系列基于作者多年经验积累的最佳实践建议,覆盖了从架构设计到具体编码实现等多个层面,为读者提供了宝贵的参考价值。 综上所述,《Practical ...
#### 六、MongoDB最佳实践与管理技巧 **1.8 MongoDB最佳实践** - **应用场景**: 适用于文档存储、实时数据分析等场景。 - **连接管理**: 使用正确的连接方式连接复制集或分片集群。 **1.9 MongoDB管理技巧** - **...
4. MongoDB最佳实践: - 数据设计:考虑数据的访问模式和查询需求,合理设计数据模型。 - 性能调优:根据系统负载调整硬件资源,优化索引策略,监控并调整内存使用。 - 安全性:启用身份验证,设置防火墙规则,...
三、MongoDB最佳实践 通过PPT,我们可以学习到如何设计高效的数据模型,如何进行正确的索引策略规划,以及如何优化查询性能。这些最佳实践对于日常开发和运维工作至关重要,可以避免常见的性能瓶颈,提高应用程序的...
6. **MongoDB最佳实践**:书中分享了如何优化MongoDB的使用,避免常见误区,如误解其可靠性问题,以及如何利用内嵌文档和数组代替JOIN操作来提高性能。 7. **MongoDB基本概念**:与关系数据库对比,MongoDB有数据库...
阿里云-云数据库MongoDB-最佳实践.pdf
#### 六、MongoDB最佳实践 - **数据设计**:合理设计文档结构,避免过度嵌套,利用参考文档减少数据冗余。 - **性能优化**:合理使用索引,避免全表扫描;适时调整分片策略以适应数据增长。 - **安全性**:启用身份...
阿里云-云数据库MongoDB-最佳实践-D.docx