开发检查清单
以下清单以及操作清单提供的建议可帮助您避免在生产 MongoDB 部署中出现问题。
数据持久性
确保副本集至少包含三个承载数据的有投票权成员,并且写入操作使用
w: majority
写关注(write concern)。要实现副本集范围内的数据持久性,需要三个承载数据的有投票权成员。确保所有实例均使用日志。
模式设计
MongoDB 中的数据具有动态模式。集合不强制执行文档结构。这有利于迭代开发和多态性。然而,集合通常包含具有高度同质结构的文档。有关详细信息,请参阅数据建模。
复制
分片
确保您的分片键将负载均匀地分布在分片上。有关更多信息,请参阅:分片键。
对需要随分片数量扩展的工作负载使用定向操作。
- 除非使用读关注
"available"
(这是与因果一致会话不关联时读取从节点的默认读关注),否则从节点不再返回孤立数据。分片副本集的所有成员都维护数据段元数据,允许它们在不使用"available"
时过滤掉孤立的数据段。因此,未使用 的 非定向查询或广播"available"
查询可以在任何成员上安全地运行,并且不会返回孤立数据。"available"
读关注可能会自从节点返回孤立文档,因为它不会检查更新的数据块元数据。但是,如果孤立文档的返回对应用程序无关紧要,则"available"
读关注可在各种读关注中提供尽可能低的读取延迟。 在将大型数据集插入新的非散列分片集合时,预拆分并手动平衡数据块。预拆分和手动平衡使插入负载能够在分片之间分布,从而提高初始负载的性能。
驱动程序
利用连接池化。大多数 MongoDB 驱动程序都支持连接池化。调整连接池大小以适合您的使用案例,从典型并发数据库请求数的 110-115% 开始。
确保您的应用程序可以在副本集选举期间处理瞬时写入和读取错误。
确保您的应用程序处理失败的请求,并在适用的情况下重试。驱动程序不会自动重试失败的请求。
使用指数退避逻辑进行数据库请求重试。
如果需要限制数据库操作的执行时间,读取时使用
cursor.maxTimeMS()
,写入时使用wtimeout
。