ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Docs 菜单

Atlas 可扩展性指导

自动伸缩功能使集群能够根据实时使用情况自动调整其层级和/或存储容量。 Atlas会分析 CPU 和内存利用率,以确定何时以及是否扩展集群层。请参阅集群层级扩展,学习;了解有关Atlas向上或向下扩展集群节点的条件的更多信息。您还可以指定集群可自动扩展到的最大和最小集群大小范围,以保证最低性能或控制成本。如果新层级超出您指定的大小范围,或者您的内存使用量将超过新层级的容量, Atlas不会扩展集群。自动伸缩会延迟扩展或缩减集群层,以确保自动伸缩不会对应用程序造成任何影响。因此,它最适合应用程序负载稳定增长或下降的情况,而不是数据库被使用量淹没的突然峰值情况。如果您的工作负载负载频繁出现峰值,或者您预计流量会因事件或启动而大幅增加, MongoDB建议您以编程方式进行预扩展。

推荐的部署拓扑中引用的Atlas部署模板为您提供了水平和垂直扩展选项。具体来说,分片可将数据分发到大量机器上,当没有单个服务器可以处理您的工作负载时,分片非常有用。分片遵循无共享架构,这是一种分布式计算架构,其中没有任何节点相互股票任何资源。请参阅选择分片键以学习;了解有关理想分片键选择的更多信息,该选择允许MongoDB在整个集群中均匀分布文档,同时促进常见查询模式。此外,请参阅性能最佳实践:分片,学习;了解关键分片策略,例如范围分片、哈希分片和分区分片。

将Atlas 集群升级到下一个可用的Atlas层级可通过Atlas控制平面 GUI、Atlas管理API或通过 IaC 工具(例如Atlas Kubernetes Operator、MongoDB和 HashiCorp Terraform 或Atlas CLI)来实现。请参阅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集合中删除文档。对于像日志、会话信息或事件数据等只需在有限时间内保留的数据,这一功能特别有用。要创建 TTL 索引,您可以在包含日期值的字段上定义索引,并指定以秒为单位的生存时间。

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

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

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

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

    如果您使用 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 节点副本集/分片部署拓扑结构。

我们的示例交替使用Amazon Web ServicesAzure和Google Cloud Platform。您可以使用这三个云提供商中的任何一个,但必须更改地区名称以匹配云提供商。要学习;了解云提供商及其地区,请参阅云提供商。

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

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

我们的示例交替使用Amazon Web ServicesAzure和Google Cloud Platform。您可以使用这三个云提供商中的任何一个,但必须更改地区名称以匹配云提供商。要学习;了解云提供商及其地区,请参阅云提供商。

注意

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

对于您的暂存环境和生产环境,请为每个项目创建以下 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
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 }
# 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 博客文章