MongoDB Atlas 云托管完全指南:集群、监控与迁移

MongoDB Atlas 云托管平台使用指南:集群创建、网络配置、自动备份、Monitoring、数据迁移

MongoDB Atlas 是 MongoDB Inc. 推出的官方云托管服务,支持 AWS、GCP、Azure 三大云平台,提供了集群管理、自动扩容、监控告警、自动备份、全文搜索、向量搜索等一站式能力。无论是个人开发者、初创团队还是大型企业,Atlas 都能显著降低 MongoDB 的运维负担,让你专注于业务开发而非基础设施管理。

本篇将从 Atlas 的核心优势讲起,手把手带你完成集群创建、网络加固、权限控制、监控告警配置、备份策略设定、数据迁移以及成本优化的全流程实践。

一、MongoDB Atlas 简介与托管优势

1.1 Atlas 是什么

MongoDB Atlas 是全托管的 Database-as-a-Service(DBaaS)平台,于 2016 年正式推出。它基于 MongoDB 原生构建,用户无需自行购置服务器、安装数据库、配置副本集、处理硬件故障或执行手动升级。所有底层运维工作都由 Atlas 自动化完成。

1.2 核心托管优势

全托管运维。 Atlas 自动化处理副本集初始化、节点故障切换、磁盘扩容、补丁升级、SSL 证书管理等所有基础设施任务。你只需关心数据和查询,无需深夜起床处理主节点宕机。

多云支持。 同一 Atlas 项目可以在 AWS、Google Cloud、Azure 之间灵活选择数据中心区域。这种多云能力避免了云厂商锁定,也便于实现跨云灾难恢复策略。

弹性扩展。 从 M0 免费层的共享集群到 M700 级别的高可用集群,Atlas 支持垂直扩展(提升单节点规格)和水平扩展(添加分片)两种方式。付费层集群可以在分钟级别完成节点扩容,且整个过程对业务只造成极短暂的连接中断。

安全合规。 Atlas 在传输和存储层均提供加密保护,支持 VPC Peering、Private Endpoint、IP 白名单、数据库审计日志、客户管理的加密密钥(BYOK)等企业级安全特性。已通过 SOC 2、ISO 27001、HIPAA、GDPR 等多项合规认证。

丰富生态。 Atlas 不仅托管 MongoDB 核心数据库,还集成了 Atlas Search(基于 Lucene 的全文搜索)、Atlas Vector Search(支持 AI 语义检索)、Atlas Data Lake(联合查询 S3 数据)、Atlas Stream Processing(实时流处理)以及 Charts(可视化报表)等高级能力。

1.3 适用场景

M0 免费层适合学习和原型验证,不适用于生产环境。M10 及以上付费层才真正适合承载生产负载。M30、M50 等高配集群常用于日均千万级查询的中大型应用,而 M60、M80 乃至 M700 则面向大规模数据平台和金融级场景。Atlas 的弹性计费模式让团队可以根据业务增长逐步提升配置,避免一次性过度投入。

二、集群创建:从 M0 免费层到 M10+ 付费层

2.1 注册与项目创建

首先访问 MongoDB Atlas 官网注册账号。注册时使用企业邮箱可以更方便地管理团队访问权限。注册完成后,创建你的第一个 project,一个 project 可以包含多个集群,便于按业务或环境进行资源隔离。

2.2 创建 M0 免费层集群

M0 是 Atlas 提供的永久免费共享集群,规格为 512MB 存储、共享 vCPU 和 RAM,限制每月 5GB 出站流量。适合学习 MongDB 语法、验证数据模型或开发阶段使用。

创建流程如下:

  1. 登录 Atlas 控制台,点击 Build a Cluster;
  2. 选择 Shared 类型,即 M0 免费层;
  3. 选择云厂商(AWS/GCP/Azure)和区域,建议选择离你应用服务器最近的区域以降低延迟;
  4. 自定义集群名称;
  5. 点击 Create Cluster,等待约 1 到 3 分钟集群就绪。

