Atlas 高可用性指导
请参阅此页面,规划适当的集群配置,以优化可用性和性能,同时满足贵公司的成本控制和访问需求。
Atlas 高可用性功能
当您在Atlas中启动新集群时, Atlas会自动配置至少三节点副本集,并将其分发到您部署到的地区。如果主节点 (primary node in the replica set)节点出现中断, MongoDB 数据库会自动检测到此故障并选择一个从节点(secondary node from replica set)作为替代节点,并将该从节点(secondary node from replica set)提升为新的主节点 (primary node in the replica set)。然后, Atlas会恢复或替换出现故障的成员,以确保集群尽快恢复到其目标配置。MongoDB客户端驾驶员还会自动切换所有客户端连接。整个选择和故障转移进程在几秒钟内完成,无需人工干预。MongoDB优化了用于检测故障和选举新主主节点 (primary node in the replica set)的算法,从而缩短了故障转移间隔。
您在单个地区内部署的集群分布在该区地区的各个可用区,因此可以承受部分地区中断的情况,而不会中断读取或写入可用性。
如果始终在首选地区中维持写入操作是高优先级,MongoDB建议在部署集群时,使至少两名可选举成员位于首选地区内的至少两个可用区内。
为了在全球部署中获得最佳数据库性能,用户可以配置Atlas全球集群,该集群使用位置感知的分片来最大限度地减少写入延迟。如果您有地理存储要求,还可以确保Atlas将数据存储在特定的地理区域。
关于 Atlas 高可用性的建议
单区域推荐的部署拓扑结构
单区域,3 节点副本集/分片(主节点、从节点、从节点)
如果需要低延迟,但高可用性要求仅限于单个区域,则此拓扑结构是合适的。此拓扑结构可以容忍任何 1 节点故障,并且能够轻松满足区域内从节点的大多数写关注。这将在任何节点发生故障时在首选区域保持主节点,限制成本,并且从应用程序体系结构的角度来看是最简单的。在您首选的区域中,此拓扑中的从节点读取和写入操作会遇到低延迟。
但是,此拓扑结构不能容忍区域服务中断。
高可用性和恢复的推荐配置
使用以下建议来配置Atlas部署和备份,以实现高可用性并加快从灾难中恢复。
要学习;了解有关如何规划和响应灾难的更多信息,请参阅Atlas灾难恢复指南。
选择适合您部署目标的部署类型和集群层
创建新集群时,您可以在“专用”、“灵活”或“免费”部署类型下提供的范围集群层之间进行选择。
要确定适合您的应用程序大小的推荐集群层,请参阅Atlas集群大小指南 。
使用奇数个副本集成员并测试故障转移
要选出主节点,您需要大多数有投票权的可用副本集成员。我们建议您创建一个具有奇数个有投票权的副本集成员的副本集。拥有偶数个有投票权的副本集成员没有任何好处。默认情况下,Atlas 满足此要求,因为 Atlas 要求拥有 3、5 或 7 个节点。
容错能力是指在有足够的副本集成员仍可用于主节点选举的情况下,允许多少副本集成员不可用。四节点副本集的容错能力与三节点副本集相同,因为两者都能承受单节点服务中断。
要测试您的应用程序是否可以处理副本集主节点 (primary node in the replica set)的故障,提交测试主节点 (primary node in the replica set)故障转移的请求。当Atlas模拟故障转移事件时, Atlas会关闭当前主节点 (primary node in the replica set)并举行选举以选出新的主节点 (primary node in the replica set)。
将数据分发到不同可用区的至少三个数据中心
MongoDB通过跨副本集存储多个数据副本来提供高可用性。为确保同一副本集的成员不股票相同的资源,并且副本集可以在数据中心不可用时选择主节点 (primary node in the replica set),必须将节点分布在至少三个数据中心。我们建议您至少使用五个数据中心。
您可以将集群部署到支持多个可用区的地区,从而跨多个数据中心分发数据。每个可用区通常包含一个或多个独立的数据中心,每个数据中心都有冗余电源、网络和连接,并且通常位于单独的设施中。当您将专用集群部署到支持可用区的地区时, Atlas会自动将集群的节点拆分到可用区。示例,对于部署到具有三个可用区的地区的三节点副本集集群, Atlas会在每个区域中部署一个节点。这样可以确保同一副本集的成员不会共享资源,这样即使一个区域出现中断,您的数据库仍然可用。
要了解使用少于三个数据中心的相关风险,请考虑下图,其中显示了分布式在两个数据中心的数据:

