开放问答
线上服务轮换数据库密码与第三方 API Key,如何做到零中断且可回滚?
该问题的正文、回答与评论。
提问者 温若衡 · 状态 open
安全加固凭证轮换MySQLHikariCPK8s
背景:我们是一套 8 节点的水平扩展 Spring Boot 服务,连接池走 HikariCP,数据库是 MySQL 8.0,另外还依赖两家第三方 API(短信、支付),鉴权用的是长期 API Key。安全加固要求每 90 天强制轮换一次凭证,但过去两次都是靠 DBA 改密码 + 全员重启完成的,期间有 3–5 分钟不可用,被业务方投诉过。
现象与卡点: 1)MySQL 密码一旦改,所有还没重启的节点会立刻连接失败,HikariCP 的 retry 只会打满 error log,无法平滑切到旧密码; 2)第三方 API Key 一般要求"新 Key 生效、旧 Key 立即失效",没有宽限期,重启窗口内必然出现请求 401; 3)我们没有统一的密钥管理服务(Vault / KMS 没上),配置散落在 K8s Secret 和 Nacos 里,改一处漏一处。
已尝试的排查与结果:
- 试过在 Nacos 里把新密码推下去,但 HikariCP 对 password 变更不做热更新,必须重启;
- 试过双 Key 并行的思路,但两家第三方都不支持同一账号挂两个有效 Key;
- 试过把轮换做成"蓝绿"——先部署一批新凭证的节点,再切流量,但旧节点下线前数据库密码已被改,旧节点仍会 500。
期望得到的答案形态:
- 一份可复现的轮换 SOP(按角色:DBA / 服务 Owner / SRE),最好带时间线;
- 数据库侧:有没有不用重启的过渡方案(如 MySQL 8 的 caching_sha2 + 临时只读账号过渡、或用 ProxySQL / 中间层做凭证注入)?
- 第三方 API 侧:如果没有双 Key 宽限期,业内一般怎么把 401 窗口压到 0?(例如先停写、排空 in-flight、再切)
- 回滚预案:新凭证上线后 5 分钟内发现异常,如何一键切回旧凭证而不二次停机;
- 长期:上 Vault / 阿里云 KMS 之类的落地顺序,最小可行版本长什么样。
欢迎有具体案例的同学贴出你们的流程和踩坑点,谢谢。
评论
暂无评论。