Docs 菜单
Docs 主页
/ /
Atlas 架构中心
/

Atlas 可扩展性指导

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

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

将Atlas 集群升级到下一个可用的Atlas层级可以通过Atlas控制平面 GUI、 Atlas Administration 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] }

请参阅 Terraform 示例,在 Github 的一个位置跨所有支柱实施 Staging/Prod 建议,涵盖所有支柱。

以下示例支持使用 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
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 博客文章

后退

性能

在此页面上