在上一图表中,如果数据中心 2 变得不可用,大多数副本集成员仍然可用,Atlas 可以选举一个主节点。然而,如果丢失数据中心 1,则三个副本集成员中只有一个可用,而不是大多数,系统将降级为只读模式。
考虑下图,其中显示了部署到具有三个可用区的地区的五节点副本集集群:
上图中的 2-2-1拓扑结构是我们推荐的拓扑结构,用于平衡多个区域的高可用性、性能和费用。在这种拓扑结构中,如果任何一个数据中心发生故障,大多数副本集节点仍然可用, Atlas可以执行自动故障转移。虽然三节点三区域拓扑结构也可以容忍任何单区域故障,但 1-1-1拓扑结构中的任何故障转移事件都会迫使在不同地区中选举新的主节点 (primary node in the replica set)。 2-2-1拓扑结构可以容忍主节点 (primary node in the replica set)节点故障,同时将新的主节点 (primary node in the replica set)保持在首选地区中。
我们建议您将副本集部署到以下区域,因为它们支持至少三个可用区:
推荐的 AWS 区域
AWS 区域 | 地点 | Atlas 区域 |
---|---|---|
| 美国北弗吉尼亚州 |
|
| 美国俄勒冈州 |
|
| 加拿大魁北克省蒙特利尔 |
|
| Calgary, Canada |
|
| Ohio, USA |
|
| 巴西圣保罗 |
|
AWS 区域 | 地点 | Atlas 区域 |
---|---|---|
| 新加坡 |
|
| 澳大利亚新南威尔士州悉尼 |
|
| Jakarta, Indonesia |
|
| 印度孟买 |
|
| 中国香港 |
|
| Tokyo, Japan |
|
| Seoul, South Korea |
|
| 日本大阪 |
|
| Hyderabad, India |
|
| 澳大利亚维多利亚州墨尔本 |
|
AWS 区域 | 地点 | Atlas 区域 |
---|---|---|
| 爱尔兰 |
|
| 德国法兰克福 |
|
| 瑞典斯德哥尔摩 |
|
| 英国英格兰伦敦 |
|
| 法国巴黎 |
|
| 意大利米兰 |
|
| 苏黎世瑞士 |
|
| 西班牙 |
|
AWS 区域 | 地点 | Atlas 区域 |
---|---|---|
| 巴林 |
|
| 南非开普敦 |
|
| Tel Aviv, Israel |
|
| 阿联酋 |
|
推荐的Azure区域
Azure 区域 | 地点 | Atlas 区域 |
---|---|---|
| Iowa, USA |
|
| 弗吉尼亚州(美国东部) |
|
| Virginia, USA |
|
| Illinois, USA |
|
| 美国加利福尼亚州 |
|
| 美国华盛顿州 |
|
| Arizona, USA |
|
| Texas, USA |
|
| 巴西圣保罗 |
|
| Rio de Janeiro, Brazil |
|
| 加拿大安大略省多伦多 |
|
Azure 区域 | 地点 | Atlas 区域 |
---|---|---|
| 爱尔兰 |
|
| 荷兰 |
|
| 英国英格兰伦敦 |
|
| 法国巴黎 |
|
| 意大利米兰 |
|
| 德国法兰克福 |
|
| 波兰华沙 |
|
| 苏黎世瑞士 |
|
| 挪威奥斯陆 |
|
| 瑞典耶夫勒 |
|
Azure 区域 | 地点 | Atlas 区域 |
---|---|---|
| 中国香港 |
|
| 新加坡 |
|
| 澳大利亚新南威尔士州 |
|
| 浦那(印度中部) |
|
| Tokyo, Japan |
|
| Seoul, South Korea |
|
Azure 区域 | 地点 | Atlas 区域 |
---|---|---|
| 南非约翰内斯堡 |
|
Azure 区域 | 地点 | Atlas 区域 |
---|---|---|
| Dubai, UAE |
|
| Qatar |
|
| 以色列 |
|
推荐的Google Cloud Platform地区
GCP地区 | 地点 | Atlas 区域 |
---|---|---|
| Iowa, USA |
|
| 美国北弗吉尼亚州 |
|
| 美国俄亥俄州哥伦布 |
|
| 加拿大蒙特利尔 |
|
| 加拿大多伦多 |
|
| 巴西圣保罗 |
|
| 智利圣地亚哥 |
|
| 美国俄勒冈州 |
|
| Los Angeles, CA, USA |
|
| 美国犹他州盐湖城 |
|
| Las Vegas, NV, USA |
|
| Dallas, TX, USA |
|
GCP地区 | 地点 | Atlas 区域 |
---|---|---|
| 台湾 |
|
| 中国香港 |
|
| Tokyo, Japan |
|
| 日本大阪 |
|
| Seoul, Korea |
|
| 新加坡 |
|
| 印度孟买 |
|
| 德里,印度 |
|
| 澳大利亚悉尼 |
|
| 墨尔本,澳大利亚 |
|
| Jakarta, Indonesia |
|
GCP地区 | 地点 | Atlas 区域 |
---|---|---|
| 比利时 |
|
| 芬兰 |
|
| London, UK |
|
| 德国法兰克福 |
|
| 荷兰 |
|
| 苏黎世瑞士 |
|
| 德国柏林 |
|
| 波兰华沙 |
|
| 意大利米兰 |
|
| 法国巴黎 |
|
| 意大利都灵 |
|
| 西班牙马德里 |
|
GCP地区 | 地点 | Atlas 区域 |
---|---|---|
| Tel Aviv, Israel |
|
| Doha, Qatar |
|
| 达曼,沙特阿拉伯 |
|
对分片集群使用 mongos
冗余
当客户端连接到分片集群时,我们建议在连接 URI 中包含多个 mongos 进程,使用逗号分隔。要了解更多信息,请参阅 MongoDB 连接字符串示例。此设置允许操作路由到不同的 mongos
实例以实现负载均衡,同时对灾难恢复也至关重要。
考虑下图,其中显示了分布在三个数据中心的分片集群。应用程序从远程位置连接到集群。如果数据中心 3 不可用,应用程序仍可连接到其他数据中心的 mongos
进程。

