综合场景面试题#

1. 千万级商城系统架构设计#

问题: 假设我们要部署一个日活千万级的商城系统,请画出从 DNS -> CDN -> Nginx -> K8s(Java App) -> Redis -> MySQL 的全链路架构,并说明每一层的容灾方案。

答案:

架构图#

用户请求
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│                         DNS 层                               │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  DNSPod     │  │  Cloudflare │  │  Route53    │         │
│  │  (主)       │  │  (备)       │  │  (备)       │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
│                    智能解析 + 故障转移                        │
└─────────────────────────────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│                         CDN 层                               │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │ 阿里云 CDN  │  │ 腾讯云 CDN  │  │ CloudFront  │         │
│  │ (静态资源)  │  │ (静态资源)  │  │ (静态资源)  │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
│         静态资源缓存 + DDoS 防护 + 就近访问                    │
└─────────────────────────────────────────────────────────────┘
    │
    ▼ (动态请求)
┌─────────────────────────────────────────────────────────────┐
│                       接入层 (L7)                            │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    Nginx 集群                        │   │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐             │   │
│  │  │ Nginx 1 │  │ Nginx 2 │  │ Nginx 3 │  + Keepalived │   │
│  │  │ (Master)│  │(Backup) │  │(Backup) │    (VIP漂移)  │   │
│  │  └─────────┘  └─────────┘  └─────────┘             │   │
│  │         负载均衡 + SSL 卸载 + 限流 + WAF             │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│                      应用层 (K8s)                            │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              Kubernetes 集群                         │   │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐  │   │
│  │  │   Node 1    │  │   Node 2    │  │   Node 3    │  │   │
│  │  │ ┌─────────┐ │  │ ┌─────────┐ │  │ ┌─────────┐ │  │   │
│  │  │ │ Java Pod│ │  │ │ Java Pod│ │  │ │ Java Pod│ │  │   │
│  │  │ │ x3      │ │  │ │ x3      │ │  │ │ x3      │ │  │   │
│  │  │ └─────────┘ │  │ └─────────┘ │  │ └─────────┘ │  │   │
│  │  └─────────────┘  └─────────────┘  └─────────────┘  │   │
│  │         HPA 自动扩缩容 + 多可用区部署 + 健康检查        │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────────────────────────────┐
│                      缓存层 (Redis)                          │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              Redis Cluster 集群                      │   │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐             │   │
│  │  │ Master 1│  │ Master 2│  │ Master 3│             │   │
│  │  │ Slave 1 │  │ Slave 2 │  │ Slave 3 │             │   │
│  │  └─────────┘  └─────────┘  └─────────┘             │   │
│  │         6 节点集群 + 读写分离 + 自动故障转移          │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
    │ (缓存未命中)
    ▼
┌─────────────────────────────────────────────────────────────┐
│                      数据库层 (MySQL)                        │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              MySQL 主从集群                          │   │
│  │  ┌─────────────┐      ┌─────────────┐              │   │
│  │  │   Master    │─────▶│   Slave 1   │              │   │
│  │  │  (写 + 读)  │      │   (只读)    │              │   │
│  │  │  + MHA      │─────▶│   Slave 2   │              │   │
│  │  │             │      │   (只读)    │              │   │
│  │  └─────────────┘      └─────────────┘              │   │
│  │         主从复制 + MHA 高可用 + 读写分离             │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

各层容灾方案#

层级容灾方案说明
DNS多 DNS 服务商DNSPod + Cloudflare,故障时切换
CDN多 CDN 厂商阿里云 + 腾讯云,智能调度
NginxKeepalived + VIPMaster 故障,VIP 自动漂移到 Backup
K8s多可用区 + HPA跨 AZ 部署,自动扩缩容
RedisCluster 模式6 节点集群,自动故障转移
MySQLMHA + 主从主库故障,30 秒内自动切换

监控告警#

# 关键指标监控
- 应用层: QPS, 响应时间, 错误率
- 缓存层: 命中率, 连接数, 内存使用
- 数据库: 主从延迟, 慢查询, 连接数
- 基础设施: CPU, 内存, 磁盘, 网络

2. 系统全链路压测方案#

问题: 如何对千万级商城系统进行全链路压测?

答案:

压测策略:

1. 单接口压测 → 2. 单链路压测 → 3. 全链路压测 → 4. 混沌测试

压测环境:

生产环境影子库方案:
- 写操作 → 影子库(不污染真实数据)
- 读操作 → 缓存 + 影子库
- 标记压测流量(Header: X-Test-Flag: 1)

压测工具链:

# 负载生成
JMeter / Gatling / Locust / k6

# 流量控制
TC (Traffic Control) - 模拟网络延迟、丢包

# 监控
Prometheus + Grafana + APM (SkyWalking/Pinpoint)

# 日志分析
ELK (Elasticsearch + Logstash + Kibana)

压测指标:

指标目标
QPS10万+/秒
平均响应时间< 200ms
P99 响应时间< 500ms
错误率< 0.1%
CPU 使用率< 70%
内存使用率< 80%

3. 线上故障应急处理#

