Atlas 组织、项目和集群指导
在此页面上
组织、项目和集群是 Atlas 企业版的基础构建基块:
在组织级别,您可以实现安全控制并创建跨一个或多个项目的用户。
项目提供更细粒度的安全隔离性和授权边界。
集群是Atlas中的云数据库。
使用此页面上的基础指导,根据贵公司的层次结构以及预期的集群和项目数量来设计组织、项目和集群的布局。本指导帮助您从一开始就优化安全性和性能,同时满足企业的计费和访问需求。
Atlas 组织、项目和集群的功能
您可以使用以下层次结构级别来定义Atlas企业资产的安全设置和管理:
Atlas 层次结构级别 | 说明 |
---|---|
(可选)付款组织 | |
组织 | 一个组织可以包含多个项目,并提供一个容器来应用共享的集成和安全设置。如果您管理多个 Atlas 组织,Atlas 联合管理控制台允许具有组织所有者角色的用户管理用于 SSO 的 IdP,然后将它们链接到多个组织。一个组织通常映射到公司内的一个业务单元或部门。内置的 Atlas Cost Explorer 在组织级别汇总云支出,并在项目级别和集群级别细分行项目。您可以通过利用计费 API 进一步自定义。 |
项目 | 数据平面的安全配置(包括数据库集群、网络安全和其他数据服务)在项目级别进行。项目通常映射到应用程序和环境(例如:客户门户应用程序到生产环境)。对于每个项目,根据所选的云提供商,在 AWS 和 Azure 的每个区域都有一个专用的 VPC 或 VNet。 |
集群 | Atlas 会为每个项目在专用 VPC/VNet 中预配每个集群。安全配置在项目中的集群之间共享,但数据库用户角色和授权除外,您可以将其应用于集群、数据库和集合级别的操作。 |

