Docs 菜单

Atlas 组织、项目和集群指导

组织、项目和集群是 Atlas 企业版的基础构建基块:

  • 在组织级别,您可以实现安全控制并创建跨一个或多个项目的用户。

  • 项目提供更细粒度的安全隔离性和授权边界。

  • 集群是Atlas中的云数据库。

使用此页面上的基础指导,根据贵公司的层次结构以及预期的集群和项目数量来设计组织、项目和集群的布局。本指导帮助您从一开始就优化安全性和性能,同时满足企业的计费和访问需求。

您可以使用以下层次结构级别来定义Atlas企业资产的安全设置和管理:

Atlas 层次结构级别
说明

(可选)付款组织

一个组织可以是其他组织的付款组织。 付款组织允许您设立跨组织计费,以便在多个组织之间股票账单订阅。要学习;了解在建立Atlas订阅时设置付款组织的更多信息,请参阅管理账单。为了启用跨组织计费,执行动作的用户必须具有他们希望关联的两个组织的“组织所有者”或“计费管理员”角色。要学习;了解更多信息,请参阅用户角色。

付款组织对于拥有许多独立运营但合同或账单归中央机构所有的 BU 或部门的大型企业来说很常见。

组织

一个组织可以包含多个项目,并提供一个容器来应用共享的集成和安全设置。如果您管理多个 Atlas 组织,Atlas 联合管理控制台允许具有组织所有者角色的用户管理用于 SSOIdP,然后将它们链接到多个组织。一个组织通常映射到公司内的一个业务单元或部门。内置的 Atlas Cost Explorer 在组织级别汇总云支出,并在项目级别和集群级别细分行项目。您可以通过利用计费 API 进一步自定义。

项目

数据平面的安全配置(包括数据库集群、网络安全和其他数据服务)在项目级别进行。项目通常映射到应用程序和环境(例如:客户门户应用程序到生产环境)。对于每个项目,根据所选的云提供商,在 AWS 和 Azure 的每个区域都有一个专用的 VPC 或 VNet。

集群

Atlas 会为每个项目在专用 VPC/VNet 中预配每个集群。安全配置在项目中的集群之间共享,但数据库用户角色和授权除外,您可以将其应用于集群、数据库和集合级别的操作。

显示组织、项目和集群层次结构的图像。
点击放大

我们建议您使用以下四种环境,将沙盒和测试项目及集群与应用程序项目及集群隔离:

environment
说明

开发 (Dev)

允许开发者在安全的沙盒环境中自由尝试新事物。

测试(测试)

测试在开发环境中创建的特定组件或功能。

暂存

将所有组件和功能放在一起,以确保整个应用程序在部署到生产环境之前按预期运行。暂存环境与测试环境类似,但确保新组件与现有组件良好配合。

生产 (Prod)

您的应用程序的后端对您的最终用户是实时可用的。

出于开发和测试目的,开发者可以使用Atlas CLI创建本地Atlas部署。通过在本地机器上工作,开发者可以降低外部开发和测试环境的成本。

开发者还可以通过Docker运行Atlas CLI命令,从而使用容器来构建、运行和管理本地Atlas部署。容器是标准化单元,包含运行应用程序所需的所有软件。容器化允许开发者在安全、可靠和可移植的测试环境中构建本地Atlas部署。要学习;了解更多信息,请参阅使用Docker创建本地Atlas部署。

一般来说,我们建议设立一个集中管理的付款组织,并为每个业务单元或部门设立一个与付款组织关联的组织。然后,为下层(开发或测试)和上层环境各创建一个包含一个集群的项目;您可以在这些项目中创建集群。要了解更多信息,请参阅以下有关推荐的层次结构的信息。

如果您很容易达到每个组织的 250 个项目限制,我们建议为每个环境创建一个组织,例如为下层环境和上层环境各创建一个组织,或者为开发、测试、暂存和生产各一个。此设置的优点是具有额外的隔离性。您还可以提高限制。要学习;了解更多信息,请参阅Atlas服务限制。

如果您在整个BU中拥有通用团队和权限,并且低于每个组织250个项目的可募集限制,请考虑以下层次结构,它会创建较少的Atlas组织。

显示付款组织及其下方嵌套的其他组织的图像。
点击放大

