先别急着改回新值,第一步是把“谁在写”查清。常见做法有两种:一是直接在看板上手动改回并观察,二是先冻结发布、抓取写入证据再修。前者快,但旧值往往会在下一次发布或缓存刷新时再次出现;后者慢半天,却能区分是发布流水线、配置中心缓存、多实例竞争还是人工回滚造成的。选择取决于旧值复现的周期:如果几分钟内必现,优先抓证据;如果几天才出现一次,可以先加写入审计再等它复现。
两种原因的证据不同。持续写入通常表现为:每次发布后一段时间旧值出现,且写入时间与某个任务、定时器或容器启动时刻接近;一次性回滚则表现为旧值出现一次后长期稳定,之后不再变化。
这里要提醒一点:抓取量或请求量下降不能单独证明旧值就是原因,也可能是抓取预算、外链变化、服务端错误或对方调度波动。把日志里的状态码、抓取频率和文件内容时间线放在一起看,才能排除其他解释。
这种情况下,手动改回几乎一定会被再次覆盖,动作重点应放在“抓住写入者”。具体做法:
inotifywait 一类工具记录写入进程、时间和命令行。这一步的结果会直接决定下一步:如果写入者是发布流水线中的某个模板或变量,修模板即可;如果写入者是配置中心里一个未被清理的旧键,就要处理键的优先级和缓存;如果写入者是容器镜像内的默认文件,则要改镜像构建或挂载策略,而不是继续在运行实例上改文件。
低频覆盖不值得长时间冻结发布,代价太大。更合适的做法是保留发布节奏,但把写入证据固定下来:
这种做法的代价是排查周期被拉长,但换来的是不打断正常发布。若业务对抓取敏感、旧值会长期影响抓取行为,则不应选这条路径,应回到条件一先冻结。
假设某站点有两台应用实例,发布后 A 实例的 robots.txt 是新值,B 实例是旧值。若只在 B 上手动改回,下一次滚动发布后 B 又变旧,而 A 始终正常。此时更合理的判断是:问题不在发布系统全局,而在 B 的挂载卷、启动脚本或本地缓存。动作上应对比两台实例的挂载配置与启动参数,而不是继续修改文件内容。结果若确认是挂载卷指向了旧目录,修复挂载后两台实例哈希一致,才说明覆盖来源被处理;若哈希仍不一致,则要继续查配置中心或镜像层。
不要只看一次改回是否成功。至少经过一个完整的发布周期,并覆盖定时任务、扩缩容和缓存刷新这些容易触发旧值的路径,再比较各实例哈希与写入日志。若旧值不再出现,且写入日志中不再有指向旧来源的记录,才可以认为来源已切断。同时要记住,robots.txt 的抓取限制不等于可靠的索引移除;即使配置正确,也不应把它当作删除已收录内容的替代手段,必要时应分别核查各搜索引擎的支持情况与对应处理方式。