跳转到内容
← Cosmos workspace

DBA 手册 — Cosmos Optimizer 分步

用真实生产 cluster 演练 Cosmos Optimizer 的每个 pane。对于每个屏幕:它显示什么、如何测试它、预期什么、当有问题时如何 troubleshoot。

§0 先决条件

在打开 Optimizer 之前,完成设置指南。没有凭据,每个指标 pane 显示 NO SOURCE 并回退到 Local samples(仅 NoSqlStudio 本身查询过的内容)。

  1. 端到端遵循 Cosmos 监控设置:Service Principal、RBAC 角色分配、Resource ID、Cloud Credentials。 Cosmos 监控设置.
  2. 使用 az login --service-principal 和 az monitor metrics list 验证 SP 可以读取您 Cosmos 账户的指标。
  3. 打开 NoSqlStudio → 连接到 Cosmos 账户 → 打开 Tools → Cosmos DB → Cosmos Optimizer(或 Ctrl+Alt+Shift+O)。

§1 5 分钟冒烟测试 — 确认一切已接入

目标:5 分钟内确认 Azure Monitor 正在向 NoSqlStudio 提供真实数据。如果任何步骤失败,跳到 §3 Troubleshooting。 §3 Troubleshooting.

  1. 在 NoSqlStudio 中连接到您的 Cosmos 账户。确认您在 sidebar 中看到 database 树。
  2. 打开 Cosmos Optimizer。如果凭据缺失,intro banner 应显示 CONFIGURE DATA SOURCES 按钮,如果已保存则直接显示 pane 内容。
  3. 前往 RU Budget。Source-mode banner 应在 2 秒内以绿色显示 AZURE MONITOR — aggregate only。点击 Refresh。1-2 分钟内您应看到非零的 Consumed(avg)。
  4. 点击每个 tab(Query Cost、Hot Partitions、Index Policy、Throughput Optimizer、Throttling RCA、Diagnostic Logs、Composite Index、PITR Restore、Migration Wizard)。任何都不应抛出红色错误。
  5. 打开 DevTools 控制台(F12)— 不应包含 ChainedTokenCredential authentication failed 或 monitor client is null。
预期
所有十个 pane 加载,RU Budget 在 2 分钟内显示真实 RU/s,控制台中无 auth 错误。如果是,您已 production-ready。

§2 每个 pane 的演练

每个 pane 一个章节。每个都有:截图(可用时)、它显示什么、分步测试、繁忙生产 cluster 上的预期结果,以及常见问题的 troubleshooting 注释。

§2.1

RU Budget

FREE TIER
RU Budget pane:实时消耗、利用率、24h 预测、per-collection 表格
RU Budget pane:实时消耗、利用率、24h 预测、per-collection 表格

您的 Cosmos 账户消耗的 RU/s 与您设置的 budget 的实时视图。24h Holt-Winters 预测。比较 manual / autoscale / serverless / reserved 的 Recommendation card。

测试步骤

  1. 将 RU/s budget 设置为您账户的 provisioned 吞吐量(例如 database-level 5k RU/s provisioning 设为 5000)。
  2. 点击 Refresh。
  3. 观察 Consumed(avg):在活动 cluster 上应非零。与您在 Azure Portal 的 Metrics → NormalizedRUConsumption 中看到的值进行比较。
  4. 检查 Utilisation 徽章颜色:绿色 = 低于 65%、黄色 = 65-85%、红色 = 高于 85%。红色意味着紧急考虑 scale-up。
  5. 阅读 Recommendation card。常见输出:steady workloads → RESERVED-3Y、spiky → AUTOSCALE、low-volume bursts → SERVERLESS。
  6. 滚动到 Per collection(preview)。仅使用 Azure Monitor 时,您看到单个实例行汇总所有内容 — per namespace 需要 Log Analytics(PAID tier)。
预期
在繁忙 cluster 上:消耗 495 RU/s avg、5000 budget 的 9.9% 利用率、绿色的 WITHIN BUDGET 徽章。Recommendation:RESERVED-3Y,预计节省 $32.9K/mo。
Troubleshoot
AZURE MONITOR 绿色 banner 显示 0 RU/s = cluster 在 15 分钟窗口中真正空闲,或 adapter mapping 返回错误指标。用 az monitor metrics list --metric TotalRequestUnits 确认 — 如果 CLI 显示非零,提交 NoSqlStudio bug。NO SOURCE banner = 凭据未注册。重新加载(Ctrl+R)应用,重新打开 Cloud Credentials,再次点击 Save。
§2.2

Query Cost Inspector

