Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/ /
Atlas 架构中心
/

Atlas 可扩展性指导

自动扩展使集群能够根据实时使用情况自动调整其层级、存储容量或同时调整两者。Atlas 会分析 CPU 和内存利用率,以确定何时以及是否要扩展或缩减集群层。请参阅 集群层扩展,以了解 Atlas 在何种情况下会扩扩展或缩减集群节点。您还可以指定集群可自动扩展到的最大和最小集群大小范围,以保证最低性能或控制费用。如果新 Atlas 层级超出您指定的大小范围或内存使用量超出新层级的容量,Atlas 将不会扩展集群。自动伸缩会延迟扩展或缩减集群层,以确保自动伸缩不会对应用程序造成任何影响。因此,它最适合稳定增长或下降的应用程序负载,而不是突然激增导致数据库使用量过大的情况。如果工作负载经常出现峰值,或者预计流量会因活动或发布而大幅增加,MongoDB 建议您以编程方式进行预扩展。

正如 推荐部署拓扑结构所述,Atlas 部署模板为您提供垂直与水平扩展选项。具体来说,分片可将数据分布到多台机器上,这在没有一台服务器能处理工作负载时非常有用。分片遵循无共享架构,这是一种分布式计算架构,其中节点之间不共享任何资源。请参阅选择分片键,了解有关理想分片键选择的更多信息,它可让 MongoDB 在整个集群中均匀分发文档,同时方便常见的查询模式。此外,请参阅 Performance 最佳实践:分片,了解关键的分片策略,例如范围分片、哈希分片和区域分片。

可通过Atlas控制平面 GUI、 Atlas Administration API或 IaC 工具(例如Atlas Kubernetes Operator、 MongoDB和 HashiCorp Terraform 或Atlas CLI )将Atlas 集群升级到下一个可用的Atlas层级。请参阅Atlas自动化基础架构预配指南以学习;了解更多信息。更改Atlas层级(无论是升级还是缩减)都可以实现零停机。层级以滚动方式更改,其中包括选举一个从从节点(secondary node from replica set)作为替代节点,将该从从节点(secondary node from replica set)提升为新的主节点 (primary node in the replica set),然后恢复或替换故障节点以确保集群尽快返回到其目标配置。横向扩展根据管理员动作在部署后发生,可以通过编程脚本触发。某些集群模板需要分片的集群。从MongoDB版本8.0 开始,您可以利用嵌入式配置服务器来降低与小型分片的集群上的配置服务器相关的成本。

Atlas 中的低 CPU 选项有助于那些需要更多内存但不需要太多处理能力的应用程序。与相同集群大小的常规层级相比,此可为实例提供一半的 vCPU,从而降低内存密集型但不依赖 CPU 的工作负载的成本。

数据分层和存档允许您在低成本存储中存档数据,同时仍然支持与实时集群数据一起进行查询,这对于长期记录保留特别有用。为了优化此进程, MongoDB建议使用简单、可配置的规则自动进行数据存档。请参阅存档数据,详细学习;了解可在存档规则中指定的条件。对于数据保留不是优先级的场景, Atlas提供了根据日期条件自动删除未使用数据的选项。对于不常访问的数据, TTL索引是特殊的单字段索引,会在指定时间段后或在设立的时钟时间自动从集合中删除文档。这对于日志、会话信息或事件数据等只需在有限时间内保留的数据特别有用。要创建TTL索引,您可以在保存日期值的字段上定义索引,并指定生存时间(以秒为单位)。

Atlas还为您提供了Performance Advisor等自动化工具,通过添加或删除索引或更改客户端的查询结构来识别和优化低效查询。您可以遵循性能优化顾问的可行建议来提高查询性能,从而减少不必要的计算时间和资源消耗。此外,您还可以利用Atlas提供的智能索引建议,进一步提高数据检索效率,最大限度地减少数据库操作所需的资源。

仅应用于单个地区中的部署的建议

对于单区域部署,重点关注可优化单个云地区内性能的垂直扩展策略:

  • 为计算和存储启用自动伸缩,以处理逐渐增加的流量,而无需人工干预。

  • 当您的数据集超过单个服务器的容量(即使在单个地区内)时,请使用分片在多个分片之间分配负载。

  • 对于不需要高处理能力的内存密集型工作负载,请考虑使用低 CPU实例选项。

  • 对历史数据实施数据分层和存档,以降低存储成本,同时保持查询功能。

  • 使用Performance Advisor监控查询性能并实现推荐的索引以优化资源利用率。

  • 在预期的流量峰值之前预伸缩集群,而不是仅仅依靠自动伸缩来应对负载的突然增加。

仅应用于跨多个区域或多个云提供商的部署的建议

对于多区域和多云部署,实现考虑地理分布和跨云复杂性的扩展策略:

  • 在距离用户最近的地区配置只读副本,以减少延迟并按地理位置分配读取工作负载。

  • 使用区域分片根据地理或逻辑边界对数据进行分区,确保数据局部性和合合规要求。

  • 实施具有本地读写功能的全球集群,以优化跨区域性能,同时保持数据一致性。

  • 监控区域之间的网络延迟并调整副本优先级,以确保最佳的故障转移行为。

  • 在跨多个区域实施自动伸缩时,请考虑跨区域数据传输成本的影响。

  • 根据区域使用模式和费用优化策略,在不同区域使用不同的集群层。

  • 实施针对特定区域的备份和存档策略,以符合数据驻留要求。

