Ctrl+Alt+Shift+IWHAT-IF Lab — 针对真实流量测试每个变更
捕获生产环境最后一小时(或最后 72h)的真实流量,通过 PITR 将您的 Cosmos 数据集克隆到 sandbox,应用一个假设的变更(drop/add index、更改 partition key、切换 consistency level、更改计费模式、更改 throughput),并在应用到生产之前查看 5 个维度的影响 — RU、p95 latency、429s、plan-cache hits、月度成本。
它在应用中的位置: Tools → Cosmos DB → WHAT-IF Lab
它做什么
- 通过 Query Cost Inspector(in-app)或 Azure Log Analytics(MongoRequests table)从 app 捕获真实流量。
- 通过 PITR(连续备份 7d/30d)provisioning Cosmos sandbox — 隔离的,对生产无影响。
- 接受最多 5 个同时进行的 mutations:add/drop index、更改 partition key、consistency level、计费模式、每个 collection 的 throughput。
- 针对生产 + sandbox 并行回放捕获的 trace(rate-controlled)。
- 5 个维度的并排 diff:RU 消耗、平均 + p95 latency、throttle 429 计数、query plan cache 命中率、月度美元账单。
- 自动判定(approve / warn / reject),带文本 rationale + audit/compliance 的 JSON 导出。
- 带合成 sandbox 的 "preview" 模式:30 秒内运行,无 Azure 成本(适合探索)。
- "real" 模式:真实的 PITR sandbox,用于生产前的最终确认。
分步
- 1
打开 workspace
菜单 Tools → Cosmos DB → WHAT-IF Lab — Test changes against real workload,或快捷键 Ctrl+Alt+Shift+I。Workspace 从 Step 1:Capture 开始。
- 2
捕获流量
以分钟为单位定义 window(默认 60 — 调整为 1440 = 24h 或 4320 = 72h 以捕获每周周期)。点击 "Capture now"。它从 Query Cost Inspector 的 ring buffer 读取(window 内通过 NoSqlStudio bridge 的所有 queries)。显示总 queries 数、unique shapes、消耗的总 RU、touched namespaces。
window=60 → 捕获 1h 流量 window=1440 → 捕获 24h window=4320 → 捕获 72h(完整的每周周期)
- 3
Stage 一个 sandbox
Wizard 的 Step 2。输入 source Cosmos account 名称。默认 restore point 是 "现在减 1 小时" — 如果想测试旧快照请调整。"preview" 模式使用合成 sandbox(建议用于首次探索)— "real" 模式通过 PITR provisioning 新的 Cosmos account(~30 分钟创建,正常 Azure provisioning 成本)。
preview 模式 → 合成 sandbox,无 Azure 成本,30s 内出结果 real 模式 → 真实的 PITR sandbox,~30min,正常 Azure 成本
- 4
配置 WHAT-IF mutations
Step 3。带 schema 验证的 inline JSON 编辑器。最多 5 个同时 mutations。每个 mutation 有自己的 "kind" 和参数。请参阅下面的示例。
[ { "kind": "add-index", "ns": "app.orders", "key": { "tenantId": 1, "createdAt": -1 } }, { "kind": "drop-index", "ns": "app.orders", "indexName": "text_search_v1" }, { "kind": "change-partition-key", "ns": "app.events", "newPath": "userId", "strategy": "recreate" }, { "kind": "consistency", "level": "Session" }, { "kind": "mode", "mode": "autoscale", "autoscaleMaxRu": 4000 }, { "kind": "throughput", "ns": "app.orders", "ruPerSec": 2000 } ] - 5
Quick Estimate 或 Full Replay
Quick Estimate = 基于启发式 + 捕获期间观察到的值,~5 秒内回答。在调整 mutation 时快速迭代很有用。Full Replay = 将 trace 的每个 query 并行运行 "before" 和 "after",测量所有内容。耗时与 trace 大小成正比;1000 queries ~30s,100k queries ~5min。
- 6
阅读 5 维 diff
Step 5。带 before/after + delta % 的并排 cards:消耗的总 RU、avg/p95 latency(ms)、throttles 429 计数、plan-cache 命中率、预计月度 USD。每个 per-query shape 还显示按 RU 排名的单独影响。顶部判定:APPROVE / WARN / REJECT,带文本 rationale。
- 7
导出报告
"Export JSON" 按钮保存完整报告(planId、mutations、summary、per-query)。用途: • 在 change management 工单中记录决定 • 如果有成本节省,与 finance 共享 • 用于合规的审计跟踪(SOC 2 / ISO 27001)
- 8
在生产中应用(批准后)
NoSqlStudio 不会自动应用 — 您离开 WHAT-IF Lab,打开相应的 workspace(Index Policy Editor、Throughput Optimizer 等)并手动应用。这种分离是有意的:WHAT-IF 是决策;应用是行动。
真实用例
案例 A — 确认每月节省 R$ 4.8k
DBA 怀疑在 `app.orders` 上添加 composite index `{tenantId, createdAt}` 会节省 RU。用 `add-index` 运行 WHAT-IF。结果:RU -47%(-200k RU/mo),latency -12ms p99,USD 账单 -R$ 4.847/mo。以 96% 置信度 APPROVE。审计 JSON 导出。次日在生产中应用。
案例 B — 在引发事故前变更被拒绝
平台团队提议将 `app.events` 中的 partition key 从 `userId` 改为 `region`(看起来更 "均匀")。WHAT-IF:RU +112%,窗口中 0 → 843 throttles,p99 latency +180ms。REJECT。工程师省了一次为恢复而打的午夜电话。
案例 C — autoscale 与手动决策
CFO 询问 app 是否可以迁移到 autoscale。DBA 针对过去 30 天用 `mode: autoscale, autoscaleMaxRu: 8000` 运行 WHAT-IF。结果:账单 -R$ 1.2k/月,latency/throttle 相同。APPROVE。
案例 D — 模拟 consistency 放松
Engineering 希望从 Strong 降级到 Session consistency 以改善 latency。DBA 运行 WHAT-IF + 提交给 compliance:RU -22%,p99 -41ms,附加 semantics 文档。Compliance 基于报告 sign off。
FAQ
运行一个 WHAT-IF 会话需要多少成本?
Preview 模式 = $0(带启发式的合成 sandbox)。Real 模式 = 通过 PITR provisioning 临时 Cosmos account 的成本 — 通常 $5–$20/小时,取决于 source 层级。NoSqlStudio 在关闭 workspace 时自动销毁 sandbox。
preview 模式的准确性可靠吗?
Preview 模式在 "原子" 变更(drop 一个 index、add 一个简单 index、更改 consistency)上提供 70-90% 的准确性。对于组合变更(partition key + throughput + index),我们建议在应用到生产之前用 real 模式验证。
我可以捕获超过 72h 的流量吗?
可以 — 不使用 in-app ring buffer(限制 ~500 queries),指向 Azure Log Analytics:`MongoRequests` 表累积 30+ 天。在 Cosmos Optimizer → Diagnostic Logs(KQL templates)中配置 workspace URL。
Microsoft 有类似的东西吗?
没有。Azure Cosmos DB Insights 显示回顾性指标,但不模拟变更。Atlas Performance Advisor 建议 indexes,但不针对真实 workload 运行 WHAT-IF。第三方工具(Studio 3T、DataGrip 等)都不涵盖这些。
WHAT-IF 尊重我的 isolation 级别吗?
是的。Replay 引擎是 stateless 的,从不触及生产 — 仅通过 in-app log 或 Log Analytics 读取数据。Sandbox 通过 PITR account 完全隔离。Replay 的任何 query 都不会影响您的生产账户。
如何与合规 / SOC 2 集成?
每次执行生成一个不可变的 JSON,带 timestamp、planId、应用的 mutations、summary、per-query 结果。保存到审计日志 + 用 Ed25519 签名(使用 Compliance Reports workspace)。