使用 majority
写关注
MongoDB允许您使用写关注(write concern)写入操作请求的确认级别。示例,如果您有一个写关注(write concern)为majority
的三节点副本集,则每个写入操作都需要在两个节点上持久化,然后才能将完成确认发送到发出所述写入操作的驾驶员。为了获得最佳保护,防止区域节点中断,我们建议您设立写关注(write concern)为majority
。
尽管与写关注(write concern)1
相比,使用 majority
写关注(write concern)会增加写入延迟,但我们建议您使用 majority
写关注(write concern),因为它允许您的数据中心继续执行写入操作,即使副本集丢失主节点 (primary node in the replica set)。
要了解使用 majority
写关注(write concern)相对于数字写关注(write concern)的优势,请考虑一个具有 2-2-1拓扑结构副本集,其数字写关注(write concern)为 4
。如果其中一个双节点区域不可用,写入操作无法完成,因为它们无法在四个节点上持久保存数据。使用 majority
将允许写入操作在至少两个节点上持久保存数据时继续,从而保持数据冗余和写入连续性。
考虑备份配置
频繁的数据备份对于业务连续性和灾难恢复至关重要。频繁备份可确保在灾难或网络攻击破坏正常操作时,数据丢失和停机时间被降到最低。
我们建议您:
设置备份频率,以满足所需的业务连续性目标。某些系统可能需要连续备份,而其他系统可能更适合较不频繁的快照备份。
将备份存储在与源数据不同的物理位置。
测试备份恢复进程,确保您可以可重复且及时的方式恢复备份。
请确认您的集群在恢复过程中运行相同的 MongoDB 版本以确保兼容性。
配置备份合规策略以防止删除备份快照、防止缩短快照保留时间等。
有关更多备份建议,请参阅 Atlas 备份指导。
规划资源利用
为避免资源容量问题,我们建议您监控资源利用率并定期举行容量规划会议。MongoDB专业服务提供这些课程。
过度使用的集群可能会失败,从而导致灾难。如果利用率定期处于稳定状态(例如系统 CPU 和系统内存的利用率超过 60%+),请将集群扩展到更高的层级。
要查看资源利用率,请参阅监控实时性能。要使用Atlas Administration API查看指标,请参阅 监控和日志。
要了解资源利用警报和监控的最佳实践,请参阅 Atlas 监控和警报指导。
如果您遇到资源容量问题,请参阅资源容量问题。
规划MongoDB版本变更和维护
我们建议您运行最新的 MongoDB 版本,因为与以前的版本相比,它允许您利用新功能并提供改进的安全保证。
确保在当前版本生命周期结束之前执行MongoDB主要版本升级。
您无法使用Atlas用户界面降级MongoDB版本。因此,在计划和执行主要版本升级时,我们建议您直接与MongoDB专业或技术服务部门合作,以帮助您避免在升级进程中可能出现的任何问题。
配置维护Windows
MongoDB允许您为集群配置维护窗口,该窗口设置了Atlas开始对集群进行每周维护的时间。通过设置自定义维护窗口,您可以在业务关键时间之外安排维护,这需要每个副本集至少进行一次副本集选举。
您还可以为项目设立受保护的时间,这定义了每天无法开始标准更新的时间窗口。标准更新不涉及集群重启或重新同步。
自动化示例:Atlas 高可用性
以下示例使用Atlas 工具配置单区域 3 节点副本集/分片部署拓扑结构以实现自动化。
这些示例还应用其他推荐的配置,包括:
注意
在使用 Atlas CLI 创建资源之前,您必须:
为每个项目创建一个部署
对于您的开发和测试环境,请为每个项目运行以下命令。更改 ID 和名称以使用您的值:
atlas clusters create CustomerPortalDev \ --projectId 56fd11f25f23b33ef4c2a331 \ --region EASTERN_US \ --members 3 \ --tier M10 \ --provider GCP \ --mdbVersion 8.0 \ --diskSizeGB 30 \ --tag bu=ConsumerProducts \ --tag teamName=TeamA \ --tag appName=ProductManagementApp \ --tag env=Production \ --tag version=8.0 \ --tag email=marissa@acme.com \ --watch
对于您的暂存环境和生产环境,请为每个项目创建以下 cluster.json
文件。更改 ID 和名称以使用您自己的值:
{ "clusterType": "REPLICASET", "links": [], "name": "CustomerPortalProd", "mongoDBMajorVersion": "8.0", "replicationSpecs": [ { "numShards": 1, "regionConfigs": [ { "electableSpecs": { "instanceSize": "M30", "nodeCount": 3 }, "priority": 7, "providerName": "GCP", "regionName": "EASTERN_US", "analyticsSpecs": { "nodeCount": 0, "instanceSize": "M30" }, "autoScaling": { "compute": { "enabled": false, "scaleDownEnabled": false }, "diskGB": { "enabled": false } }, "readOnlySpecs": { "nodeCount": 0, "instanceSize": "M30" } } ], "zoneName": "Zone 1" } ], "tag" : [{ "bu": "ConsumerProducts", "teamName": "TeamA", "appName": "ProductManagementApp", "env": "Production", "version": "8.0", "email": "marissa@acme.com" }] }
在您创建 cluster.json
文件后,请为每个项目运行以下命令。该命令使用 cluster.json
文件来创建一个集群。
atlas cluster create --projectId 5e2211c17a3e5a48f5497de3 --file cluster.json
有关此示例的更多配置选项和信息,请参阅 Atlas 集群创建。
注意
在使用 Terraform 创建资源之前,您必须:
创建您的付款组织并为该付款组织创建一个 API 密钥。请在终端中运行以下命令,将您的 API 密钥存储为环境变量:
export MONGODB_ATLAS_PUBLIC_KEY="<insert your public key here>" export MONGODB_ATLAS_PRIVATE_KEY="<insert your private key here>"
创建项目和部署
对于您的开发和测试环境,请为每个应用程序和环境对创建以下文件。将每个应用程序和环境对的文件放在各自的目录中。更改 ID 和名称以使用您的值:
main.tf
# Create a Project resource "mongodbatlas_project" "atlas-project" { org_id = var.atlas_org_id name = var.atlas_project_name } # Create an Atlas Advanced Cluster resource "mongodbatlas_advanced_cluster" "atlas-cluster" { project_id = mongodbatlas_project.atlas-project.id name = "ClusterPortalDev" cluster_type = "REPLICASET" mongo_db_major_version = var.mongodb_version replication_specs { region_configs { electable_specs { instance_size = var.cluster_instance_size_name node_count = 3 } priority = 7 provider_name = var.cloud_provider region_name = var.atlas_region } } tags { key = "BU" value = "ConsumerProducts" } tags { key = "TeamName" value = "TeamA" } tags { key = "AppName" value = "ProductManagementApp" } tags { key = "Env" value = "Test" } tags { key = "Version" value = "8.0" } tags { key = "Email" value = "marissa@acme.com" } } # Outputs to Display output "atlas_cluster_connection_string" { value = mongodbatlas_advanced_cluster.atlas-cluster.connection_strings.0.standard_srv } output "project_name" { value = mongodbatlas_project.atlas-project.name }
variables.tf
# Atlas Organization ID variable "atlas_org_id" { type = string description = "Atlas Organization ID" } # Atlas Project Name variable "atlas_project_name" { type = string description = "Atlas Project Name" } # Atlas Project Environment variable "environment" { type = string description = "The environment to be built" } # Cluster Instance Size Name variable "cluster_instance_size_name" { type = string description = "Cluster instance size name" } # Cloud Provider to Host Atlas Cluster variable "cloud_provider" { type = string description = "AWS or GCP or Azure" } # Atlas Region variable "atlas_region" { type = string description = "Atlas region where resources will be created" } # MongoDB Version variable "mongodb_version" { type = string description = "MongoDB Version" } # Atlas Group Name variable "atlas_group_name" { type = string description = "Atlas Group Name" }
terraform.tfvars
atlas_org_id = "32b6e34b3d91647abb20e7b8" atlas_project_name = "Customer Portal - Dev" environment = "dev" cluster_instance_size_name = "M10" cloud_provider = "AWS" atlas_region = "US_WEST_2" mongodb_version = "8.0"
provider.tf
# Define the MongoDB Atlas Provider terraform { required_providers { mongodbatlas = { source = "mongodb/mongodbatlas" } } required_version = ">= 0.13" }
在您创建文件后,导航到每个应用程序和环境对的目录,并运行以下命令以初始化 Terraform:
terraform init
运行以下命令以查看 Terraform 计划:
terraform plan
运行以下命令,为应用程序和环境对创建一个项目和一个部署。该命令使用文件和 MongoDB & HashiCorp Terraform 来创建项目和集群:
terraform apply
当出现提示时,输入 yes
并按 Enter
以应用配置。
对于您的暂存环境和生产环境,请为每个应用程序和环境对创建以下文件。将每个应用程序和环境对的文件放在各自的目录中。更改 ID 和名称以使用您自己的值:
main.tf
# Create a Group to Assign to Project resource "mongodbatlas_team" "project_group" { org_id = var.atlas_org_id name = var.atlas_group_name usernames = [ "user1@example.com", "user2@example.com" ] } # Create a Project resource "mongodbatlas_project" "atlas-project" { org_id = var.atlas_org_id name = var.atlas_project_name # Assign the Project the Group with Specific Roles team_id = mongodbatlas_team.project_group.team_id role_names = ["GROUP_READ_ONLY", "GROUP_CLUSTER_MANAGER"] } # Create an Atlas Advanced Cluster resource "mongodbatlas_advanced_cluster" "atlas-cluster" { project_id = mongodbatlas_project.atlas-project.id name = "ClusterPortalProd" cluster_type = "REPLICASET" mongo_db_major_version = var.mongodb_version replication_specs { region_configs { electable_specs { instance_size = var.cluster_instance_size_name node_count = 3 } priority = 7 provider_name = var.cloud_provider region_name = var.atlas_region } } tags { key = "BU" value = "ConsumerProducts" } tags { key = "TeamName" value = "TeamA" } tags { key = "AppName" value = "ProductManagementApp" } tags { key = "Env" value = "Production" } tags { key = "Version" value = "8.0" } tags { key = "Email" value = "marissa@acme.com" } } # Outputs to Display output "atlas_cluster_connection_string" { value = mongodbatlas_advanced_cluster.atlas-cluster.connection_strings.0.standard_srv } output "project_name" { value = mongodbatlas_project.atlas-project.name }
variables.tf
# Atlas Organization ID variable "atlas_org_id" { type = string description = "Atlas Organization ID" } # Atlas Project Name variable "atlas_project_name" { type = string description = "Atlas Project Name" } # Atlas Project Environment variable "environment" { type = string description = "The environment to be built" } # Cluster Instance Size Name variable "cluster_instance_size_name" { type = string description = "Cluster instance size name" } # Cloud Provider to Host Atlas Cluster variable "cloud_provider" { type = string description = "AWS or GCP or Azure" } # Atlas Region variable "atlas_region" { type = string description = "Atlas region where resources will be created" } # MongoDB Version variable "mongodb_version" { type = string description = "MongoDB Version" } # Atlas Group Name variable "atlas_group_name" { type = string description = "Atlas Group Name" }
terraform.tfvars
atlas_org_id = "32b6e34b3d91647abb20e7b8" atlas_project_name = "Customer Portal - Prod" environment = "prod" cluster_instance_size_name = "M30" cloud_provider = "AWS" atlas_region = "US_WEST_2" mongodb_version = "8.0" atlas_group_name = "Atlas Group"
provider.tf
# Define the MongoDB Atlas Provider terraform { required_providers { mongodbatlas = { source = "mongodb/mongodbatlas" } } required_version = ">= 0.13" }
在您创建文件后,导航到每个应用程序和环境对的目录,并运行以下命令以初始化 Terraform:
terraform init
运行以下命令以查看 Terraform 计划:
terraform plan
运行以下命令,为应用程序和环境对创建一个项目和一个部署。该命令使用文件和 MongoDB & HashiCorp Terraform 来创建项目和集群:
terraform apply
当出现提示时,输入 yes
并按 Enter
以应用配置。
有关此示例的更多配置选项和信息,请参阅 MongoDB & HashiCorp Terraform 和 MongoDB Terraform 博客文章。