M0 的限制需要注意:无自动备份、无高可用 SLA、仅支持 3 天监控数据保留、每次只能有一个节点处于活动状态(无冗余副本)。不要在 M0 上运行任何生产服务。

2.3 创建 M10+ 付费层集群

生产环境必须使用 Dedicated 集群,最低规格为 M10。M10 集群提供独立的 vCPU 和内存、自动备份、高可用副本集以及完整的监控告警支持。

创建 Dedicated 集群时,Atlas 默认采用三节点副本集架构,每个节点部署在不同的可用区(或故障域)中。这种设计保证了任意一个节点或可用区故障时,集群仍能自动完成主节点切换并继续对外提供服务。

Atlas 提供了多种集群配置选项:

  • 集群层级:M10、M20、M30、M40、M50、M60、M80、M140、M200、M300、M400、M700,数字越大性能越强;
  • 存储引擎:WiredTiger 是默认引擎;
  • 存储容量:可独立配置存储大小,Atlas 会根据存储自动分配 IOPS;
  • 版本选择:推荐始终选择最新的稳定版 MongoDB,如 7.0 或 8.0;
  • 多区域部署:支持 Primary-Secondary 分布以及 Global Cluster,适合跨国业务。

以下是一个 M30 集群的创建示例,使用 atlas CLI 在命令行完成:

# 安装 atlas CLI(macOS)
brew install mongodb-atlas-cli

# 登录 Atlas
atlas auth login

# 创建项目(如未创建)
atlas projects create my-production-project

# 创建 M30 集群
curl -u "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \
  -X POST \
  "https://cloud.mongodb.com/api/atlas/v1.0/groups/{GROUP-ID}/clusters" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "prod-cluster-01",
    "mongoDBMajorVersion": "7.0",
    "providerSettings": {
      "providerName": "AWS",
      "instanceSizeName": "M30",
      "regionName": "AP_SOUTH_1"
    },
    "diskSizeGB": 100,
    "replicationSpecs": [{
      "numShards": 1,
      "regionsConfig": {
        "AP_SOUTH_1": {
          "analyticsNodes": 0,
          "electableNodes": 3,
          "priority": 7,
          "readOnlyNodes": 0
        }
      }
    }]
  }'

2.4 分片集群配置

当单节点存储或写吞吐量达到瓶颈时,需要启用分片(Sharding)来实现水平扩展。Atlas M30 及以上层级支持分片配置,用户只需在集群设置中启用 Auto-Scaling 或手动添加分片即可。

分片键的选择直接影响集群性能和数据分布。理想的分片键应具备高基数(避免热点)、均匀分布(避免单分片过载)以及与常用查询匹配(减少跨分片查询)这三个特征。

# 连接集群并启用数据库级分片
mongosh "mongodb+srv://admin:<password>@prod-cluster-01.xxxxx.mongodb.net/admin"

> sh.enableSharding("ecommerce")
> sh.shardCollection("ecommerce.orders", { "region": 1, "_id": 1 })

# 查看分片状态
> sh.status()

三、网络配置:IP 白名单、VPC Peering 与 Private Endpoint

3.1 IP 白名单(Network Access)

Atlas 默认拒绝所有外部连接。你必须在 Network Access 页面添加允许的 IP 地址或 CIDR 段,只有白名单中的来源才能访问集群。

对于开发阶段,可以临时添加当前机器的公网 IP:

# 查看当前公网 IP
curl -s https://api.ipify.org