ALWAYS-ON
Query Cost pane:从 x-ms-request-charge 捕获的 per-query RU 成本 ring buffer
Query Cost pane:从 x-ms-request-charge 捕获的 per-query RU 成本 ring buffer

捕获您通过 NoSqlStudio 运行的每个 query 的 x-ms-request-charge 响应头。零 Azure API 调用 — 纯客户端检测,始终可用。

测试步骤

  1. 针对 Cosmos collection 打开 Shell 或 Query tab。
  2. 运行繁重 query,例如 db.Deals.find({ status: 'closed' }).limit(100) 或 db.Deals.aggregate([{$match:{}}, {$group:{_id:'$status', n:{$sum:1}}}])。
  3. 返回 Query Cost tab。Top query shapes 应填充 shape、总 RU、平均 RU、p95、max 和 count。
  4. 运行相同的 shape 5+ 次以正确填充 count 和 p95。
  5. 使用右上角的 filter 输入框缩小到 ns 或 shape 子串。
预期
每个新 query 立即出现(无 Azure 延迟)。Ring buffer 上限为 500 entries(最旧的被丢弃),持续到应用重启 — 不持久化到磁盘。
Troubleshoot
Queries 运行但不出现:确认您是通过 NoSqlStudio 运行 query(不是通过另一个窗口的 mongosh 或应用代码)。捕获 hook 只在 NoSqlStudio 的 DataService 上。
§2.3

Hot Partition Detector

ALWAYS-ON
Hot Partitions pane:按 partition key 的文档数 heatmap + skew 检测
Hot Partitions pane:按 partition key 的文档数 heatmap + skew 检测

主动探测,按您的 partition key 对文档分组,并按文档数对结果分区进行排名。在它变成 429 throttle 风暴之前发现 skew(一个分区持有 40%+ 的文档)。

测试步骤

  1. 填写 Namespace:db.coll 格式,例如 catalog.products。
  2. 填写 Partition key path:创建 collection 时您用作 shardKey 的字段名,例如 tenantId。
  3. 点击 Scan。这在 Cosmos 上运行 $group aggregation — 消耗的 RU 与 collection 大小成正比。在 200 GB collection 上预计 100-500 RU。
  4. 阅读右上角的 spread 徽章:绿色 = 均匀分布、黄色 = 适度 skew、红色 = 严重 skew(top partition > 40% 的文档)。
  5. 使用 heatmap 发现特定的热分区。在任意单元格上 hover 以获取确切的键值 + 文档数。
预期
对于具有数百个 tenants 的 tenant-sharded collection:绿色 spread(无 tenant 占主导)。对于一个大客户占 60% 数据的 org-sharded collection:红色徽章,heatmap 上一个深红色单元格。
Troubleshoot
No DataService bound = 连接丢失或此连接的插件未加载。重新连接。Scan 出错 16500: TooManyRequests = 您的 collection 现在没有足够的 RU 来运行 aggregation。临时增加 RU 或在低流量期间扫描。
§2.4

Visual Index Policy Editor

ALWAYS-ON
Index Policy 编辑器:带 include/exclude 复选框的 schema 树 + JSON 预览
Index Policy 编辑器:带 include/exclude 复选框的 schema 树 + JSON 预览

Cosmos 默认索引每个属性 — 每个 write 为每个索引属性消耗 1 RU。排除从不查询的 paths 可以在 document-heavy collections 上减少 30-70% 的 write RU 消耗。

测试步骤

  1. 填写 Namespace,例如 catalog.products。
  2. 点击 Sample schema。NoSqlStudio 读取 100 个文档并构建所有 field paths 的树。
  3. 取消选择从不出现在 WHERE / filter 子句中的任何字段 — 想想 imageBase64、fullText、metadata.audit.* 等。
  4. 点击 Save draft。JSON 预览更新为提议的 indexingPolicy。
  5. 复制 JSON,通过 shell 应用:db.runCommand({collMod: 'products', indexingPolicy: <paste>})。
预期
在典型的电商 products collection 上(50+ 字段,仅 5 个被查询),您可以在 ~40 个 paths 上 drop 索引。Write 成本从 ~50 RU/insert 降到 ~10 RU/insert。
Troubleshoot
Sample schema 返回空树 = collection 为空(无文档可推断 schema)。首先插入一个有代表性的文档。
§2.5

Throughput Optimizer + Bill Simulator

FREE TIER
Throughput Optimizer:workload 分类器 + 5 种模式的账单比较 + Reserved Capacity quote
Throughput Optimizer:workload 分类器 + 5 种模式的账单比较 + Reserved Capacity quote

