← 中文资源

简体中文版本

零停机轮换数据库应用凭据

分阶段替换应用数据库密码:创建继任角色、迁移全部使用方、确认旧连接归零,再禁用旧登录名。

阅读英文原文

目标

在不中断服务的前提下,把应用使用的数据库角色从 app_rw 迁移到 app_rw_v2。PostgreSQL 每个角色只有一个密码,直接改密会让所有实例同时失效,因此要通过继任角色让新旧凭据并存,等所有调用方切换后再禁用旧角色。

步骤

  1. 盘点使用方:检索密钥管理元数据、部署清单和 pg_stat_activity,找出 Web 实例、后台任务、定时作业和报表工具,并用 pg_dumpall --roles-only 导出角色权限。
  2. 创建继任角色并交互式设置密码,避免密码进入命令历史:
CREATE ROLE app_rw_v2 LOGIN;
GRANT app_rw TO app_rw_v2;
\password app_rw_v2

SELECT usename, count(*)
FROM pg_stat_activity
WHERE usename IN ('app_rw', 'app_rw_v2')
GROUP BY usename;
  1. 在密钥管理器中写入新版本,更新应用的密钥引用,分批滚动重启使用方,并观察每一批的认证错误。
  2. 确认旧角色会话归零后执行 ALTER ROLE app_rw NOLOGIN,保留角色和权限七天,继续观察完整业务周期。
  3. 七天内无异常后执行 DROP ROLE app_rw,归档权限导出,并在凭据清单中记录轮换日期、负责人和下次到期日。

验证

用 app_rw 建立 psql 连接应被拒绝;用 app_rw_v2 连接并执行一次代表性读写;检查 pg_stat_activity 中没有 app_rw 会话;应用仪表盘的认证错误为零;凭据清单中只剩新角色及下次轮换日期。

回滚

删除角色之前,回滚只需两步:执行 ALTER ROLE app_rw LOGIN,并把应用密钥引用指回上一版本,不涉及任何数据变更。执行 DROP ROLE app_rw 之后无法直接恢复,必须用导出的权限重建角色并恢复对象所有权,因此把删除视为不可逆步骤,只在观察期结束后执行。新角色在回滚后可执行 ALTER ROLE app_rw_v2 NOLOGIN 再删除,同样先确认没有会话在使用。