# 开发检查列表

* [数据持久性](https://docs.mongodb.com/v4.2/administration/production-checklist-development/#data-durability)
* [模式设计](https://docs.mongodb.com/v4.2/administration/production-checklist-development/#schema-design)
* [复制](https://docs.mongodb.com/v4.2/administration/production-checklist-development/#replication)
* [分片](https://docs.mongodb.com/v4.2/administration/production-checklist-development/#sharding)
* [驱动](https://docs.mongodb.com/v4.2/administration/production-checklist-development/#drivers)

下面的清单以及[操作清单](https://docs.mongodb.com/v4.2/administration/production-checklist-operations/)列表提供了一些建议，帮助我们在生产环境下，避免MongoDB部署出现中的问题。

## 数据持久性

* 确保您的副本集包含至少三个带有`w:majority` [写关注](https://docs.mongodb.com/v4.2/reference/write-concern/)的数据承载节点。副本集范围内的数据持久性需要三个数据承载节点。
* 确保所有实例都使用[日志](https://docs.mongodb.com/v4.2/core/journaling/)。

## 模式设计

MongoDB中的数据有一个\_动态设计\_。[集合](https://docs.mongodb.com/v4.2/reference/glossary/#term-collection)强制执行[文档](https://docs.mongodb.com/v4.2/reference/glossary/#term-document)结构。这有助于迭代开发和多态性。然而，集合通常保存具有高度同质结构的文档。 有关详细信息，请参阅[数据建模概念](https://docs.mongodb.com/v4.2/core/data-models/)。

* 确定支持查询所需的集合集和所需的索引。除了`_id` 索引之外，您必须显式地创建所有索引：MongoDB不会自动创建除`_id`之外的任何索引。
* 确保模式设计支持您的部署类型：如果您计划使用[分片集群](https://docs.mongodb.com/v4.2/reference/glossary/#term-sharded-cluster)进行水平扩展，请设计您的模式以包含一个强健的片键。片键通过确定MongoDB如何划分数据来影响读写性能。请参见：[片键对集群操作的影响](https://docs.mongodb.com/v4.2/core/sharding-shard-key/)以获取有关片键应具有哪些质量的信息。一旦设置了片键，就不能更改它。
* 请确保您的模式设计不依赖长度不受限制的索引数组。通常，当这种索引数组的元素少于1000个时，可以获得最佳性能。
* 模式架构时请考虑文档大小限制。[BSON文档大小](https://docs.mongodb.com/v4.2/reference/limits/#BSON-Document-Size)限制为每个文档16MB。如果需要更大的文档，请使用[GridFS](https://docs.mongodb.com/v4.2/core/gridfs/)。

## 复制

* 使用奇数个有投票权的成员来确保选举顺利进行。最多可以有7个有投票权的成员。如果您有偶数个投票成员，并且限制条件（如成本）禁止添加另一个辅助成员作为投票成员，则可以添加[仲裁节点](https://docs.mongodb.com/v4.2/reference/glossary/#term-arbiter)以确保票数为奇数。有关对3成员副本集（P-S-a）使用仲裁节点时的其他注意事项，请参阅[副本集仲裁节点](https://docs.mongodb.com/v4.2/core/replica-set-arbiter/)。

**注意**

对于以下MongoDB版本，对于具有仲裁器的副本集，与`pv0`（MongoDB 4.0+中不再支持）相比， `pv1`增加了 [`w:1`](https://docs.mongodb.com/v4.2/reference/write-concern/#writeconcern.) 回滚的可能性：

* MongoDB 3.4.1
* MongoDB 3.4.1
* MongoDB 3.4.0
* MongoDB 3.4.0
* MongoDB 3.2.11 or earlier
* MongoDB 3.2.11 或者更早的版本

参见[副本集协议版本](https://docs.mongodb.com/v4.2/reference/replica-set-protocol-versions/)。

* 通过使用[监视工具](https://docs.mongodb.com/v4.2/administration/monitoring/) 和指定适当的[写入机制,](https://docs.mongodb.com/v4.2/reference/write-concern/)，确保您的辅助文件保持最新。
* 不要使用辅助读取来扩展总体读吞吐量。请参阅：[是否可以使用更多副本节点进行扩展](http://askasya.com/post/canreplicashelpscaling)，以了解读取扩展的概述。有关辅助读取的信息，请参阅：[读取偏好](https://docs.mongodb.com/v4.2/core/read-preference/) 。

## 分片

* 确保片键将负载均匀地分配到分片上。请参见：[片键](https://docs.mongodb.com/v4.2/core/sharding-shard-key/)以获取更多信息。
* 对需要根据切片数量进行扩展的工作负载使用[目标操作](https://docs.mongodb.com/v4.2/core/sharded-cluster-query-router/#sharding-mongos-targeted)。
* **对于MongoDB 3.4和更早版本**，从主节点读取[非目标或广播](https://docs.mongodb.com/v4.2/core/sharded-cluster-query-router/#sharding-mongos-broadcast)查询，因为这些查询可能对[过时或孤立的数据](http://blog.mongodb.org/post/74730554385/background-indexing-on-secondaries-and-orphaned)敏感。
* **对于MongoDB 3.6和更高版本**，辅助设备不再返回孤立数据，除非使用可用的读策略。（这是与因果一致会话不关联时针对辅助设备读取的默认读取策略）

  。

  从 MongoDB 3.6 开始，分片副本集的所有成员都维护块元数据，允许它们在不使用“可用”时过滤出孤立的数据。因此，不使用“可用”的非目标或广播查询可以安全地在任何成员上运行，并且不会返回孤立的数据。

  "可用"的读取策略可以从辅助成员返回孤立文档，因为它不检查更新的块元数据。但是如果孤立文档的返回对于应用程序来说无关紧要，那么"可用"的读取策略提供了各种读取关注点中可能的最低延迟读取。
* 在将大数据集插入新的非哈希分片集合时需要[预分割并手动平衡块](https://docs.mongodb.com/v4.2/tutorial/create-chunks-in-sharded-cluster/)。预分割和手动平衡使插入负载能够在分片之间分布，从而提高初始负载的性能。

## 驱动

* 利用连接池。大多数MongoDB驱动程序支持连接池。调整连接池大小以适合您的用例，从典型并发数据库请求数的110-115%开始。
* 请确保您的应用程序在副本集选择期间处理短暂的写入和读取错误。
* 请确保应用程序处理失败的请求，并在适用的情况下重试。驱动程序**不会**自动重试失败的请求。
* 对数据库请求重试使用指数退避逻辑。
* 如果需要限制数据库操作的执行时间。使用 [`cursor.maxTimeMS()`](https://docs.mongodb.com/v4.2/reference/method/cursor.maxTimeMS/#cursor.maxTimeMS)读取和 [wtimeout ](https://docs.mongodb.com/v4.2/reference/write-concern/#wc-wtimeout)写入。

原文链接：<https://docs.mongodb.com/v4.2/administration/production-checklist-development/>

译者：孔令升

校对：徐扬


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mongoing.com/guan-li/development-checklist.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