# 使用 atlas CLI 添加到白名单
atlas accessLists create $(curl -s https://api.ipify.org)/32 --comment "dev-machine-$(date +%Y%m%d)"

生产环境中应仅添加应用服务器的出口 IP 或 VPC NAT Gateway 的 IP 段。绝对不要开放 0.0.0.0/0 给公网。

以下是一个批量添加白名单的 Node.js 示例:

const { AtlasClient } = require('mongodb-atlas-api-client');

async function addWhitelistEntries(groupId, entries) {
  const client = new AtlasClient({
    publicKey: process.env.ATLAS_PUBLIC_KEY,
    privateKey: process.env.ATLAS_PRIVATE_KEY,
    baseUrl: 'https://cloud.mongodb.com/api/atlas/v1.0'
  });

  for (const entry of entries) {
    await client.projectAccessList.create(groupId, {
      ipAddress: entry.ip,
      comment: entry.comment
    });
    console.log(`已添加: ${entry.ip} (${entry.comment})`);
  }
}

const whitelist = [
  { ip: '203.0.113.0/24', comment: 'prod-vpc-nat' },
  { ip: '198.51.100.10/32', comment: 'bastion-host' },
  { ip: '192.0.2.0/26', comment: 'office-vpn' }
];

addWhitelistEntries('your-group-id', whitelist);

3.2 VPC Peering

VPC Peering 允许你的 AWS VPC 与 Atlas 所在的 VPC 建立私密网络连接,流量不经过公网,延迟更低且安全性更高。

配置步骤如下:

  1. 在 Atlas 控制台进入 Network Access → Peering → New Peering Connection;
  2. 选择 AWS Account ID 和 VPC ID;
  3. Atlas 创建一个 peering connection 请求;
  4. 登录 AWS 控制台,前往 VPC → Peering Connections,接受该请求;
  5. 更新你的 VPC 路由表,添加指向 Atlas VPC CIDR 的路由;
  6. 更新 Atlas 的 VPC 白名单,允许你的 VPC CIDR 访问集群。
# 使用 AWS CLI 接受 VPC Peering 请求
aws ec2 accept-vpc-peering-connection \
  --vpc-peering-connection-id pcx-xxxxxxxxxxxxxxxxx

# 更新路由表(假设 Atlas VPC CIDR 为 10.10.0.0/16)
aws ec2 create-route \
  --route-table-id rtb-yyyyyyyyyyyyyyyy \
  --destination-cidr-block 10.10.0.0/16 \
  --vpc-peering-connection-id pcx-xxxxxxxxxxxxxxxxx

3.3 Private Endpoint

Private Endpoint(AWS PrivateLink / Azure Private Link / GCP Private Service Connect)是比 VPC Peering 更先进的网络隔离方案。它通过云厂商的私有连接服务,让你的应用直接以私有 IP 访问 Atlas 集群,无需任何 IP 白名单配置。

Private Endpoint 的优势:

  • 所有数据库流量完全在私有网络内传输;
  • 无需配置公网 IP 白名单,攻击面更小;
  • 支持跨账号、跨区域访问;
  • 可以快速撤销权限而无需修改路由表。

以 AWS PrivateLink 为例的配置流程:

  1. 在 Atlas 控制台创建 Private Endpoint,选择 AWS 区域;
  2. Atlas 返回 Service Name(如 com.amazonaws.vpce.ap-south-1.vpce-svc-xxxxxxxxxxxxxxxxx);
  3. 在你的 AWS VPC 中创建 Endpoint,填入该 Service Name;
  4. Atlas 侧批准接入请求;
  5. 使用 Private Endpoint 提供的连接字符串替换原有的标准连接串。

连接串对比:

# 标准连接串(通过公网)
mongosh "mongodb+srv://admin:<password>@prod-cluster-01.xxxxx.mongodb.net/mydb"

# Private Endpoint 连接串(仅面向你的 VPC)
mongosh "mongodb://admin:<password>@prod-cluster-01-pri.xxxxx.mongodb.net:27017,mydb"

四、用户与角色管理

4.1 Database User 管理

Atlas 提供了独立于 MongoDB 内置认证的用户管理系统。你可以在 Atlas 控制台创建数据库用户,也可以通过 API 以声明式方式批量管理。

创建用户时有两种认证方式可选:

  • 密码认证:传统的 username + password,适合应用服务连接;
  • SCRAM / x.509:更强的身份验证方式,适合高安全场景。
# 使用 atlas CLI 创建只读用户
atlas dbusers create \
  --username analytics_reader \
  --password 'Str0ngP@ssw0rd!' \
  --role readAnyDatabase@admin \
  --projectId xxxxxxxxxxxxxxxxxx

# 创建特定库的读写用户
atlas dbusers create \
  --username app_writer \
  --password 'AnotherStr0ngP@ss!' \
  --role readWrite@ecommerce \
  --role read@reporting \
  --projectId xxxxxxxxxxxxxxxxxx

4.2 自定义角色

当内置角色无法满足需求时,可以使用自定义角色精确控制权限粒度。

// 连接 Atlas 集群的主节点创建自定义角色
use admin;

db.createRole({
  role: "ecommerceLimitedWriter",
  privileges: [
    {
      resource: { db: "ecommerce", collection: "orders" },
      actions: ["insert", "update", "find"]
    },
    {
      resource: { db: "ecommerce", collection: "products" },
      actions: ["find"]
    }
  ],
  roles: []
});

// 将自定义角色赋给用户
db.grantRolesToUser("app_writer", [{ role: "ecommerceLimitedWriter", db: "admin" }]);

4.3 Organization 与 Project 级权限

Atlas 采用三层权限模型:Organization > Project > Cluster。合理的权限设计应遵循最小权限原则:

  • Organization Owner:仅授予核心运维负责人;
  • Project Owner:授予各项目的负责人,但限制跨项目访问;
  • Project Cluster Manager:可以管理集群配置但不能管理账单;
  • Project Read Only:适合查看监控数据但不能修改配置的开发人员;
  • Database Access Admin:仅管理数据库用户,不管理基础设施。
# 使用 atlas CLI 邀请成员到项目并赋予只读角色
atlas teams create --username newdev@company.com --role GROUP_READ_ONLY --projectId xxxxxxxxxxxxxxxxxx

五、Monitoring 与 Alerts

5.1 内置监控仪表盘

Atlas 提供了开箱即用的实时监控仪表盘,覆盖以下关键指标:

  • Operations:每秒操作数(ops/sec),按 read/write/command 细分;
  • Connections:当前连接数、可用连接数、连接创建速率;
  • Memory:物理内存、驻留内存、虚拟内存、缓存命中率;
  • Network:入站/出站字节数及包数;
  • Replication:主从节点延迟(Replication Lag)、Oplog 窗口;
  • Disk:磁盘 IOPS、磁盘利用率、队列深度;
  • Indexes:索引命中/缺失比例、索引大小增长。

在 Atlas 控制台左侧导航选择 Monitoring,可以查看集群级别的概览,也可以深入到单个节点或时间段。时间范围支持从最近 1 小时到过去 30 天(付费层)。

5.2 自定义告警配置

告警(Alerts)是生产环境运维的关键。Atlas 支持基于阈值或异常检测两种方式触发告警,告警渠道包括邮件、SMS、PagerDuty、Slack、Webhook。

推荐配置的核心告警项:

  • Connection utilization > 80%:连接接近耗尽,应立即排查连接泄漏或扩容;
  • Replication Lag > 10 seconds:从节点延迟过高,可能影响读扩散能力;
  • Opcounter insert/update/delete > 阈值:突发的流量洪峰预警;
  • Disk space utilization > 85%:存储空间告警,触发自动扩容或清理策略;
  • System CPU (User) > 80%:持续高 CPU 预示查询需要优化或水平扩展;
  • Query Targeting (Scanned / Returned) > 1000:大表扫描预警,指示索引缺失。
# 使用 Atlas Admin API 批量创建告警规则
curl -u "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \
  -X POST \
  "https://cloud.mongodb.com/api/atlas/v1.0/groups/{GROUP-ID}/alertConfigs" \
  -H "Content-Type: application/json" \
  -d '{
    "eventTypeName": "OUTSIDE_METRIC_THRESHOLD",
    "enabled": true,
    "metricThreshold": {
      "metricName": "CONNECTIONS_PERCENT",
      "operator": "GREATER_THAN",
      "threshold": 80.0,
      "units": "RAW",
      "mode": "AVERAGE"
    },
    "notifications": [{
      "typeName": "EMAIL",
      "emailAddress": "dba@company.com",
      "delayMin": 0,
      "intervalMin": 60
    }]
  }'