如果贵组织高度分散,且没有中央职能部门作为合同和账单的统一管理者,请考虑采用以下层次结构。在此层次结构中,每个业务单元、部门或团队都有自己的 Atlas 组织。如果每个团队都相对独立,不在公司内部共享人员或权限,或者他们希望通过云提供商市场或直接使用自己的合同购买信用额度,那么这种层次结构将非常实用。此层次结构中没有付款组织。

展示多个组织但无付费组织位于顶层的图像。
点击放大

为了保持环境之间的隔离性,我们建议您在自己的项目中部署每个集群,如下图所示。这允许管理员在不同环境之间维护不同的项目配置,并遵循最小权限原则原则,该原则规定只能向用户授予其角色所需的最低访问权限级别。

但是,这种层次结构可能会使跨集群股票项目级配置(例如私有端点和集合扫描)变得更加复杂。要学习;了解更多信息,请参阅何时应考虑为每个项目使用多个集群。

显示每个组织中每个项目的一个部署的图像。
点击放大

下图显示了一个组织,其每个项目都包含多个Atlas集群,按环境分组。当一个应用程序使用多个后端集群,或者同一团队负责跨环境的多个应用程序时,在同一项目中部署多个集群可以简化管理。这降低了私有端点和客户托管密钥等功能的设置费用,因为同一项目中的所有集群股票相同的项目配置。

但是,此集群层次结构可能违反最小权限原则原则。

仅当以下两个条件为 true 时,才在同一项目中部署多个集群:

  • 每个访问权限访问该项目的团队成员正在处理项目中的所有其他应用程序和集群。

  • 您正在为开发和测试环境创建集群。在暂存和生产环境中,我们建议同一项目中的集群应属于同一应用程序并由同一团队管理。

显示按环境分组的部署的图像。
点击放大

我们建议您使用以下详细信息标记集群或项目,以便轻松解析报告和集成:

  • BU 或部门

  • teamName

  • ApplicationName

  • environment

  • 版本

  • 电子邮件联系

  • 关键性(指示存储在集群上的数据层级,包括任何敏感分类,例如 PIIPHI

要了解更多关于使用标签解析计费数据的信息,请参阅 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
适合于

M10 [1]

10 GB 到 128 GB

8 GB 至 128 GB

2

2 GB

1000

仅限开发/测试

Med

M30

10 GB 至 512 GB

8 GB 至 512 GB

2

8 GB

3000

Prod

M50

10 GB 到 4 TB

8 GB 至 4 TB

16

32 GB

3000

Prod

超大

M80

10 GB 到 4 TB

8 GB 至 4 TB

32

128 GB

3000

Prod

[1] M10 是共享 CPU层级。对于监管严格的行业或敏感数据,最小起始层级应为 M30

要了解更多关于集群层及其支持的区域的信息,请查看每个云提供商的 Atlas 文档:

以下示例使用Atlas 自动化工具创建组织、项目和集群。

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

  • 针对开发/测试环境,将集群层级设立为 M10。使用集群大小指南,学习;了解适合您的应用程序大小的推荐集群层。

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

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

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

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

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

注意

在使用 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>"
  • 安装 Terraform

对于您的开发和测试环境,请为每个应用程序和环境对创建以下文件。将每个应用程序和环境对的文件放在各自的目录中。更改 ID 和名称以使用您的值:

# 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 }
# 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"
}
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"
# Define the MongoDB Atlas Provider
terraform {
required_providers {
mongodbatlas = {
source = "mongodb/mongodbatlas"
}
}
required_version = ">= 0.13"
}

对于您的暂存环境和生产环境,请为每个应用程序和环境对创建以下文件。将每个应用程序和环境对的文件放在各自的目录中。更改 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"
}
# Atlas Group Name
variable "atlas_group_name" {
type = string
description = "Atlas Group Name"
}
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"
# Define the MongoDB Atlas Provider
terraform {
required_providers {
mongodbatlas = {
source = "mongodb/mongodbatlas"
}
}
required_version = ">= 0.13"
}

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

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

terraform init

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

terraform plan

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

terraform apply

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

在为您的组织、项目和集群规划层次结构和大小后,请查看以下建议的资源,或使用左侧导航查找每个 Well-Architected Framework 支柱的功能和最佳实践。