使用预定义副本集标签进行查询
注意
此功能不适用于 M0
免费集群、 M2
和M5
集群。要详细了解哪些功能不可用,请参阅 Atlas M 0 (自由集群)、M 2和 M 5限制。
Atlas 集群为集群中的不同成员类型配置了预定义的副本集标签。您可以利用这些预定义的副本集标签将查询从特定应用程序定向到特定节点类型、区域和可用区。这些预定义的副本集标签允许您自定义副本集的 读取偏好,从而提高集群的性能和可靠性。
注意
这些预定义的副本集标签与您提供和管理的资源标签有所不同。您无法更改 Atlas 提供的这些副本集标签。
如需在连接字符串中使用预定义的副本集标签并将查询指向特定节点,请使用下列连接字符串选项:
readPreference
readPreferenceTags
readConcernLevel
有关示例,请参阅使用案例和示例。
预定义副本集标签描述
下表描述了 Atlas 提供的预定义副本集标签。
预定义标签名称 | 说明 | 例子 |
---|---|---|
可用性区域 | AWS 可用区 ID、Google Cloud 分区的完全限定名称或 Azure 分区编号。 Azure 仅支持在地区子集中的可用性区域。Atlas 仅为支持可用区域的地区提供 Azure 的预定义可用性区域标签。要了解更多信息,请参阅 Microsoft Azure。 有关每个云提供商可能的 |
|
节点类型 | {"nodeType" : "ANALYTICS"} | |
提供商 | 预配节点的云提供商。 可能的值为:
| {"provider" : "AWS"} |
区域 | {"region" : "US_EAST_2"} | |
工作负载类型 | 预定义副本集标签可在非分析(可选或只读)节点之间均匀分配工作负载。 可能的值为:
| {"workloadType" : "OPERATIONAL"} |
磁盘状态 | {"diskState" : "READY"} |
磁盘状态
下表描述了预定义副本集标记中可能的 diskState
值。
磁盘状态 | 说明 |
---|---|
READY | 仅针对温节点。 您可以运行查询,而不会遇到增加或不可预测的延迟。 |
有关此副本集标签的示例,请参阅减少从节点磁盘升温的影响。
节点类型
下表描述了预定义副本集标记中可能的 nodeType
值。
节点类型 | 说明 |
---|---|
ELECTABLE | |
READ_ONLY | 从只读节点读取。 READ_ONLY 节点对应于集群创建用户界面中的 Read-only nodes for optimal local reads。 |
ANALYTICS |
要了解如何为集群配置可选、只读和分析节点,请参阅配置高可用性和工作负载隔离。
使用案例和示例
考虑以下场景,其中利用预定义的副本集标签将是有益的,并查看相应的示例连接字符串。
注意
使用分析节点隔离工作负载
如果应用程序执行复杂或长期运行的操作,如 ETL 或报告,您可能希望通过专门连接到分析节点,将应用程序的查询与其他运行工作负载隔离开来。
考虑以下连接字符串:
mongodb+srv://<db_username>:<db_password>@foo-q8x1v.mycluster.com/test?readPreference=secondary&readPreferenceTags=nodeType:ANALYTICS&readConcernLevel=local
连接字符串选项按以下顺序显示:
readPreference=secondary
readPreferenceTags=nodeType:ANALYTICS
readConcernLevel=local
secondary
的readPreference选项和{ nodeType : ANALYTICS }
的readPreferenceTag选项将应用程序连接限制为分析节点。
将正常应用程序从节点读取与分析节点隔离
您可能希望将常规应用程序读取与分析节点上的工作负载隔离开来。
考虑以下连接字符串:
mongodb+srv://<db_username>:<db_password>@foo-q8x1v.mycluster.com/test?readPreference=secondary&readPreferenceTags=workloadType:OPERATIONAL&readConcernLevel=local
连接字符串选项按以下顺序显示:
readPreference=secondary
readPreferenceTags=workloadType:OPERATIONAL
readConcernLevel=local
指定选项可防止应用程序从分析节点读取数据。应用程序必须从 operational
或非分析节点读取数据。
为按地理位置分布的应用程序确定本地读取目标
使用预定义的副本集标签将本地读取定位到全球分布式应用程序的特定区域。 在引入这些预定义副本集标签之前,全球分布式应用程序的本地读取依赖于正确计算最近的读取偏好。 借助预定义的副本集标签,指定适当的地理标签并结合nearest
的读取偏好模式可提供更加一致的行为。
以下连接字符串优先连接到 AWS US_EAST_1
区域,然后是 US_EAST_2
区域:
mongodb+srv://<db_username>:<db_password>@foo-q8x1v.mycluster.com/test?readPreference=nearest&readPreferenceTags=provider:AWS,region:US_EAST_1&readPreferenceTags=provider:AWS,region:US_EAST_2&readPreferenceTags=&readConcernLevel=local
连接字符串选项按以下顺序显示:
readPreference=nearest
readPreferenceTags=provider:AWS,region:US_EAST_1
readPreferenceTags=provider:AWS,region:US_EAST_2
readPreferenceTags=
readConcernLevel=local
Atlas 会按照指定的顺序考虑每个读取偏好标签。Atlas 将节点与标签匹配后,会找到与该标签匹配的所有符合条件的节点。然后,Atlas 会忽略以下任何 readPreferenceTags
。
在此示例中,应用程序首先尝试连接 AWS 区域 US_EAST_1
中的节点。如果该区域没有可用的节点,则应用程序将尝试连接 AWS 区域 US_EAST_2
中的节点。
最后一个(空)readPreferenceTags=
提供回退选项。使用空的 readPreferenceTags=
选项,应用程序可以连接到任何可用节点,无论提供商或区域如何。
这些选项有助于确保应用程序连接到最近的地理区域,以减少延迟并提高性能。
注意
您可以根据可用区进一步确定读取目标。
减少从节点磁盘升温的影响
当 Atlas 添加或替换集群中的节点时,它会执行 磁盘预热 默认情况下。在磁盘预热过程中,新创建的存储卷会经历一段IOPS高使用期。 这会减慢针对该节点的读取操作。 因此,在磁盘预热过程中,Atlas 默认隐藏预热节点,使其无法参与任何读操作。
如果您希望新添加或替换的节点立即变为活动和可见状态,则可以选择禁用快速磁盘预热,并使用连接字符串阻止预热节点上的读取操作,如以下示例所示:
mongodb+srv://<db_username>:<db_password>@foo-q8x1v.mycluster.com/test?readPreference=secondary&readPreferenceTags=diskState:READY&readConcernLevel=local
连接字符串选项按以下顺序显示:
readPreference=secondary
readPreferenceTags=diskState:READY
readConcernLevel=local
secondary
的readPreference选项和{ diskState : READY }
的readPreferenceTag选项告诉 Atlas 仅以温节点为目标。
检索可用区
Atlas 默认为可用区提供预定义的副本集标签。 这些标签包括Amazon Web Services可用区域ID 、区域的GCP完全限定名称或Azure区域编号。 您可以使用rs.conf()
shell方法或查看集群节点的最后一次 ping 来检查节点的可用区。
例子
... "tags": { "availabilityZone": "use2-az2", ...
内置自定义写关注
Atlas 为多区域集群提供了内置自定义写关注。写关注描述 MongoDB 为针对集群的写入操作所规定的确认级别。
Atlas 内置自定义写关注可确保您的操作传播到一定数量的区域以取得成功,从而帮助提高数据一致性。
要使用自定义写关注,在操作的写关注文档中指定写关注。
Atlas 为多区域集群提供自定义写关注:
写关注 | 标记 | 说明 |
---|---|---|
twoRegions | { region: 2 } | 写入操作必须由集群中至少两个区域确认。 |
threeRegions | { region: 3 } | 写入操作必须由集群中至少三个区域确认。 |
twoProviders | { provider: 2 } | 写入操作必须由集群中至少两个具有不同云提供商的区域确认。 |
例子
考虑跨三个区域的多区域集群:us-east-1、us-east-2 和 us-west-1。您希望在 Atlas 接受写入操作之前将其传播到集群中的所有三个区域。
以下操作将插入一个文档,并因 { w: "threeRegions" }
写关注对象而要求将该操作传播到所有三个区域:
db.employees.insertOne( { name: "Bob Smith", company: "MongoDB" }, { writeConcern: { w: "threeRegions" } } )