5.3 集成 Prometheus 与 Grafana

Atlas 提供了 MongoDB Exporter,可以将监控数据导出到 Prometheus,再通过 Grafana 构建自定义运维大屏。这种方式特别适合已有 Prometheus 生态的团队。

# prometheus.yml 中配置 Atlas Exporter 作业
scrape_configs:
  - job_name: 'mongodb-atlas'
    static_configs:
      - targets:
        - 'mongodb-atlas-exporter:9216'
    metrics_path: /metrics
    params:
      target:
        - 'mongodb+srv://monitoring:<password>@prod-cluster-01.xxxxx.mongodb.net'

对于更原生的集成,Atlas 还提供了 OpenTelemetry 导出器,可以将 traces 和 metrics 直接推送到你的可观测平台。

六、自动备份与时间点恢复(PITR)

6.1 备份策略配置

Atlas M10 及以上集群默认启用 Cloud Backups。备份策略支持以下配置:

  • 快照保留:可设置每日、每周、每月、每年快照的保留数量;
  • 备份窗口:指定备份执行的 UTC 时间窗口,避免与业务高峰期重叠;
  • 跨区域备份:将快照复制到另一个地理区域,用于灾难恢复;
  • 加密:所有备份快照均使用 AES-256 加密,且支持客户管理密钥(BYOK)。
