4. 演练环境与生产隔离

故障演练最大的风险不是演练本身失败,而是演练动作意外穿透到生产环境。因此,演练环境的第一设计原则不是"像生产",而是"与生产可控隔离"。本节围绕影子集群、流量复制、数据脱敏、资源配额与安全边界五个维度,说明如何搭建一个既能真实复现故障、又不会污染生产数据的演练环境。

一、影子集群:结构对齐,物理隔离

影子集群是与生产集群拓扑、版本、分片策略、副本集配置保持一致的独立 MongoDB 部署,但它运行在独立的网络域、独立的存储和独立的账号体系下。结构对齐的目的是让演练中观察到的行为(如选举耗时、写关注阻塞、分片迁移速度)具备参考价值;物理隔离的目的是让任何演练动作都无法触达生产。

搭建影子集群时,建议对齐以下参数:MongoDB 大版本与小版本、副本集成员数量与优先级配置、分片键与 chunk 分布策略、writeConcern 与 readConcern 默认值、索引集合、以及关键集合的文档规模量级。规模不必完全一致,但量级差异过大会导致慢查询、内存压力等演练结论失真。例如生产是 3 分片 × 3 副本、单集合约 8000 万文档,影子集群可缩为 3 分片 × 3 副本、单集合约 800 万文档,保持分片与副本结构一致,仅缩小数据量。

二、流量复制:只读回放,避免写污染

流量复制的目标是把生产的真实访问模式引入影子集群,用于验证索引有效性、连接池压力和慢查询表现。常见做法是从生产 mongod 的慢查询日志或 mongos 的 profiler 输出中提取操作样本,经脱敏后回放到影子集群。

回放时必须区分读操作与写操作。读操作(find、aggregate、count)可以安全回放;写操作(insert、update、delete)若直接回放会改变影子集群数据状态,导致后续演练基线漂移。推荐做法是将写操作转换为"影子写":在影子集群中写入独立的影子集合,或仅统计写操作的频率与文档大小,不真正落库。下面是一个从 profiler 提取并过滤写操作的示例:

// 从生产 profiler 导出近 1 小时操作样本(只读权限)
db.system.profile.find(
  { ts: { $gte: new Date(Date.now() - 3600*1000) } },
  { op: 1, ns: 1, "command.filter": 1, millis: 1, ts: 1 }
).forEach(function(doc) {
  // 仅保留读操作,写操作单独统计
  if (["find", "aggregate", "count"].indexOf(doc.op) >= 0) {
    printjson(doc);
  }
});

回放工具可选用 mongoreplay 或自研脚本,回放速率建议从生产峰值的 30% 起步,逐步提升到 100%,观察影子集群的 CPU、内存、连接数与慢查询数量变化,判断影子集群是否具备承载生产级流量的能力。

三、数据脱敏:字段级替换,保持分布特征

影子集群的数据若直接来自生产备份,会携带真实用户信息,存在合规风险。脱敏不是简单地把字段清空,而是要在去除敏感信息的同时保留数据的分布特征,否则索引选择性和查询计划会失真。

脱敏策略按字段类型区分:手机号、身份证号、邮箱等标识类字段用格式保持的随机值替换;金额、数量等数值字段用同量级的随机扰动替换;枚举类字段保持取值集合不变,仅打乱映射关系。例如手机号可替换为 138****0000 到 138****9999 之间的随机号,保持 11 位长度与前缀分布;金额字段可在原值 ±15% 范围内随机浮动,保留量级与小数位。

脱敏应在数据导入影子集群之前完成,而不是在影子集群内做视图或聚合脱敏,否则原始敏感数据仍会落盘。

四、资源配额与安全边界

资源配额用于防止演练动作耗尽影子集群资源而影响其他演练任务。建议为影子集群设置独立的 cgroup 或容器资源限制,明确 CPU 核数、内存上限、磁盘 IOPS 与网络带宽。例如限制单节点 8 核、32GB 内存、磁盘 500GB,并在演练前记录基线指标,演练中若 CPU 持续超过 85% 或内存超过 90%,应暂停演练并排查是否为演练动作导致。

安全边界控制则从网络、账号、操作三个层面收口。网络层面,影子集群部署在独立 VPC 或子网,仅允许演练跳板机访问,禁止与生产网段互通;账号层面,演练账号只授予目标数据库的读写权限,禁止 root、hostManager、clusterAdmin 等管理角色;操作层面,禁止在影子集群执行 shutdown、dropDatabase、replSetReconfig 等高风险命令,或将其纳入审批白名单。

生产环境(隔离域 A) 生产 MongoDB 集群 3 分片 × 3 副本 · 8000 万文档 Profiler / 慢查询日志 读操作样本 + 写操作频率统计 生产数据备份 含真实用户信息 · 需脱敏 生产账号体系 root / clusterAdmin · 禁止复用 安全边界(不可穿越) 独立 VPC · 网段不互通 禁止 shutdown / dropDatabase 禁止 replSetReconfig 等管理命令 隔离与脱敏通道 读回放 脱敏 影子集群(隔离域 B) 影子 MongoDB 集群 3 分片 × 3 副本 · 800 万文档 流量回放引擎 mongoreplay · 30%→100% 速率 脱敏后数据集 格式保持 · 分布特征保留 演练专用账号 仅目标库读写 · 无管理角色 资源配额 CPU 8 核 · 内存 32GB · 磁盘 500GB CPU > 85% 或内存 > 90% 暂停演练 独立 cgroup / 容器资源限制 结构对齐 · 物理隔离 · 只读回放 · 字段脱敏 · 配额约束 · 权限收口

五、演练前的隔离检查清单

在正式启动演练前,建议逐项确认以下内容,任何一项不满足都应暂停演练:

检查项 确认标准 不通过的处理
网络连通性 影子集群与生产网段无路由可达 调整安全组或 VPC 路由,重新验证
账号权限 演练账号无 root、clusterAdmin 角色 回收角色,重建最小权限账号
数据脱敏 抽样检查敏感字段已替换,分布特征保留 重新执行脱敏脚本并抽样复核
资源配额 cgroup 限制已生效,基线指标已记录 补齐限制并记录 CPU、内存、IOPS 基线
高风险命令 shutdown、dropDatabase 等已禁用或审批 加入命令白名单或审批流程
回放速率 从 30% 起步,具备逐步提升的观察机制 调整回放脚本,增加速率阶梯
影子集群的"结构对齐"不等于"配置完全复制"。生产集群中可能存在历史遗留的索引、过期的分片标签或临时调整的参数,这些不应盲目复制到影子集群,否则会把生产的历史包袱带入演练环境,干扰对故障根因的判断。