从最近 15 分钟的指标对您的 workload 进行分类(STEADY / SPIKY / CYCLIC / RAMP),然后并排模拟 5 个 Cosmos 计费模式的月度账单。底部 Reserved Capacity quote。

测试步骤

  1. 点击右上角的 Refresh。
  2. 阅读 Workload classification card。常见输出:STEADY(低方差,CV < 0.4)、SPIKY(CV > 0.8,推荐 autoscale)、CYCLIC(可预测的每日峰值,推荐带 scheduled scale 的 reserved)。
  3. 比较 5 个 Monthly bill cards。带 RECOMMENDED 徽章的最便宜的是算法的选择。
  4. 在 manual card 上查找红色 THROTTLED banner:表示您当前的 p95 超过模拟的 tier 并会导致 429s。
  5. 滚动到 Reserved capacity quote:要承诺的具体 RU/s 数字 + 与 manual 相比的月度节省。
预期
STEADY workload(CV=0.27,p95=962 RU/s)→ 推荐 RESERVED-3Y $38.14/mo vs manual $58.68/mo → 每年节省 $134。对于 1000-tenant SaaS,这是真实利润。
Troubleshoot
已知 bug(2026 年 5 月):由于 simulator 中的单位错误,autoscale card 有时显示格式错误的总数(例如 $41.9K/mo)。其他 4 个 cards 是正确的。修复待定 — 在项目看板上跟踪。
§2.6

Throttling RCA

FREE TIER
Throttling RCA:429 计数、peaks、sparkline + 关联的可疑 queries
Throttling RCA:429 计数、peaks、sparkline + 关联的可疑 queries

通过 Azure Monitor 计数最近 window 中的 429(rate-limited)响应,然后将每个 burst 与 Query Cost ring buffer 中捕获的 queries 关联。Surface 出 429 window 期间累积 RU 最高的 query shape — 可能的元凶。

测试步骤

  1. 点击 Refresh。阅读 Total 429s、429 events 和 Peak / interval。
  2. 设置 Window ± minutes 输入(默认 5)。降低以获得更紧密的关联,如果没有 query 落在 window 中则提高。
  3. 滚动到 Suspect queries。每行 = 一个 429 burst,带在 burst 的 ± window 分钟内运行的最昂贵 query shape,带置信度得分(0-1)。
  4. 如果为空:打开 Query Cost Inspector tab 并运行流量。没有 query captures,RCA 无法关联任何内容。
预期
在 15 个事件中显示 372.9K 总 429s(peak 41.7K)的繁忙生产 cluster 显著 throttled。运行代表性 queries ~5 分钟后,您应看到至少一个 shape 的 Suspect queries 填充,置信度 > 0.5。
Troubleshoot
429 计数高但 Suspect queries 为空 = 流量通过应用服务器(不是 NoSqlStudio)。要么在 Shell 中运行已知不良 query 以捕获它,要么升级到 Log Analytics(PAID)通过 KQL 进行完整的 per-shape RCA。
§2.7

Diagnostic Logs(KQL templates)

PAID TIER
Diagnostic Logs:针对 MongoRequests 表的 10 个即用 KQL templates
Diagnostic Logs:针对 MongoRequests 表的 10 个即用 KQL templates

针对您 Log Analytics workspace 中的 Cosmos Diagnostic Logs 的 10 个即用 Kusto queries。需要 PAID tier(Diagnostic Settings 已启用,Log Analytics workspace ID 已配置)。

测试步骤

  1. 验证 AZURE MONITOR banner 显示 upgrade available: Log Analytics。如果您未插入 workspace ID,此 pane 显示 NO SOURCE,Run in app 按钮被禁用。
  2. 点击任意 template card(例如 Slow queries — last 1 hour)将其 KQL 加载到编辑器中。
  3. 点击 Edit 内联调整 KQL(例如将 ago(1h) 改为 ago(24h))。
  4. 点击 Run in app。结果表在 2-5 秒内在下方渲染。
  5. 对于长篇分析,点击 Open in portal 将 query 深度链接到 Azure Portal KQL 编辑器。
预期
Slow queries template 返回最慢 Mongo requests 的 50 行,带 durationMs 列。Top entries 通常与 Throttling RCA 中的相同 shapes 相关联。
Troubleshoot
尽管有已知负载但结果为空 = Cosmos 账户上的 Diagnostic Settings 可能没有启用 MongoRequests log 类别,或自启用以来 < 5 分钟延迟。403 Forbidden = SP 需要 workspace 上的 Log Analytics Reader 角色。
§2.8

Composite Index Recommender