# 使用 atlas CLI 查看备份快照列表
atlas backups snapshots list prod-cluster-01 --projectId xxxxxxxxxxxxxxxxxx

# 获取快照的下载链接(可用于快速恢复测试环境)
atlas backups snapshots describe <SNAPSHOT-ID> \
  --clusterName prod-cluster-01 \
  --projectId xxxxxxxxxxxxxxxxxx

6.2 时间点恢复(Point-in-Time Recovery)

PITR 是生产数据库最为关键的容灾能力。Atlas 基于 Oplog 将数据变更持续备份,因此可以恢复到过去 24 小时(M10-M40)或过去 7 天(M50+)内的任意一个时间点。

执行 PITR 恢复的步骤:

  1. 在 Atlas 控制台选择 Backups → Snapshots → Point-in-Time Recovery;
  2. 选择目标日期和时间(精确到秒);
  3. 选择恢复到原集群或新集群;
  4. Atlas 自动回放 Oplog 到指定时间点并完成验证。

注意:PITR 恢复到原集群将导致原集群上的数据自目标时间点之后的所有变更全部丢失。生产环境强烈建议恢复到新集群,验证无误后再切换应用连接。

# 使用 API 触发 PITR 恢复到新集群
curl -u "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \
  -X POST \
  "https://cloud.mongodb.com/api/atlas/v1.0/groups/{GROUP-ID}/clusters/{CLUSTER-NAME}/backup/restoreJobs" \
  -H "Content-Type: application/json" \
  -d '{
    "deliveryType": "pointInTime",
    "targetClusterName": "prod-cluster-01-recovery",
    "targetGroupId": "{GROUP-ID}",
    "pointInTimeUTCSeconds": 1723510800,
    "snapshotId": "{SNAPSHOT-ID}"
  }'

6.3 导出到 S3 / Azure Blob / GCS

对于合规审计或冷存档需求,Atlas 支持将备份快照导出到自有的对象存储。

# 使用 Atlas Admin API 配置导出至 AWS S3
curl -u "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \
  -X POST \
  "https://cloud.mongodb.com/api/atlas/v1.0/groups/{GROUP-ID}/clusters/{CLUSTER-NAME}/backup/exports" \
  -H "Content-Type: application/json" \
  -d '{
    "exportBucketId": "{BUCKET-ID}",
    "snapshotId": "{SNAPSHOT-ID}"
  }'

导出后的数据为 BSON 格式,可直接用 mongorestore 恢复到本地 MongoDB 实例。

七、数据迁移:mongodump 与 Atlas Live Migration

7.1 使用 mongodump / mongorestore