以下建议应用于所有部署范例。

对于开发和测试环境,请勿启用自动伸缩计算和自动伸缩存储。这可以节省您在非生产环境中的成本。

对于测试和生产环境,我们建议您:

  • 在应用程序从小型到中型有机增长的实例中,为计算和存储启用自动伸缩功能。

    如果您使用 IaC 工具,请利用设置忽略自动伸缩造成的资源漂移。示例,在 Terraform 中,如果disk_gb_enabled 为 true,则Atlas将自动扩展和缩小磁盘大小。这将导致返回的 值可能与disk_size_gb Terraform 配置中指定的值不同,如果随后应用计划而没有注意到这一点,Terraform 会将集群磁盘大小扩展回原始 值。为防止这种情况,应使用生命周期自定义项,即:disk_size_gb lifecycle { ignore_changes = [disk_size_gb] }

    同样,在 Terraform 中,如果 compute_enabled 为 true,则 Atlas 将自动扩展到提供的最大值,并缩减到提供的最小值。这将导致返回的 provider_instance_size_name 值可能与 Terraform 配置中指定的值不同,如果随后应用计划而未注意到这一点,Terraform 将会把集群扩展回原始的 instanceSizeName 值。为了防止这种情况,应使用生命周期定制,即:lifecycle { ignore_changes = [provider_instance_size_name] }

提示

以下示例支持使用 Atlas自动化工具自动扩展计算和存储。

这些示例还应用其他推荐的配置,包括:

  • 集群层已为开发/测试环境设置为 M10。使用集群大小指南了解适合应用程序大小的推荐集群层。

  • 单区域,3 节点副本集/分片部署拓扑结构。

我们的示例交替使用 AWSAzure 和 Google Cloud。您可以选择使用这三家云提供商中的任意一家,但需将区域名称调整为与所选云提供商相匹配的名称。要了解云提供商及其区域,请参阅云提供商。

  • 集群层已设置为 M30,适用于中型应用程序。使用集群大小指南了解适合应用程序大小的推荐集群层。

  • 单区域,3 节点副本集/分片部署拓扑结构。

我们的示例交替使用 AWSAzure 和 Google Cloud。您可以选择使用这三家云提供商中的任意一家,但需将区域名称调整为与所选云提供商相匹配的名称。要了解云提供商及其区域,请参阅云提供商。

注意

在使用 Atlas CLI 创建资源之前,您必须:

对于您的开发和测试环境,为节省成本,已禁用自动扩展计算和存储。

对于您的暂存环境和生产环境,请为每个项目创建以下 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": true,
"scaleDownEnabled": true
},
"diskGB": {
"enabled": true
}
},
"readOnlySpecs": {
"nodeCount": 0,
"instanceSize": "M30"
}
}
],
"zoneName": "Zone 1"
}
]
}

在您创建 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>"
  • 安装 Terraform

对于您的开发和测试环境,为节省成本,已禁用自动扩展计算和存储。

对于您的预发布环境和生产环境,请为每个应用程序和环境对创建以下文件。将每个应用程序和环境对的文件放在各自的目录中。更改 ID、名称和磁盘大小,以使用自己的值。

# 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
teams {
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 }

注意

要创建多区域集群,请在自己的 region_configs对象中指定每个地区,并将它们嵌套在 replication_specs对象中,如以下示例所示:

replication_specs {
region_configs {
electable_specs {
instance_size = "M10"
node_count = 2
}
provider_name = "GCP"
priority = 7
region_name = "NORTH_AMERICA_NORTHEAST_1"
}
region_configs {
electable_specs {
instance_size = "M10"
node_count = 3
}
provider_name = "GCP"
priority = 6
region_name = "WESTERN_US"
}
}
# 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"
}
# Storage Auto-scaling Enablement Flag
variable "auto_scaling_disk_gb" {
type = boolean
description = "Flag that specifies whether disk auto-scaling is enabled"
}
# Compute Auto-scaling Enablement Flag
variable "auto_scaling_compute" {
type = boolean
description = "Flag that specifies whether cluster tier auto-scaling is enabled"
}
# Disk Size in GB
variable "disk_size_gb" {
type = int
description = "Disk Size in GB"
}
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"
auto_scaling_disk_gb_enabled = "true"
auto_scaling_compute_enabled = "true"
disk_size_gb = "40000"
# Define the MongoDB Atlas Provider
terraform {
required_providers {
mongodbatlas = {
source = "mongodb/mongodbatlas"
}
}
required_version = ">= 0.13"
}

在您创建文件后,导航到每个应用程序和环境对的目录,并运行以下命令以初始化 Terraform:

terraform init

运行以下命令以查看 Terraform 计划:

terraform plan

在添加 lifecycle 区块以明确更改 disk_size_gbinstant_size 之后,注释掉 lifecycle 区块并运行 terraform apply。请务必在完成后取消注释掉 lifecycle 区块,以防止任何意外更改。

运行以下命令,为应用程序和环境对创建一个项目和一个部署。该命令使用文件和 MongoDB & HashiCorp Terraform 来创建项目和集群:

terraform apply

当出现提示时,输入 yes,然后按 Enter 以应用配置。

有关此示例的更多配置选项和信息,请参阅 MongoDB & HashiCorp TerraformMongoDB Terraform 博客文章

后退

性能

在此页面上