ALWAYS-ON
Composite Index:检测缺少 compound indexes 的多字段 query shapes + JSON 片段生成器
Composite Index:检测缺少 compound indexes 的多字段 query shapes + JSON 片段生成器

观察 Query Cost ring buffer,识别触及 2+ 字段但缺少相应 composite index 的 query shapes,预测约 60% 的 RU 节省,发出可粘贴到 Cosmos indexingPolicy 的 JSON 片段。

测试步骤

  1. 设置 Min queries to consider = 5(默认)。考虑某 shape 值得推荐的阈值。
  2. 通过 NoSqlStudio 运行代表性 queries ~5 分钟。多字段 filter 示例:{tenantId: X, status: Y}、{userId: A, createdAt: {$gte: ...}}。
  3. 返回这里。Recommendations 列表填充 shape + 预计 RU 节省 + JSON 片段。
  4. 点击任意推荐上的 Copy JSON,通过 collMod 粘贴到您的 Cosmos collection 的 indexingPolicy 中。
预期
对于按 {tenantId, status, createdAt} 过滤 5+ 次的电商应用:1 个推荐,每个 query ~60% RU 减少,JSON 片段可粘贴。
Troubleshoot
尚未捕获多字段 query 模式 = Query Cost ring buffer 为空,或仅捕获了单字段 shapes。运行更多样化的 queries。
§2.9

Point-in-Time Restore

WIZARD
PITR Restore wizard:account / timestamp / target / region 表单 + CLI 预览
PITR Restore wizard:account / timestamp / target / region 表单 + CLI 预览

灾难恢复 wizard。在 Cosmos continuous-backup window 中选取一个点(根据配置的策略 7 或 30 天),生成 az cosmosdb restore CLI 命令,可选地通过 host shell 执行。

测试步骤

  1. 填写 Account(Cosmos 账户名称)。
  2. 通过 slider 或 ISO-8601 输入设置 Restore timestamp。默认:现在减 1 小时。
  3. 填写 Target account name(必须是新的 — 不能覆盖 source)和 Region。
  4. 点击 Validate plan。NoSqlStudio 运行 az cosmosdb show-backup-information 确认该 timestamp 存在备份。返回绿色 check 或红色 error。
  5. 准备就绪后点击 Run via host shell(az-cli)。Restore 对于典型 collections 需要 30-90 分钟。
预期
对于真实的 DR drill:validate plan 在 5 秒内成功,显示 backup 大小 + timestamp 确认。实际 restore 异步运行 — 在 portal 中监控。
Troubleshoot
Account does not have continuous backup enabled = 您处于定期备份模式。PITR 需要账户创建时 --backup-policy-type Continuous,或迁移到 continuous 模式。
§2.10

Migration Wizard Atlas ↔ Cosmos

WIZARD
Migration Wizard:双向 Atlas ↔ Cosmos,带 translation matrix + script 生成器
Migration Wizard:双向 Atlas ↔ Cosmos,带 translation matrix + script 生成器

双向 migration 助手。选择 source + target(Atlas → Cosmos 或 Cosmos → Atlas),显示 translation matrix(变为不支持的 features),预测目标上的月度账单,生成 mongosh script。

测试步骤

  1. 选择 Source 和 Target:Atlas → Cosmos 或反之。
  2. 阅读 Translation matrix:迁移后不保留的 features(例如 Atlas Search → Cosmos:通过 NoSqlStudio 多 DB 引擎本地工作,而非原生;Cosmos PITR → Atlas:由 Atlas cluster snapshots 替代)。
  3. 检查 Bill projection:基于您当前 workload 的目标上的估计月度成本。
  4. 点击 Generate script。输出是一个带 insertMany 批次和进度报告的 mongosh script。
  5. 对于真实迁移,先在测试 collection 上 dry-run(Cosmos 在迁移期间对 inserts 收取 write RU!)。
预期
Translation matrix 列出 ~5-10 个 features 及其状态(works/dropped/replaced)。Bill projection 在简单 workloads 上 ±30% 内。
注意
对于多 TB 迁移,请使用 Azure Data Factory 或 Cosmos 的原生迁移工具 — 此 wizard 针对较小/单点迁移和 DR 场景。
§2.11

Cloud Credentials

ALWAYS-ON
Cloud Credentials:AWS DocDB + Azure Service Principal + Log Analytics workspace ID
Cloud Credentials:AWS DocDB + Azure Service Principal + Log Analytics workspace ID

用于决定哪些数据源为每个其他 pane 提供数据的控制面板。三个层级:TIER C local(始终开启)、TIER B Azure Monitor(FREE)、TIER A Log Analytics(PAID)。