mongodump 和 mongorestore 是最经典的迁移工具,适合从自建 MongoDB、其他托管服务或 Atlas 免费层迁移到付费集群。这种方式的缺点是迁移期间会产生停机窗口(dump 和 restore 过程中新写入的数据可能丢失)。

# 从源集群导出
dump
dir=$(date +%Y%m%d_%H%M%S)
mongodump \
  --uri="mongodb+srv://sourceuser:<password>@source-cluster.xxxxx.mongodb.net/mydb" \
  --out="/backup/$dumpdir" \
  --gzip

# 恢复到目标 Atlas 集群
mongorestore \
  --uri="mongodb+srv://targetuser:<password>@target-cluster.yyyyy.mongodb.net/mydb" \
  --gzip \
  --drop \
  "/backup/$dumpdir/mydb"

-mongorestore 使用 --drop 参数会先删除目标库中的同名集合再导入。生产环境迁移前务必在测试集群上验证数据完整性。

对于大规模数据(TB 级别),mongodump/mongorestore 可能过于缓慢,此时应使用 Atlas Live Migration。

7.2 Atlas Live Migration(在线迁移)

Live Migration 是 Atlas 提供的零停机迁移服务。它通过持续读取源集群的 Oplog,将增量数据实时同步到目标 Atlas 集群。整个过程中应用可以继续写入源库,切换连接串时只需要秒级中断。

迁移步骤如下:

  1. 在 Atlas 控制台选择 Migrate Data to this Cluster;
  2. 选择 Live Import from Replica Set;
  3. 填写源集群的 host:port、admin 认证凭据;
  4. Atlas 验证连接并开始全量数据同步;
  5. 同步进度到达 100% 后,Atlas 显示 Ready to Cutover;
  6. 将应用的数据库连接串指向新集群,确认稳定运行后清理旧集群。
// Node.js 应用中实现连接串平滑切换
const mongoose = require('mongoose');

async function connectWithFallback() {
  const atlasUri = process.env.MONGODB_ATLAS_URI;
  const legacyUri = process.env.MONGODB_LEGACY_URI;

  try {
    await mongoose.connect(atlasUri, { serverSelectionTimeoutMS: 5000 });
    console.log('已连接到 Atlas 集群');
  } catch (err) {
    console.warn('Atlas 连接失败,回退到旧集群:', err.message);
    await mongoose.connect(legacyUri);
  }
}

connectWithFallback();

7.3 迁移验证清单

切换到新集群前必须执行以下验证:

  • 集合数量和文档总数是否与源一致;
  • 索引定义是否完整(特别是自定义 collation 和 partial index);
  • 抽样执行核心业务查询,确认性能满足要求;
  • 确认应用的 MongoDB 驱动版本兼容目标集群的 MongoDB 版本;
  • 验证读写关注级别(readConcern / writeConcern)在新集群上是否生效。
# 验证文档数量
mongosh "$ATLAS_URI" --eval "db.getMongo().getDBNames().forEach(d => { print(d + ': ' + db.getSiblingDB(d).stats().objects); })"

# 验证索引
mongosh "$ATLAS_URI" --eval "db.getCollectionNames().forEach(c => printjson(db[c].getIndexes())))"

8.1 Atlas Search 全文搜索

Atlas Search 是基于 Apache Lucene 的全文搜索引擎,内嵌于 Atlas 集群中,与 MongoDB 数据天然集成。相比在 MongoDB 外单独部署 Elasticsearch,Atlas Search 免去了数据同步和额外运维的负担。

Atlas Search 的核心概念:

  • Index:搜索索引,定义了哪些字段可搜索以及字段的分析器类型;
  • Analyzer:文本分词器,中文内容推荐使用 lucene.standard 或自定义配置;
  • Query:使用 $search 聚合管道阶段执行搜索;
  • Highlighting / Scoring:支持高亮匹配片段和自定义相关性评分。

创建一个产品搜索索引:

