开发检查清单
以下清单以及自管理部署的操作清单提供了建议,可帮助您避免在生产MongoDB 部署中出现问题。
数据持久性
确保副本集至少包含三个承载数据的有投票权成员,并且写入操作使用
w: majority
写关注(write concern)。要实现副本集范围内的数据持久性,需要三个承载数据的有投票权成员。确保所有实例均使用日志。
模式设计
MongoDB 中的数据具有动态模式。集合不强制执行文档结构。这有利于迭代开发和多态性。然而,集合通常包含具有高度同质结构的文档。有关详细信息,请参阅数据建模。
复制
分片
确保您的分片键将负载均匀地分布在分片上。有关更多信息,请参阅:分片键。
对需要随分片数量扩展的工作负载使用定向操作。
- Secondaries no longer return orphaned data unless using read concern
"available"
(which is the default read concern for reads against secondaries when not associated with causally consistent sessions).All members of the shard replica set maintain chunk metadata, allowing them to filter out orphans when not using"available"
. As such, non-targeted or broadcast queries that are not using"available"
can be safely run on any member and will not return orphaned data.The"available"
read concern can return orphaned documents from secondary members since it does not check for updated chunk metadata. However, if the return of orphaned documents is immaterial to an application, the"available"
read concern provides the lowest latency reads possible among the various read concerns. 在将大型数据集插入新的非散列分片集合时,预拆分并手动平衡数据块。预拆分和手动平衡使插入负载能够在分片之间分布,从而提高初始负载的性能。
驱动程序
利用连接池化。大多数 MongoDB 驱动程序都支持连接池化。调整连接池大小以适合您的使用案例,从典型并发数据库请求数的 110-115% 开始。
确保您的应用程序可以在副本集选举期间处理瞬时写入和读取错误。
确保您的应用程序处理失败的请求,并在适用的情况下重试。驱动程序不会自动重试失败的请求。
使用指数退避逻辑进行数据库请求重试。
如果需要限制数据库操作的执行时间,读取时使用
cursor.maxTimeMS()
,写入时使用wtimeout
。