1.
问题背景与目标定义
说明:明确故障范围与测试目标。小分段:
- 确定受影响资源:如 /poster/*.jpg 或 /images/cover/*.png。
- 明确症状:跨地域显示不同图片、旧图未更新、缓存穿透或回源慢。
- 目标:定位是否为DNS、CDN POP分发、缓存策略或回源内容不一致导致。
2.
准备测试环境与工具
说明:列出必备工具与环境准备。小分段:
- 工具:curl、wget、dig、nslookup、traceroute、tcpdump、openssl、浏览器开发者工具。
- 远程节点:准备多区域测试机(可用阿里云/腾讯云/Google/AWS不同区域实例),或使用公网代理/VPN/第三方测试平台(如Catchpoint)。
- 获取权限:CDN控制台访问、回源服务器日志权限。
3.
第一步:DNS与解析检查
说明:确认域名到CDN的解析是否一致。小分段:
- 命令:dig +short your.poster.domain CNAME @8.8.8.8;在不同区域替换解析服务器,比较CNAME/IP是否同质。
- 检查TTL:dig your.poster.domain @ns1.provider +noall +answer,注意TTL与是否采用地域DNS。
- 若发现不同解析到不同CDN域名或老旧记录,排查DNS缓存和负载均衡策略。
4.
第二步:从不同区域直接请求资源并比对响应头
说明:通过curl获取响应头检查缓存信息。小分段:
- 命令示例:curl -I -H "Host: poster.example.com" https://cdn.example.com/poster/123.jpg
- 重点看头:Cache-Control, Expires, Age, ETag, Last-Modified, X-Cache/X-Cache-Status, Via。
- 在多个区域对比 Age 值与 X-Cache(HIT/MISS/EXPIRED),判断是否存在不同POP缓存差异。
5.
第三步:检查回源与回源头部一致性
说明:确认源站返回的头部与CDN配置一致。小分段:
- 直连源站请求:curl -I https://origin.example.com/poster/123.jpg --resolve poster.example.com:443:ORIGIN_IP
- 确认源站是否带有正确的 Cache-Control 或 ETag;如果源站不一致,CDN在不同POP可能依据回源策略缓存不同内容。
- 若源站使用动态生成或有多台源,需确认源间文件版本一致,同步延时是否导致差异。
6.
第四步:模拟小米盒子行为与HTTP/HTTPS差异
说明:小米盒子可能使用特定UA或HTTP头。小分段:
- 模拟命令:curl -I -A "MiBox/4.0" https://poster.example.com/poster/123.jpg
- 检查是否有基于UA的缓存分割或变体(Vary: User-Agent)。
- 同时测试HTTP与HTTPS,确认是否有HTTP->HTTPS跳转或不同证书导致回源不同路径。
7.
第五步:跨区域二进制对比与Hash检查
说明:确认文件内容是否相同。小分段:
- 下载多区域文件:curl -o /tmp/1.jpg https://region1.example.com/poster/123.jpg 等。
- 计算hash:sha256sum /tmp/1.jpg /tmp/2.jpg,对比SHA值。
- 若hash不同,说明文件实质不同;排查回源同步或CDN旧版本残留。
8.
第六步:查看CDN日志与回源日志
说明:从日志侧定位时间点与POP。小分段:
- CDN访问日志:筛选请求时间、POP ID、cache_status。
- 回源日志:检查是否有大量回源请求或回源失败(5xx)。
- 若出现回源失败或回源率异常高,可能是缓存TTL设置过短或POP不可用导致回源不稳定。
9.
第七步:缓存失效与清理策略
说明:如何正确使缓存失效并保证跨区生效。小分段:
- 最佳实践:使用版本化URL(如 poster/123_v20250625.jpg)保证原子更新;
- 对无法改动URL的资源:使用CDN提供的Invalidate/Purge API(示例:curl -X POST https://
cdnapi.provider/purge -d '["/poster/123.jpg"]' -H 'Authorization:Bearer TOKEN'),并在所有Region确认X-Cache显示MISS后回源。
- 若CDN支持“全网刷新”,优先使用;同时监控状态返回与日志。
10.
第八步:处理区域不一致的根因排查清单
说明:按优先级核查。小分段:
- DNS解析差异、旧记录或GeoDNS策略;
- 源站多实例不同步或缓存预热策略失败;
- CDN配置差异(不同POP策略/缓存规则/变体Vary);
- 客户端缓存(设备本地缓存)未刷新;
- 回源失败导致POP使用老版本或降级内容。
11.
第九步:实操案例:跨区排查流程示例
说明:示例步骤一气呵成。小分段:
- 1) 在北京和新加坡实例分别运行:dig/poster、curl -I、下载并sha256对比;
- 2) 若发现北京为旧图:检查北京解析的CNAME是否正确,查看X-Cache是否HIT并Age较大;
- 3) 在CDN控制台提交单文件清理并观察北京POP日志是否有PURGE记录;
- 4) 如PURGE无效,执行回源直连校验并对源站做版本化发布。
12.
第十步:防止复发的建议
说明:长期可靠策略。小分段:
- 使用文件版本号或Query String强制缓存隔离;
- 在CI/CD发布流程里加入CDN清理或版本切换步骤;
- 配置合适的Cache-Control(静态资源长TTL + 强制版本更新策略);
- 定期巡检CDN日志与回源同步状态,设置报警(回源错误率、POP差异检测)。
13.
问:如果某个区域CDN仍返回旧图,我该如何快速验证是本地设备还是POP问题?
答:先用第三方公网节点(云主机或在线测试平台)在同一区域发起curl -I请求并下载文件做hash对比;若云主机也返回旧图,说明是POP或DNS问题;若云主机正常而盒子异常,清除盒子应用缓存/系统缓存并重启,再观察是否因设备缓存或APP层缓存导致。
14.
问:CDN清理后为何部分地区还需要很久才更新?
答:可能原因包括:POP内部异步清理延迟、DNS层缓存未刷新(TTL未到)、设备端缓存或中间代理缓存、或CDN提供商的全网刷新机制逐步生效。建议使用版本化URL避免等待,并向CDN申请查询具体POP清理状态或使用其API确认清理结果。
15.
问:有什么快速方法在发布新画报时保证不会出现缓存不一致?
答:最可靠的方法是文件名/URL版本化(例如 poster/123?v=20250625 或 poster/123_20250625.jpg),配合CI在每次发布后自动更新引用并无需依赖CDN清理;若必须覆盖原始URL,CI流程应在发布后调用CDN批量Invalidate API并在多区验证X-Cache为MISS后再开放流量。