问题: 线上商城系统突然不可用,你的应急处理流程是什么?

答案:

应急流程(1-5-10 原则):

1 分钟:发现问题(监控告警)
5 分钟:定位问题(快速止损)
10 分钟:恢复服务(故障解决)

处理步骤:

# 1. 确认故障范围
- 是全国还是部分地区?
- 是所有功能还是部分功能?
- 是全部用户还是部分用户?

# 2. 快速止损(优先恢复服务)
# 方案1:回滚
kubectl rollout undo deployment/app

# 方案2:降级
# - 关闭非核心功能(推荐、评论)
# - 切换静态页面
# - 限流

# 方案3:扩容
kubectl scale deployment app --replicas=20

# 3. 定位根因
# - 查看日志
# - 查看监控
# - 查看变更记录

# 4. 修复并验证
# - 修复问题
# - 灰度发布
# - 全量发布

# 5. 复盘总结
# - 故障报告
# - 改进措施
# - 更新预案

故障等级:

等级影响响应时间处理要求
P0系统不可用5 分钟全员响应
P1核心功能受损15 分钟核心团队
P2非核心功能异常1 小时正常排期
P3轻微问题1 天下个迭代

4. 数据迁移方案#

问题: 如何将一个 10TB 的 MySQL 数据库从旧机房迁移到新机房,要求停机时间 < 5 分钟?

答案:

迁移方案:

阶段1:全量同步(提前执行)
阶段2:增量同步(持续同步)
阶段3:切换(停机 5 分钟内完成)

详细步骤:

# 1. 全量备份(提前1天)
mysqldump --single-transaction --master-data=2 \
  -h old-master -u root -p db_name > full_backup.sql

# 2. 导入新库
mysql -h new-master -u root -p db_name < full_backup.sql

# 3. 配置主从同步(旧库 -> 新库)
# 获取 binlog 位置
cat full_backup.sql | grep "CHANGE MASTER"

# 在新库执行
CHANGE MASTER TO
  MASTER_HOST='old-master',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=1234;
START SLAVE;

# 4. 验证同步延迟
SHOW SLAVE STATUS\G
# Seconds_Behind_Master = 0 表示同步完成

# 5. 切换(停机窗口)
# 5.1 停止应用写入
# 5.2 确认同步完成
# 5.3 新库提升为主库
STOP SLAVE;
RESET SLAVE ALL;

# 5.4 应用切换到新库
# 修改应用配置,重启连接池

# 5.5 验证
# 检查数据一致性
# 检查应用功能

# 6. 回滚方案(如果失败)
# 切回旧库,重新同步

数据一致性校验:

# 使用 pt-table-checksum 校验数据
pt-table-checksum \
  --host=old-master \
  --replicate=percona.checksums \
  --databases=db_name \
  --recursion-method=processlist

# 查看差异
pt-table-sync --print --execute h=old-master,h=new-master --databases=db_name

5. 安全攻防演练#

问题: 如何对运维体系进行安全攻防演练?

答案:

攻击面分析:

1. 网络层:DDoS、中间人攻击
2. 主机层:漏洞利用、权限提升
3. 应用层:SQL 注入、XSS、CSRF
4. 数据层:数据泄露、勒索软件
5. 供应链:依赖包漏洞

演练方案:

# 1. 信息收集
nmap -sV -O target.com
subfinder -d target.com

# 2. 漏洞扫描
nessus / openvas / awvs

# 3. 渗透测试
# - 弱口令爆破
hydra -l admin -P passwords.txt ssh://target.com

# - SQL 注入
sqlmap -u "http://target.com/search?q=test"

# - 命令注入
curl "http://target.com/exec?cmd=cat+/etc/passwd"

# 4. 内网渗透
# - 横向移动
# - 权限提升
# - 数据窃取

# 5. 痕迹清理
# - 日志清理
# - 后门植入

防御加固:

# 1. 网络隔离
# - VPC 划分
# - 安全组规则
# - WAF 防护

# 2. 主机加固
# - 最小化安装
# - 定期补丁
# - HIDS (OSSEC)

# 3. 应用安全
# - 代码审计
# - SAST/DAST
# - RASP

# 4. 数据安全
# - 加密存储
# - 访问控制
# - 审计日志

# 5. 应急响应
# - 监控告警
# - 应急预案
# - 定期演练

6. 成本控制与优化#

问题: 如何优化千万级系统的云资源成本?

答案:

成本分析:

典型成本分布:
- 计算资源:40%
- 存储资源:30%
- 网络流量:20%
- 其他:10%

优化策略:

资源优化方案预期节省
计算Spot 实例 + 自动扩缩容50-70%
存储冷热分层 + 压缩40-60%
网络CDN + 内网传输30-50%
数据库Serverless + 归档30-40%

FinOps 实践:

# 1. 标签管理
# 所有资源打标签
Team: backend
Project: mall
Environment: production

# 2. 成本分摊
# 按团队/项目分摊成本

# 3. 预算告警
# 月度预算 100万,超过 80% 告警

# 4. 资源回收
# 自动清理闲置资源
# - 未使用的 EIP
# - 未挂载的云盘
# - 过期的快照