Docs 菜单
Docs 主页
/
MongoDB Atlas
/

使用 MongoDB Atlas 构建弹性应用程序

在此页面上

  • 安装最新驱动程序
  • 连接字符串(Connection Strings)
  • 可重试写入和读取
  • 写关注和读关注
  • 错误处理
  • 测试故障转移
  • 弹性示例应用程序

您可以配置 MongoDB 部署和驱动程序库的功能,以创建能够承受网络中断和故障转移事件的弹性应用程序。要编写能充分利用 MongoDB Atlas 始终在线功能的应用程序代码,应该执行以下任务:

  • 安装最新的驱动程序。

  • 使用 Atlas 提供的连接字符串。

  • 使用可重试写入和可重试读取。

  • 使用对您的应用程序有意义的 majority 写关注和读关注。

  • 处理应用程序中的错误。

首先,从 MongoDB 驱动程序安装您语言的最新驱动程序。驱动程序将查询从应用程序连接并中继到数据库。使用最新的驱动程序可启用最新的 MongoDB 功能。

然后,在应用程序中,导入依赖项:

注意

Atlas 提供了预配置的连接字符串。有关复制预配置字符串的步骤,请参阅Atlas 提供的连接字符串。

使用指定 Atlas 集群中所有节点的连接字符串将应用程序连接到数据库。如果集群执行副本集选举并选出新的主节点,则指定集群中所有节点的连接字符串会发现新的主节点,而无需应用程序逻辑。

您可以使用以下任一种方法指定集群中的所有节点:

连接字符串还可以指定选项,特别是retryWriteswriteConcern。

Atlas 可以使用专用端点服务中的负载均衡器为分片集群生成优化的 SRV 连接字符串。当您使用优化的连接字符串时,Atlas 会限制应用程序与分片集群之间每个mongos的连接数。每个mongos 的受限连接数可提高连接计数高峰期间的性能。

注意

Atlas 不支持在 Google Cloud 或 Azure 上运行的集群的优化连接字符串。

要了解有关为私有端点后的分片集群优化连接字符串的更多信息,请参阅提高私有端点后分片集群的连接性能

如果您从 Atlas 集群界面复制连接字符串,则会为您的集群预先配置连接字符串,使用 DNS 种子列表格式,并包括建议的 retryWritesw(写关注)选项以实现韧性。

要从 Atlas 复制您的连接字符串 URI:

  1. 在 MongoDB Atlas 中您的项目下,从导航面板中选择 Database(数据库)。

  2. 在要连接应用程序的集群上单击 Connect

  3. 选择 Drivers(驱动程序)作为您的连接方法。

  4. 选择 Driver(驱动程序)和 Version(版本)。

  5. 将连接字符串或完整驱动程序示例复制到应用程序代码中。必须提供数据库用户凭证。

    注意

    本指南通过连接字符串使用SCRAM 身份验证。如果您想了解如何使用 X. 509证书进行身份验证,请参阅X. 509 。

使用连接字符串在应用程序中实例化 MongoDB 客户端:

注意

从 MongoDB 版本4开始。 0并使用4 。 2兼容驱动程序,默认情况下,MongoDB 会重试写入和读取一次。

使用可重试写入功能,可在某些写入操作失败时重试一次。如果您从 Atlas 复制了连接字符串,则其中包括"retryWrites=true" 。如果您提供自己的连接字符串,请将"retryWrites=true"作为查询参数。

重试一次写入是处理暂时性网络错误以及在副本集选举期间应用程序暂时无法找到健康主节点的最佳策略。如果重试成功,则整个操作成功,并且不会返回任何错误。如果操作失败,原因可能是:

  • 持久的网络错误

  • 无效的命令

当操作失败时,应用程序需要自行处理错误

在 MongoDB 4版本中,如果读取操作启动失败,则会自动重试一次。 0并使用4 。 2兼容驱动程序。无需其他配置即可重试读取。

可以使用写关注和读关注来调整应用程序的一致性和可用性。更严格的关注意味着数据库操作需要等待更强的数据一致性保证,而宽松的一致性要求则提供更高的可用性。

例子

如果您的应用程序处理货币余额,则一致性极为重要。您可以使用 majority 写关注和读关注来确保您永远不会读取过时的数据或可能回滚的数据。

或者,如果您的应用程序每秒记录来自数百个传感器的温度数据,您可能不会担心自己读取的数据是否包括最新读数。您可以放宽一致性要求,并更快地访问该数据。