// 在 Atlas 控制台或 Search Index API 中创建索引
{
  "mappings": {
    "dynamic": false,
    "fields": {
      "name": {
        "type": "string",
        "analyzer": "lucene.standard",
        "folder": "nameFolder"
      },
      "description": {
        "type": "string",
        "analyzer": "lucene.standard"
      },
      "tags": {
        "type": "string",
        "analyzer": "keyword"
      },
      "price": {
        "type": "number"
      }
    }
  }
}

使用 $search 执行产品搜索:

db.products.aggregate([
  {
    $search: {
      index: "product_search",
      compound: {
        must: [
          {
            text: {
              query: "无线耳机 noise cancelling",
              path: ["name", "description"],
              fuzzy: { maxEdits: 1 }
            }
          }
        ],
        should: [
          {
            near: {
              path: "price",
              origin: 500,
              pivot: 100
            }
          }
        ]
      }
    }
  },
  {
    $project: {
      name: 1,
      price: 1,
      score: { $meta: "searchScore" },
      highlights: { $meta: "searchHighlights" }
    }
  },
  { $limit: 20 }
]);

Atlas Search 目前仅支持 Atlas 集群,不支持自托管 MongoDB 或 M0 免费层。M10 是基础可用层级,搜索性能随集群层级提升而增强。

8.2 Atlas Vector Search(向量搜索)

Atlas Vector Search 是 MongoDB 推出的向量数据库能力,专为生成式 AI 和语义检索设计。它将向量嵌入(embeddings)与文档元数据统一存储在 MongoDB 中,支持高效的近似最近邻(ANN)搜索。

典型的 RAG(Retrieval-Augmented Generation)应用流程如下:

  1. 使用 OpenAI、Hugging Face 或自研模型将文本、图像生成向量;
  2. 将向量与原始文档一并存入 MongoDB;
  3. 用户提问时,将问题向量化后在 Atlas Vector Search 中检索最相似的文档;
  4. 将检索到的上下文送入大语言模型生成回答。

创建向量搜索索引:

// 在 Atlas 控制台创建 Vector Search Index
{
  "fields": [
    {
      "type": "vector",
      "path": "embedding",
      "numDimensions": 1536,
      "similarity": "cosine"
    },
    {
      "type": "filter",
      "path": "category"
    }
  ]
}

执行向量搜索:

const { OpenAI } = require('openai');
const { MongoClient } = require('mongodb');

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const mongo = new MongoClient(process.env.ATLAS_URI);

async function searchSimilarDocuments(query, categoryFilter) {
  await mongo.connect();
  const db = mongo.db('knowledge');

  // 将查询文本向量化
  const embeddingResponse = await openai.embeddings.create({
    model: 'text-embedding-3-small',
    input: query
  });
  const queryVector = embeddingResponse.data[0].embedding;

  const results = await db.collection('documents').aggregate([
    {
      $vectorSearch: {
        index: 'vector_index',
        path: 'embedding',
        queryVector: queryVector,
        numCandidates: 100,
        limit: 5,
        filter: { category: { $eq: categoryFilter } }
      }
    },
    {
      $project: {
        title: 1,
        content: 1,
        score: { $meta: 'vectorSearchScore' }
      }
    }
  ]).toArray();

  return results;
}

searchSimilarDocuments('如何优化 MongoDB 查询性能?', 'database');

Atlas Vector Search 与 MongoDB 事务、角色权限、备份恢复完全兼容,能够在同一套基础设施上既处理传统 CRUD 又支持 AI 语义检索。

九、成本优化

9.1 选对集群层级

集群成本是 Atlas 支出的最大项。不同层级的时价差异可达数十倍,需要根据实际负载精确选型:

  • M0:免费,但限制极多,仅用于学习;
  • M10-M20:适用于日均万次查询的小型应用,月费用通常在百元人民币级别;
  • M30-M50:中型应用的标准选择,月费用在千元级别;
  • M60+:大型生产系统或高并发场景,建议先通过 Load Testing 确认性能瓶颈再升级。

Atlas 提供了 Performance Advisor,它自动分析慢查询并推荐索引。合理使用这个工具可以在不升级集群的情况下提升数倍查询性能。