Atlas 组织、项目和集群建议
开发、测试、暂存和生产环境
我们建议您使用以下四种环境,将沙盒和测试项目及集群与应用程序项目及集群隔离:
environment | 说明 |
---|---|
开发 (Dev) | 允许开发者在安全的沙盒环境中自由尝试新事物。 |
测试(测试) | 测试在开发环境中创建的特定组件或功能。 |
暂存 | 将所有组件和功能放在一起,以确保整个应用程序在部署到生产环境之前按预期运行。暂存环境与测试环境类似,但确保新组件与现有组件良好配合。 |
生产 (Prod) | 您的应用程序的后端对您的最终用户是实时可用的。 |
本地Atlas部署
出于开发和测试目的,开发者可以使用Atlas CLI创建本地Atlas部署。通过在本地机器上工作,开发者可以降低外部开发和测试环境的成本。
开发者还可以通过Docker运行Atlas CLI命令,从而使用容器来构建、运行和管理本地Atlas部署。容器是标准化单元,包含运行应用程序所需的所有软件。容器化允许开发者在安全、可靠和可移植的测试环境中构建本地Atlas部署。要学习;了解更多信息,请参阅使用Docker创建本地Atlas部署。
组织和项目的层次结构
一般来说,我们建议设立一个集中管理的付款组织,并为每个业务单元或部门设立一个与付款组织关联的组织。然后,为下层(开发或测试)和上层环境各创建一个包含一个集群的项目;您可以在这些项目中创建集群。要了解更多信息,请参阅以下有关推荐的层次结构的信息。
如果您很容易达到每个组织的 250 个项目限制,我们建议为每个环境创建一个组织,例如为下层环境和上层环境各创建一个组织,或者为开发、测试、暂存和生产各一个。此设置的优点是具有额外的隔离性。您还可以提高限制。要学习;了解更多信息,请参阅Atlas服务限制。
推荐的层次结构
如果您在整个BU中拥有通用团队和权限,并且低于每个组织250个项目的可募集限制,请考虑以下层次结构,它会创建较少的Atlas组织。
推荐的层次结构 2:去中心化业务单元/部门
如果贵组织高度分散,且没有中央职能部门作为合同和账单的统一管理者,请考虑采用以下层次结构。在此层次结构中,每个业务单元、部门或团队都有自己的 Atlas 组织。如果每个团队都相对独立,不在公司内部共享人员或权限,或者他们希望通过云提供商市场或直接使用自己的合同购买信用额度,那么这种层次结构将非常实用。此层次结构中没有付款组织。
Cluster Hierarchy
为了保持环境之间的隔离性,我们建议您在自己的项目中部署每个集群,如下图所示。这允许管理员在不同环境之间维护不同的项目配置,并遵循最小权限原则原则,该原则规定只能向用户授予其角色所需的最低访问权限级别。
但是,这种层次结构可能会使跨集群股票项目级配置(例如私有端点和集合扫描)变得更加复杂。要学习;了解更多信息,请参阅何时应考虑为每个项目使用多个集群。
何时考虑为每个项目使用多个集群
下图显示了一个组织,其每个项目都包含多个Atlas集群,按环境分组。当一个应用程序使用多个后端集群,或者同一团队负责跨环境的多个应用程序时,在同一项目中部署多个集群可以简化管理。这降低了私有端点和客户托管密钥等功能的设置费用,因为同一项目中的所有集群股票相同的项目配置。
但是,此集群层次结构可能违反最小权限原则原则。
仅当以下两个条件为 true 时,才在同一项目中部署多个集群:
每个访问权限访问该项目的团队成员正在处理项目中的所有其他应用程序和集群。
您正在为开发和测试环境创建集群。在暂存和生产环境中,我们建议同一项目中的集群应属于同一应用程序并由同一团队管理。
资源标签
我们建议您使用以下详细信息标记集群或项目,以便轻松解析报告和集成:
BU 或部门
teamName
ApplicationName
environment
版本
电子邮件联系
关键性(指示存储在集群上的数据层级,包括任何敏感分类,例如 PII 或 PHI)
要了解更多关于使用标签解析计费数据的信息,请参阅 Atlas 计费数据的功能。
Atlas集群大小指南
在专用部署(集群大小 M10
+)中, Atlas专门分配资源。我们建议为生产使用案例使用专用部署,因为它们比共享集群提供更高的安全性和性能。
以下集群大小指南使用“T 恤大小调整”(软件开发和基础架构中常见的类比)来简化描述容量规划。仅使用 T 恤尺码建议作为尺码分析的大致起点。调整集群大小是一个迭代进程,需要根据不断变化的资源需求、性能要求、工作负载负载特征和增长预期来确定。
重要
本指导不包括关键任务应用程序、高内存工作负载和高 CPU 工作负载。对于这些使用案例,联系MongoDB支持部门获取定制指导。
您可以使用组织的大致数据大小和工作负载来估计部署所需的集群资源:
所需总存储空间:占原始数据总大小的 50%
所需总 RAM:占原始数据总大小的 10%
所需的 CPU 内核总数:每秒的预期峰值读取/写入数据库操作数 ÷ 4000
所需的总存储 IOPS:每秒预期的峰值读取/写入数据库操作数(最小 IOPS = 5%,最大 IOPS = 95%)
使用以下集群大小指南来选择可确保性能而不会过度预配的集群层。此表显示每个集群层的默认存储和性能功能,以及该集群层是否适合暂存和生产环境。
T 恤尺码 | 集群层 | 存储范围: Amazon Web Services/ Google Cloud Platform | 存储范围: Azure | CPUs (#) | 默认 RAM | 默认 IOPS | 适合于 |
---|---|---|---|---|---|---|---|
小 |
| 10 GB 到 128 GB | 8 GB 至 128 GB | 2 | 2 GB | 1000 | 仅限开发/测试 |
Med |
| 10 GB 至 512 GB | 8 GB 至 512 GB | 2 | 8 GB | 3000 | Prod |
大 |
| 10 GB 到 4 TB | 8 GB 至 4 TB | 16 | 32 GB | 3000 | Prod |
超大 |
| 10 GB 到 4 TB | 8 GB 至 4 TB | 32 | 128 GB | 3000 | Prod |
[1] | M10 是共享 CPU层级。对于监管严格的行业或敏感数据,最小起始层级应为 M30 。 |
要了解更多关于集群层及其支持的区域的信息,请查看每个云提供商的 Atlas 文档:
自动化示例:Atlas 组织、项目和集群
请参阅 Terraform 示例,在 Github 的一个位置跨所有支柱实施 Staging/Prod 建议,涵盖所有支柱。
以下示例使用Atlas 自动化工具创建组织、项目和集群。
这些示例还应用其他推荐的配置,包括:
注意
在使用 Atlas CLI 创建资源之前,您必须:
创建您的付款组织并为该付款组织创建一个 API 密钥。
通过使用 Programmatic Use 的步骤从 Atlas CLI 连接。
创建组织
为每个 BU 运行以下命令。更改 ID 和名称以使用实际值:
atlas organizations create ConsumerProducts --ownerId 508bb8f5f11b8e3488a0e99e --apiKeyRole ORG_OWNER --apiKeyDescription consumer-products-key
有关此示例的更多配置选项和信息,请参阅 Atlas 组织创建。
要获取用户 ID 和组织 ID,请查看以下命令:
创建项目
为每个应用程序和环境对运行以下命令。更改 ID 和名称以使用您的值:
atlas projects create "Customer Portal - Prod" --tag environment=production --orgId 32b6e34b3d91647abb20e7b8
有关此示例的更多配置选项和信息,请参阅 Atlas 项目创建。
要获取项目 ID,请查看以下命令:
使用客户数密钥管理配置加密
对于预发布和生产环境,我们建议您在预配集群时启用客户密钥管理的加密功能。对于开发和测试,请考虑跳过使用客户密钥管理的加密以节省费用,除非您处于高度监管的行业或存储敏感数据。要了解更多信息,请参阅 Atlas 组织、项目和集群建议。
您不能使用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" }
对于您的暂存环境和生产环境,请为每个应用程序和环境对创建以下文件。将每个应用程序和环境对的文件放在各自的目录中。更改 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" }
有关此示例的更多配置选项和信息,请参阅 MongoDB & HashiCorp Terraform 和 MongoDB Terraform 博客文章。
在您创建文件后,导航到每个应用程序和环境对的目录,并运行以下命令以初始化 Terraform:
terraform init
运行以下命令以查看 Terraform 计划:
terraform plan
运行以下命令,为应用程序和环境对创建一个项目和一个部署。该命令使用文件和 MongoDB & HashiCorp Terraform 来创建项目和集群:
terraform apply
当出现提示时,输入 yes
,然后按 Enter
以应用配置。
后续步骤
在为您的组织、项目和集群规划层次结构和大小后,请查看以下建议的资源,或使用左侧导航查找每个 Well-Architected Framework 支柱的功能和最佳实践。