您可以通过连接字符串 URI 设置 Atlas 副本集的写关注级别。使用majority写关注确保您的数据成功写入数据库并持久保存。这是推荐的默认值,对于大多数使用案例来说,这是足够的。如果您从 Atlas 复制了连接字符串,则其中包括"w=majority"

当您使用需要确认的写关注(例如 majority)时,您还可以指定写入达到该确认级别的最大时间限制:

  • 所有写入的wtimeoutMS连接字符串参数,或

  • 针对单个写入操作的wtimeout选项。

是否使用时间限制以及使用的值取决于应用程序上下文。

重要

如果未指定写入时间限制且写关注的级别无法实现,写入操作则会无限期挂起。

您可以通过连接字符串 URI 设置 Atlas 副本集的读关注级别。理想的读关注取决于应用程序要求,但默认值对于大多数使用案例来说就足够了。使用默认读关注不需要连接字符串参数。

指定读关注可以提高对应用程序从 Atlas 接收数据的保证。

注意

应用程序使用的写关注和读关注的特定组合会对操作顺序保证产生影响。这称为因果一致性。有关因果一致性保证的更多信息,请参阅因果一致性和读写关注。

无效的命令、网络服务中断以及未经可重试写入处理的网络错误会返回错误。有关错误详情,请参阅驱动程序的 API 文档。

例如,如果应用程序尝试插入包含数据库集合中已使用的 _id 值的文档,您的驱动程序将返回错误,其中包括:

如果没有正确的错误处理,错误可能会阻止您的应用程序处理请求,直到重新启动为止。

应用程序应处理错误,而不会崩溃或产生副作用。在前面的示例中,应用程序在集合中插入了重复的 _id,该应用程序可以按如下方式处理错误:

此示例中的插入操作在第二次调用时会引发“重复键”错误,因为 _id 字段必须是唯一的。捕获错误,通知客户端,应用继续运行。但是,插入操作失败,您可以决定是否向用户显示消息、重试操作或执行其他操作。

您应该始终记录错误。进一步处理错误的常见策略包括:

  • 将错误返回给客户端,并显示错误消息。当您无法解决错误并且需要通知用户动作无法完成时,这是一个很好的策略。

  • 写入备份数据库。当您无法解决错误但又不想冒丢失请求数据的风险时,这是一个很好的策略。

  • 单次默认重试之后重试该操作。如果您可以通过编程方式解决错误原因,请重试,这是一个很好的策略。

您必须为应用程序上下文选择最佳策略。

例子

在重复键错误的示例中,您应该记录错误但不要重试操作,因为它永远不会成功。相反,您可以写入回退数据库并稍后查看该数据库的内容,以确保不会丢失任何信息。用户无需执行任何其他操作,数据就会被记录下来,因此您可以选择不向客户端发送错误消息。

当操作无限期挂起并阻止应用程序执行新操作时,返回错误可能是理想行为。您可以使用maxTimeMS方法对单个操作设置时间限制,如果超过该时间限制,则返回错误供应用程序进行处理。

对每个操作设置的时间限制取决于该操作的上下文。

例子

如果您的应用程序读取并显示 inventory 集合中的简单产品信息,您可以确信这些读取操作只需要一点时间。查询长时间运行表明一直存在网络问题。将该操作的 maxTimeMS 设置为 5000(即 5 秒)意味着,一旦您确信存在网络问题,应用程序就会收到反馈。

本着 混乱测试 的精神 ,Atlas 将自动执行副本集选举,以进行定期维护和某些配置更改。

要检查您的应用程序是否能够以足够的弹性来支持副本集选举,请通过模拟故障转移事件来测试故障转移过程

该示例应用程序汇集了以下建议,以确保针对网络中断和故障转移事件的恢复能力:

  • 使用 Atlas 提供的连接字符串,具有可重试写入、多数写关注和默认读关注。

  • 使用maxTimeMS方法指定操作时间限制。有关如何设置maxTimeMS的说明,请参阅特定的驱动程序文档。

  • 处理重复键和超时的错误。

该应用程序是一个 HTTP API ,允许客户端创建或列出用户记录。它公开一个接受 GET 和 POST 请求的端点 http://localhost:3000 :

方法
端点
说明
GET
/users
users 集合中获取用户名列表。
POST
/users
要求在请求正文中加入 name。将新用户添加到 users 集合。
← Atlas 集群大小调整和层级选择