以下清单与操作清单一起
提供了建议,以帮助您避免生产MongoDB部署中出现问题。
数据持久性
- 确保您的副本集至少包括三个具有
w:majority
写关注点的数据承载节点。为了使副本集具有更广泛的数据持久性,需要三个数据承载节点。
- 确保所有实例都使用日记功能。
架构设计
MongoDB中的数据具有动态模式。集合不强制执行文档结构。这有利于迭代开发和多态性。但是,馆藏经常持有具有高度同质结构的文档。有关更多信息,请参见数据建模概念。
- 确定您将需要的集合集以及支持查询所需的索引。除
_id
索引外,您必须显式创建所有索引:MongoDB不会自动创建除以外的任何索引_id
。
- 确保架构设计支持您的部署类型:如果计划使用分片群集进行水平扩展,请设计架构以包括强分片键。分片键通过确定MongoDB如何分区数据来影响读写性能。请参阅:分片密钥对群集操作的影响,
以获取有关分片密钥应具有的质量的信息。一旦设置了分片键,便无法更改。
- 确保您的架构设计不依赖于长度不受限制地增长的索引数组。通常,当此类索引数组的元素数少于1000个时,可以获得最佳性能。
- 设计架构时,请考虑文档大小限制。每个文档的限制为16MB。如果需要更大的文档,请使用GridFS。
BSON Document Size
复制
使用奇数个投票成员以确保选举成功进行。您最多可以有7个投票成员。如果您的投票成员数为偶数,并且诸如成本之类的限制禁止添加其他辅助投票者,则可以添加仲裁程序以确保投票数为奇数。有关将仲裁器用于3成员副本集(PSA)的其他注意事项,请参阅副本集仲裁器。
注意
对于以下版本的MongoDB,
与带有仲裁器的副本集相比(在MongoDB 4.0+中不再支持)pv1
,w:1
回滚的可能性增加了pv0
:
- MongoDB 3.4.1
- MongoDB 3.4.0
- MongoDB 3.2.11或更早版本
请参见副本集协议版本。
通过使用监视工具并指定适当的写入注意事项,确保您的备用服务器保持最新状态
。
不要使用辅助读取来缩放整体读取吞吐量。请参阅:
我可以使用更多副本节点进行缩放以获取读取缩放的概述。有关次要读取的信息,请参阅:
读取首选项。
分片
确保分片密钥在分片上平均分配负载。请参阅:分片键以获取更多信息。
针对
需要随分片数量扩展的工作负载使用目标操作。
对于MongoDB 3.4及更早版本,请从主节点读取
非目标
查询或广播查询,因为这些查询可能对陈旧或孤立的数据敏感。
-
在将大型数据集插入新的非哈希分片集合中时,预分割和手动平衡块。预分割和手动平衡使插入负载可以在各个碎片之间分配,从而提高了初始负载的性能。
驱动程序
- 利用连接池。大多数MongoDB驱动程序都支持连接池。调整连接池的大小以适合您的用例,从并发数据库请求的典型数量的110-115%开始。
- 确保您的应用程序在副本集选择期间处理瞬态写入和读取错误。
- 确保您的应用程序处理失败的请求,然后在适用时重试。驱动程序不会自动重试失败的请求。
- 对数据库请求重试使用指数退避逻辑。
- 使用
cursor.maxTimeMS()
用于读取和wtimeout用于写,如果你需要盖执行时间进行数据库操作。