Atlas 可扩展性功能
自动伸缩功能使集群能够根据实时使用情况自动调整其层级和/或存储容量。Atlas使用互补的自动伸缩机制:
响应式自动伸缩会分析当前 CPU 和内存利用率,根据持续的高或低资源使用率来 trigger 扩展事件。响应式自动伸缩会在工作负载发生变化后发生,并同时处理升级和缩减。
预测性自动伸缩使用机器学习根据历史使用模式预测未来的扩展需求,并尝试在预测的周期性工作负载负载峰值到来之前进行扩展。预测性自动伸缩适用于符合条件的集群,且仅支持升级。缩减仍处于被动状态。
请参阅集群层级扩展,详细了解 Atlas 在何种情况下向上或向下扩展集群节点。您还可以指定集群可自动扩展到的最大和最小集群大小范围,以保证最低性能或控制成本。如果扩展会导致层级超出指定的大小范围, Atlas通常不会扩展集群,但如果磁盘需要,集群层和存储可能会并行扩展。如果内存或 CPU 使用量超过扩展层级的容量, Atlas也不会扩展。
自动伸缩最适合稳定增长或下降的应用程序负载和周期性工作负载模式。对于意外的一次性流量峰值,例如产品发布或史无前例的事件,请以编程方式进行预扩展。响应式自动伸缩引入了限制延迟以防止应用程序影响,而预测性自动伸缩仅处理重复出现的模式。
推荐的部署拓扑 中引用的Atlas部署模板为您提供了水平和垂直扩展选项。具体来说,分片可将数据分发到大量机器上,当没有单个服务器可以处理您的工作负载时,分片非常有用。分片遵循无共享架构,这是一种分布式计算架构,其中没有任何节点相互股票任何资源。请参阅选择分片键以学习;了解有关理想分片键选择的更多信息,该选择允许MongoDB在整个集群中均匀分布文档,同时促进常见查询模式。此外,请参阅性能最佳实践:分片,学习;了解关键分片策略,例如范围分片、哈希分片和分区分片。
可以通过 Atlas 控制平面 GUI、Atlas Administration API,或通过 IaC 工具(例如 Atlas Kubernetes Operator、MongoDB & HashiCorp Terraform 或 Atlas CLI)将 Atlas 集群升级到下一个可用的 Atlas 层级。请参阅 Atlas 自动化基础设施预配指导,了解更多信息。更改 Atlas 层级,无论是扩容还是减容,都可以实现零停机时间。层级以滚动方式更改,其中涉及选择一个从节点作为替换,将此从节点提升为新的主节点,然后恢复或替换故障节点,以确保集群尽快返回到目标配置。水平扩展在部署后根据管理员操作进行,可以通过编程脚本触发。某些集群模板需要分片集群。从 MongoDB 版本 8.0 开始,您可以使用嵌入式配置服务器来降低小型分片集群上配置服务器的相关成本。
Atlas 中的低 CPU 选项有助于那些需要更多内存但不需要太多处理能力的应用程序。与相同集群大小的常规层级相比,此可为实例提供一半的 vCPU,从而降低内存密集型但不依赖 CPU 的工作负载的成本。
数据层级和存档使您能够以低成本存储存档数据,同时仍然可以查询实时集群数据,这对于长期记录保留特别有用。为了优化此过程,MongoDB 建议您使用简单、可配置的规则来自动化数据存档。请参阅存档数据,了解有关您可以在存档规则中指定的标准的更多信息。在数据保留不是优先级的情况下,Atlas 提供了根据日期标准自动删除未使用数据的选项。对于不经常访问的数据,TTL 索引是特殊的单字段索引,会在指定时间段后或设定的时钟时间自动从TTL集合中删除文档。对于像日志、会话信息或事件数据等只需在有限时间内保留的数据,这一功能特别有用。要创建 TTL 索引,您可以在包含日期值的字段上定义索引,并指定以秒为单位的生存时间。
Atlas还为您提供了Performance Advisor等自动化工具,通过添加或删除索引或更改客户端的查询结构来识别和优化低效查询。您可以遵循性能优化顾问的可行建议来提高查询性能,从而减少不必要的计算时间和资源消耗。 此外,您还可以利用Atlas提供的智能索引建议,进一步提高数据检索效率,最大限度地减少数据库操作所需的资源。
关于 Atlas 可扩展性的建议
对于单区域部署,重点关注优化单个云区域内性能的垂直扩展策略:
为计算和存储启用自动伸缩,以处理流量的逐渐增加,而无需手动干预。
当您的数据集超过单个服务器的容量(即使在单个地区内)时,请使用分片在多个分片之间分配负载。
对于不需要高处理能力的内存密集型工作负载,建议考虑低 CPU 实例选项。
为历史数据实现数据分层和存档,以降低存储费用,同时保持查询功能。
使用Performance Advisor监控查询性能并实现推荐的索引以优化资源利用率。
对于一次性事件,例如产品发布或空前的流量峰值,请在事件之前以编程方式预扩展集群。自动伸缩依赖于重复出现的周期性工作负载,或依赖于工作负载发生更改后的响应,这两种方式可能都不适合您的情况。
对于多区域和多云部署,实现考虑地理分布和跨云复杂性的扩展策略:
在距离用户最近的地区配置只读副本,以减少延迟并按地理位置分配读取工作负载。
使用区域分片根据地理或逻辑边界对数据进行分区,确保数据的局部性和合规性要求。
实施具有本地读写功能的全球集群,以优化跨区域性能,同时保持数据一致性。
监控区域之间的网络延迟,并调整副本优先级,以确保最佳的故障转移行为。
在跨多个区域实现自动伸缩时,请考虑跨区域数据传输成本的影响。
根据区域使用模式和费用优化策略,在不同区域使用不同的集群层。
实现区域特定的备份和归档策略,以符合数据驻留要求。
所有部署范式建议
以下建议适用于所有部署范式。
对于开发和测试环境,请勿启用自动伸缩计算和自动伸缩存储。这可以节省您在非生产环境中的成本。
对于测试和生产环境,我们建议您:
为计算和存储启用自动伸缩。启用自动伸缩后, Atlas会自动使用响应式和预测性自动伸缩来扩展集群。根据当前资源使用情况触发响应式自动伸缩。预测性自动伸缩可分析历史使用模式,并在预测的周期性需求峰值之前主动扩展集群。对于这两种方法,缩减仍然是被动的。要学习;了解更多信息,请参阅集群层的预测性自动伸缩。
如果您使用 IaC 工具,请利用设置忽略自动伸缩造成的资源漂移。示例,在 Terraform 中,如果
disk_gb_enabled为 true, Atlas将自动扩展和缩小磁盘大小。这将导致返回的disk_size_gb值可能与 Terraform 配置中指定的值不同,如果随后应用计划而没有注意到这一点,Terraform 会将集群磁盘大小扩展回原始disk_size_gb值。为防止出现这种情况,请使用use_effective_fields = true。同样,在 Terraform 中,如果
compute_enabled为 true,则Atlas将自动扩展到提供的最大值,并缩减到最小值(如果提供)。这将导致返回的provider_instance_size_name值可能与 Terraform 配置中指定的值不同,如果随后应用计划而没有注意到这一点,Terraform 会将集群扩展回原始的instanceSizeName值。为防止出现这种情况,请使用use_effective_fields = true。use_effective_fields = true。
自动化示例:Atlas 可扩展性
提示
有关在所有支柱上实施我们建议的 Terraform 示例,请参阅Github中的以下示例之一:
以下示例支持使用 Atlas自动化工具自动扩展计算和存储。
这些示例还应用其他推荐的配置,包括:
注意
在使用 Atlas CLI 创建资源之前,您必须:
创建您的付款组织并为该付款组织创建一个 API 密钥。
为每个项目创建一个部署
对于您的开发和测试环境,为节省成本,已禁用自动扩展计算和存储。
对于您的暂存环境和生产环境,请为每个项目创建以下 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>"
重要
以下示例使用 MongoDB Atlas Terraform 提供商版本 2.x(~> 2.2)。如果您正在从提供商版本 1.x 升级,请参阅 2.0.0 升级指南 了解破坏性变更和迁移步骤。这些示例使用带 v2.x 语法的mongodbatlas_advanced_cluster 资源。
创建项目和部署
对于您的开发和测试环境,为节省成本,已禁用自动扩展计算和存储。
对于您的预发布环境和生产环境,请为每个应用程序和环境对创建以下文件。将每个应用程序和环境对的文件放在各自的目录中。更改 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 team to project with specific roles resource "mongodbatlas_team_project_assignment" "project_team" { project_id = mongodbatlas_project.atlas-project.id 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 use_effective_fields = true replication_specs = [ { region_configs = [ { electable_specs = { instance_size = var.cluster_instance_size_name node_count = 3 disk_size_gb = var.disk_size_gb } auto_scaling = { disk_gb_enabled = var.auto_scaling_disk_gb_enabled compute_enabled = var.auto_scaling_compute_enabled compute_max_instance_size = var.compute_max_instance_size } priority = 7 provider_name = var.cloud_provider region_name = var.atlas_region } ] } ] tags = { BU = "ConsumerProducts" TeamName = "TeamA" AppName = "ProductManagementApp" Env = "Production" Version = "8.0" Email = "marissa@example.com" } } # Outputs to Display output "atlas_cluster_connection_string" { value = mongodbatlas_advanced_cluster.atlas-cluster.connection_strings.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" }, { electable_specs = { instance_size = "M10" node_count = 3 } provider_name = "GCP" priority = 6 region_name = "WESTERN_US" } ] } ]
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 Group Name variable "atlas_group_name" { type = string description = "Atlas Group 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_enabled" { type = bool description = "Flag that specifies whether disk auto-scaling is enabled" } # Compute Auto-scaling Enablement Flag variable "auto_scaling_compute_enabled" { type = bool 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" }
terraform.tfvars
atlas_org_id = "32b6e34b3d91647abb20e7b8" atlas_project_name = "Customer Portal - Prod" atlas_group_name = "Atlas Group" 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
provider.tf
# Define the MongoDB Atlas Provider terraform { required_providers { mongodbatlas = { source = "mongodb/mongodbatlas" version = "~> 2.2" } } required_version = ">= 1.0" } # Configure the MongoDB Atlas Provider provider "mongodbatlas" { # Legacy API key authentication (backward compatibility) public_key = var.mongodbatlas_public_key private_key = var.mongodbatlas_private_key # Recommended: Service account authentication # Uncomment and configure the following for service account auth: # service_account_id = var.mongodb_service_account_id # private_key_file = var.mongodb_service_account_key_file }
在您创建文件后,导航到每个应用程序和环境对的目录,并运行以下命令以初始化 Terraform:
terraform init
运行以下命令以查看 Terraform 计划:
terraform plan
在添加 lifecycle 区块以明确更改 disk_size_gb 和 instant_size 之后,注释掉 lifecycle 区块并运行 terraform apply。请务必在完成后取消注释掉 lifecycle 区块,以防止任何意外更改。
运行以下命令,为应用程序和环境对创建一个项目和一个部署。该命令使用文件和 MongoDB & HashiCorp Terraform 来创建项目和集群:
terraform apply
当出现提示时,输入 yes 然后按 Enter 以应用配置。
有关此示例的更多配置选项和信息,请参阅 MongoDB & HashiCorp Terraform。