上周三凌晨2点15分,我们突然收到监控系统告警:印度孟买数据中心出现异常数据延迟。当时在线用户数约3.2万,API响应时间从平时的120ms飙升到2.3秒,部分用户提交的表单数据出现丢失现象。
最诡异的是:
作为负责亚太区数据服务的SRE,我立即组建了包括网络工程师、数据库专家和前端开发在内的临时攻坚小组。以下是完整的故障排查过程和技术复盘。
我们首先检查了MongoDB集群状态:
bash复制mongostat --host mumbai-rs0 --discover -n 3
输出显示:
关键发现:数据库指标完全正常,排除了存储层问题
通过Prometheus检查API网关指标时发现异常:
code复制rate(api_request_duration_seconds_count{region="mumbai"}[5m]) > 100
但对应的错误日志却分散在多个微服务:
这种"散弹枪"式的错误分布让我们意识到:问题可能不在应用层本身。
使用mtr进行路由追踪时发现异常跳点:
bash复制mtr -rwcb 20 --tcp -P 443 api.in.example.com
结果节选:
code复制7. ae-5.r20.mumbai03.in.bb.gin.ntt.net
Loss%: 38%
Last: 143.2ms
Avg: 297.4ms
Worst: 812ms
这个位于NTT孟买节点的丢包率明显异常。但奇怪的是:
通过tcpdump抓包发现更隐蔽的问题:
bash复制tcpdump -i eth0 -w mumbai.pcap 'port 443 and host 172.16.23.45'
Wireshark分析显示:
与印度本地团队联合排查后发现:
这导致:
另一个隐藏问题是:
nginx复制server {
listen 443 ssl;
mtu 1400;
...
}
sysctl复制net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_sack=1
javascript复制function detectMTU() {
let mtu = 1500;
while(mtu > 500) {
try {
await fetch(`/mtu-test?size=${mtu}`);
return mtu;
} catch(e) {
mtu -= 100;
}
}
return 1400; // 默认安全值
}
diff复制- Cache-Control: max-age=31536000
+ Cache-Control: public, max-age=86400, stale-while-revalidate=3600
优化后指标对比:
| 指标 | 故障时 | 优化后 |
|---|---|---|
| API成功率 | 87.2% | 99.94% |
| P95延迟 | 2300ms | 148ms |
| 数据丢失率 | 0.15% | 0.001% |
| TCP重传率 | 12.7% | 0.3% |
跨国故障必须考虑本地化特征:印度移动网络环境与欧美差异巨大,不能套用相同配置
全链路监控的重要性:仅监控服务端点不够,需要包含:
防御性编程的必要性:
这次事件后,我们建立了区域性网络特征数据库,将常见配置差异纳入CI/CD的自动化测试流程。比如在印度区部署时,会自动启用: