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