测试步骤

  1. 确认如果您保存了凭据,TIER B card 显示 CONFIGURED 徽章。
  2. 敏感字段(Resource ID、Tenant ID、Client ID、Client Secret、Workspace ID)显示为带 Edit 按钮的 •••••••XXXX 掩码。点击 Edit 显示 + 更改,然后 Mask 再次隐藏。
  3. Save 后:每个指标 pane 上的 source-mode banner 在 < 100 ms 内翻转为 AZURE MONITOR(通过内部事件),或最多 15 s(通过 poll 回退)。
  4. Clear 按钮(红色)从磁盘擦除此连接的凭据 + 移除 bridge — 一切恢复为 NO SOURCE / Local samples。
预期
Cloud Credentials 面板在每个已保存的凭据旁显示绿色状态点,并且 Operations Center 可以与 Log Analytics + Azure Monitor 无错误通信。
注意
凭据通过 Electron safeStorage 加密存储(macOS 上为 OS keychain、Windows 上为 DPAPI、Linux 上为 libsecret)。文件位于 %APPDATA%/NoSqlStudio Dev Local/CloudCredentials/&lt;connectionId&gt;.bin。

§3 Troubleshooting 矩阵

症状可能原因修复
RU Budget 上的 NO SOURCE bannerBridge 未为此连接注册(凭据保存后 renderer reload)。打开 Cloud Credentials,再次点击 Save。Lazy-register 在正常操作中在 workspace mount 时自动触发;需要时通过 re-save 强制。
AZURE MONITOR 绿色 banner 但 0 RU/sAuth chain 静默失败(DefaultAzureCredential 回退)或指标 mapping bug。打开 DevTools(F12)。查找 [azure-cosmos-adapter] 日志。如果您看到 ChainedTokenCredential failed:Cloud Credentials 中的 Client Secret 为空,填写它。如果您看到 metrics.list 401/403:SP 缺少 Monitoring Reader 角色。
Cloud Credentials Save 绿色 toast,但 reload 后 RU Budget 仍显示 NO SOURCEnode_modules 中缺少 adapter SDK 包(@azure/arm-monitor、@azure/monitor-query)。用 node -e "require('@azure/arm-monitor')" 验证。如果缺失,在 Compass repo 中运行 npm install --no-save @azure/arm-monitor @azure/monitor-query(声明为 optionalDependencies,所以 npm 有时会跳过它们)。
构建时 Cannot find module 'semver/preload' 错误hadron-build / @mongodb-js/devtools-github-repo 中的 Node 24 × semver 6.x 不匹配。创建 shim:node_modules/semver/preload.js,内容为 module.exports = require('./semver.js')。或降级到 Node 22.21.1(Compass 工作流测试的版本)。
Diagnostic Logs(KQL)显示 NO SOURCELog Analytics workspace ID 未配置(PAID tier 未接入)。决定:您是否需要 per-shape KQL?如果需要,在 Cosmos 上启用 Diagnostic Settings → stream 到 Log Analytics,将 workspace GUID 粘贴到 Cloud Credentials。如果不需要,接受此 pane 被锁定 — Throttling RCA 和 RU Budget 仍通过 Azure Monitor 工作。
Query Cost / Composite Index 为空尚未通过 NoSqlStudio 运行任何 query(或所有 queries 都通过应用外的 mongosh)。在 NoSqlStudio 内针对您的 collection 运行实际 queries(Shell 或 Query tab)。Cost 捕获 hook 位于 NoSqlStudio 的 DataService 上 — 它只看到通过它的内容。
Autoscale card 显示无意义的数字如 $41.9K/moBill simulator 的 autoscale 计算中的已知 bug。其他 4 个 cards(manual / serverless / reserved-1y / reserved-3y)是准确的。忽略 autoscale 数字 — 修复计划在下一版本。
所有 panes 的滚动在内容中间被切断LeafyGreen &lt;Tab&gt; 不传播 height — 是 2026 年 5 月 25 日之前的布局 bug。更新到最新的 NoSqlStudio 构建 — 修复在 scrollStyles 中,带显式 maxHeight: calc(100vh - 320px)。
Hot Partitions scan 返回 16500: TooManyRequestsAggregation 被 throttled,因为 cluster 现在缺少 RU 余量。临时提高 RU/s,运行 scan,然后缩回。或将 scan 安排到非高峰时段。
尽管 429 计数高,Throttling RCA "Suspect queries" 为空流量来自应用服务器 / 其他客户端,而非 NoSqlStudio。要么在 NoSqlStudio shell 中重放已知不良 queries 以填充 ring buffer,要么升级到 Log Analytics(PAID)通过 KQL 进行完整的 per-shape 关联。