9.2 自动扩展策略

Atlas 支持 Storage Auto-Scaling 和 Compute Auto-Scaling,可以在负载突增时自动扩容。

# 通过 API 启用存储自动扩展
curl -u "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \
  -X PATCH \
  "https://cloud.mongodb.com/api/atlas/v1.0/groups/{GROUP-ID}/clusters/{CLUSTER-NAME}" \
  -H "Content-Type: application/json" \
  -d '{
    "autoScaling": {
      "diskGBEnabled": true,
      "compute": {
        "enabled": true,
        "scaleDownEnabled": true,
        "minInstanceSize": "M10",
        "maxInstanceSize": "M50"
      }
    }
  }'

自动扩容在保障服务可用性的同时避免了手动监控和干预,但要注意设置 maxInstanceSize 上限,防止因流量异常导致费用失控。

9.3 合理利用 Serverless Instance

对于流量波动剧烈、难以预测的场景,Atlas 提供了 Serverless Instance。Serverless 按实际读写操作量计费,无需预先分配固定规格,闲时成本极低。

Serverless 的限制包括:暂不支持分片、仅支持部分 MongoDB 功能子集、高并发时可能遇到冷启动延迟。适合事件驱动型微服务、定时批处理任务或 Dev/Test 环境。

9.4 数据生命周期管理

定期清理过期数据或归档冷数据能显著降低存储成本。MongoDB 的 TTL 索引和 Atlas Online Archive 可以自动化这一过程。

// 创建 TTL 索引,自动删除 90 天前的日志
db.logs.createIndex(
  { createdAt: 1 },
  { expireAfterSeconds: 7776000 }
);

// 使用 Atlas Online Archive 将旧订单归档到 S3
db.orders.updateMany(
  { status: "completed", completedAt: { $lt: new Date(Date.now() - 365 * 24 * 3600 * 1000) } },
  [{ $set: { archived: true } }]
);

9.5 预留实例与年付折扣

对于长期稳定运行的生产集群,购买一年或三年预留实例可以获得显著折扣(通常可达 30% 到 50%)。在 Atlas 控制台的 Billing 页面可以查看预留实例建议和预估节省金额。

# 使用 atlas CLI 查看当前项目账单估算
atlas billing invoices list --projectId xxxxxxxxxxxxxxxxxx

此外,通过合理配置只读节点(Read-Only Nodes)分摊分析查询负载,可以避免主集群过度规格化,也是一种有效的成本优化策略。

总结

MongoDB Atlas 将数据库运维的复杂性完全封装在云平台之下,从集群创建、网络隔离、权限管理到监控告警、备份恢复和数据迁移,都提供了成熟的自动化解决方案。关键要点总结如下:

  • 生产环境务必使用 M10 及以上 Dedicated 集群,M0 仅限开发和测试;
  • 网络层面优先使用 Private Endpoint,其次是 VPC Peering,IP 白名单作为兜底或开发辅助;
  • 权限遵循最小化原则,利用 Atlas 的三层权限模型精确控制访问范围;
  • 监控必须覆盖 Connections、Replication Lag、Disk Utilization、Query Targeting 四大核心指标;
  • 备份策略要包含跨地域复制 + PITR,定期演练恢复流程;
  • 数据迁移首选 Atlas Live Migration 实现零停机切换;
  • 利用 Atlas Search 和 Vector Search 可以将 MongoDB 扩展为通用搜索和 AI 语义检索平台;
  • 成本优化的关键词是:选对层级、自动弹性扩展、TTL 归档、预留实例。

掌握了以上全部内容,你可以构建一套高可用、安全合规、弹性可扩展且成本可控的 MongoDB Atlas 云托管基础设施。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「database」更多文章

  1. 缓存架构演进之路:从单机 Redis 到亿级分布式多级缓存体系
  2. Redis 7.x 重大新特性与架构升级深度解析
  3. Redis 消息队列深度对比:Pub/Sub、Streams 与 Kafka/RabbitMQ 选型指南