ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Redis密码遗忘应急指南:单机、主从、哨兵架构安全重置全流程

2026/8/5 1:44:20 拓冰建站 浏览量
Redis密码遗忘应急指南:单机、主从、哨兵架构安全重置全流程

1. 项目概述:当“门禁卡”丢失时

在运维和开发的工作中,Redis 就像我们数据世界里的一个高速缓存“保险柜”或“门禁系统”。它速度快、结构简单,但正因其核心地位,一旦“门禁卡”——也就是访问密码——被遗忘或丢失,麻烦就来了。你可能遇到过这样的场景:一个运行了数月的线上服务,某天需要紧急调整 Redis 配置,或者重启实例后,突然发现当初随手设置的复杂密码,连同写密码的文档一起,消失在了记忆和硬盘的某个角落。连接被拒绝,应用告警,而 Redis 实例里还躺着热数据,不能轻易清空重启。

“Redis 忘记密码并重置密码”这个需求,听起来简单,但实际操作中却是一个需要谨慎对待的“外科手术”。它不是在配置文件里改个字符串那么简单,而是涉及到服务状态管理、数据安全、持久化机制理解以及不同部署环境下的操作差异。处理不当,轻则服务短暂中断,重则可能导致数据不一致甚至丢失。今天,我就结合多年踩坑经验,为你拆解从确认问题到安全完成密码重置的全流程,涵盖单机、主从、哨兵等常见架构,并分享那些官方文档里不会写的“止血”技巧和避坑指南。

2. 核心思路与方案选型:找到那把“备用钥匙”

忘记密码后,我们的目标很明确:在不丢失现有数据的前提下,重新获得 Redis 的访问权限,并设置一个新密码。这就像丢了家门钥匙,但你知道锁的结构,目标是换一把新锁芯,而不是把门拆了。

2.1 为什么不能直接修改redis.conf然后重启?

这是很多人的第一反应,但往往行不通,原因在于 Redis 的持久化机制。如果 Redis 运行时启用了 AOF(Append-Only File)持久化,并且appendonly设置为yes,那么 Redis 在关闭时,默认配置下会执行一个SHUTDOWN命令,这个命令会将内存中的数据以 AOF 重写的方式持久化到磁盘。然而,执行SHUTDOWN命令需要验证密码。在忘记密码的情况下,你无法通过客户端正常发送SHUTDOWN,导致 Redis 无法优雅关闭。如果使用kill -9强制终止进程,可能会损坏正在写入的 AOF 文件,下次启动时 Redis 会尝试修复,但存在数据丢失风险。

因此,直接重启通常不是首选方案,尤其是在生产环境。我们需要一种无需密码即可让 Redis 进程“就范”的方法。

2.2 主流方案对比与选型逻辑

根据 Redis 是否在运行以及数据安全优先级,主要有以下几种思路:

  1. 方案A:利用--requirepass参数启动临时无密码实例(推荐)

    • 思路:关闭原 Redis 进程,然后以“免密码”模式重新启动它。这通过修改配置文件或启动参数实现。
    • 优点:逻辑清晰,操作相对直接,对 RDB 持久化模式友好。
    • 缺点:需要重启 Redis 服务,意味着短暂的服务中断。对于 AOF 持久化,需特别注意关闭时的数据安全。
    • 适用场景:可以接受秒级服务中断的单机或从节点;作为处理主从、哨兵架构中某个节点的基础步骤。
  2. 方案B:通过CONFIG SET命令动态修改运行时配置(条件苛刻)

    • 思路:如果能在不重启的情况下连接到 Redis(例如,密码通过配置文件设置但未生效,或监听在非保护端口),可以使用CONFIG SET requirepass newpassword命令直接修改。
    • 优点:无需重启,对业务零中断。
    • 缺点:前提是你必须能以某种无认证或已知认证方式连接到 Redis。在完全忘记密码且所有连接都受保护的情况下,此路不通。
    • 适用场景:多密码体系、配置错误排查或特定安全测试场景。对于“完全遗忘”的场景不适用。
  3. 方案C:从持久化文件或备份中恢复(最后的手段)

    • 思路:如果数据有定期备份,或者可以接受丢失自上次持久化以来的数据,可以停止 Redis,删除现有的持久化文件(dump.rdb,appendonly.aof),然后用新配置启动一个全新的、无密码的 Redis 实例,再从备份恢复数据。
    • 优点:彻底解决问题,得到一个干净的状态。
    • 缺点:必然导致数据丢失(从备份点到现在之间的数据)。操作复杂,恢复耗时。
    • 适用场景:开发测试环境;生产环境中数据可重建或拥有极近时间点备份的极端情况。

选型结论:对于绝大多数“忘记密码”的场景,方案A(重启并临时取消密码)是平衡了操作性、安全性和普适性的最佳选择。下文将主要围绕此方案展开,并详细说明如何将其安全地应用于不同环境。

3. 单机 Redis 密码重置实操详解

我们以最常见的 Linux 系统、Redis 6.x 及以上版本为例,演示完整流程。假设 Redis 配置文件位于/etc/redis/redis.conf

3.1 前置检查与状态确认

操作前,务必先摸清现状,这是避免事故的关键。

  1. 确认 Redis 运行状态与连接信息

    # 查看 Redis 进程 ps aux | grep redis-server # 通常能看到类似命令:/usr/bin/redis-server 127.0.0.1:6379 # 或配置文件路径:/usr/bin/redis-server /etc/redis/redis.conf # 尝试用(可能错误的)密码连接,确认访问被拒 redis-cli -h 127.0.0.1 -p 6379 -a 'your_guess_password' # 预期输出:(error) NOAUTH Authentication required. 或直接连接失败。
  2. 定位并备份配置文件与数据文件

    # 找到配置文件(如果上一步未显示) find / -name "redis.conf" 2>/dev/null | head -5 # 备份配置文件!这是铁律。 sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.backup.$(date +%Y%m%d%H%M%S) # 找到数据目录,备份持久化文件(RDB和AOF) # 通常配置项是 `dir /var/lib/redis` 或 `dir ./` sudo cp /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.backup.$(date +%Y%m%d%H%M%S) 2>/dev/null || true sudo cp /var/lib/redis/appendonly.aof /var/lib/redis/appendonly.aof.backup.$(date +%Y%m%d%H%M%S) 2>/dev/null || true
  3. 检查关键配置:打开配置文件,确认以下几项:

    sudo grep -E \"^(requirepass|dir|appendonly|save |stop-writes-on-bgsave-error)\" /etc/redis/redis.conf
    • requirepass foobared:这行如果存在且被注释(以#开头),说明未设密码;如果存在且未注释,foobared就是当前密码(但我们已经忘了)。
    • dir /var/lib/redis:数据持久化目录。
    • appendonly yes/no:是否启用 AOF 持久化。
    • save 900 1等:RDB 快照触发条件。
    • stop-writes-on-bgsave-error yes:当 RDB 持久化出错时是否停止接收写命令。了解这个有助于判断后续操作风险。

3.2 安全关闭 Redis 服务

这是最具风险的一步,目标是让 Redis 尽可能优雅地退出,将内存数据持久化到磁盘。

注意:如果appendonly设置为yes,Redis 默认在关闭时会执行 AOF 重写并保存。这需要密码。我们的策略是,临时修改配置,让 Redis 在关闭时不执行需要密码的持久化操作

  1. 方案一:优先尝试发送 SHUTDOWN NOSAVE 或 SHUTDOWN SAVE 信号即使需要密码,Redis 也能接收某些信号。我们可以尝试向进程发送一个模拟SHUTDOWN的信号。但请注意,这不是标准的SHUTDOWN命令,效果可能因版本而异,且SAVE操作同样可能因认证失败而无法执行。

    # 找到 Redis 主进程 PID redis_pid=$(ps aux | grep '[r]edis-server' | awk '{print $2}') # 尝试发送 SIGTERM 信号(15),这是优雅终止信号,Redis 会尝试持久化。 # 但由于需要密码的 SHUTDOWN 命令可能无法执行,持久化可能不会发生。 sudo kill -15 $redis_pid # 等待几秒查看进程是否退出 sleep 5 ps -p $redis_pid

    如果进程还在,说明它可能卡在需要认证的关闭流程上。

  2. 方案二:修改配置后重启(通用方法)既然优雅关闭可能受阻,我们采用更直接的方法:修改配置,让 Redis 以无密码模式启动,这样我们就能正常连接并执行关闭或直接修改密码

    • 步骤1:停止 Redis 进程。此时我们选择强制终止,因为优雅终止已不可行。使用SIGKILL (9)信号。

      sudo kill -9 $redis_pid

      重要提示kill -9是强制终止,不会给进程清理资源的机会。如果appendonly yes且正在写入 AOF,极有可能导致 AOF 文件损坏。这就是为什么第一步我们做了备份。Redis 在下次启动时会尝试修复损坏的 AOF 文件(redis-check-aof),大部分情况下能恢复,但不能保证 100% 数据完整。

    • 步骤2:修改 Redis 配置文件,临时禁用密码和可能影响启动的持久化设置

      sudo vim /etc/redis/redis.conf

      找到并修改以下行:

      # 将 requirepass 行注释掉,或改为一个空密码(不推荐空密码运行太久) # requirepass your_old_forgotten_password requirepass \"\" # 或者直接删除这行 # 为了防止启动时因 AOF 文件问题失败,可以临时关闭 AOF(可选,根据情况) # appendonly no # 如果担心 RDB 持久化失败导致启动失败,可以临时关闭 RDB 保存规则(可选) # save \"\" # 或者注释掉所有 save 行

      核心操作就是注释或清空requirepass。其他修改是为了应对可能因强制终止导致的持久化文件损坏,确保新实例能先启动起来。

    • 步骤3:以修改后的配置启动 Redis

      sudo systemctl start redis # 如果使用 systemd # 或者 sudo redis-server /etc/redis/redis.conf
    • 步骤4:验证无密码连接成功

      redis-cli 127.0.0.1:6379> ping # 应返回 PONG 127.0.0.1:6379> CONFIG GET requirepass # 应返回 1) \"requirepass\" 2) \"\",表示密码为空

3.3 重新设置密码并恢复配置

获得访问权限后,剩下的就简单了。

  1. 通过命令行设置新密码

    127.0.0.1:6379> CONFIG SET requirepass \"YourNewStrongPassword!123\" OK 127.0.0.1:6379> AUTH \"YourNewStrongPassword!123\" OK

    使用CONFIG SET命令会立即生效,但只对当前运行实例有效,重启后会丢失。必须将其写回配置文件。

  2. 将新密码持久化到配置文件

    # 退出 redis-cli 127.0.0.1:6379> quit # 编辑配置文件,将之前注释或清空的 requirepass 行改为新密码 sudo vim /etc/redis/redis.conf # 修改为: requirepass YourNewStrongPassword!123 # 如果之前临时关闭了 AOF 或 RDB,现在将它们恢复原样 # appendonly yes # save 900 1 # save 300 10 # save 60 10000
  3. 重启 Redis 使新配置完全生效

    # 因为 CONFIG SET 已经生效,现在可以优雅重启了 redis-cli -a YourNewStrongPassword!123 shutdown # 或者使用 systemctl sudo systemctl restart redis # 使用新密码验证连接 redis-cli -a YourNewStrongPassword!123 127.0.0.1:6379> ping PONG

4. 主从与哨兵架构下的密码重置策略

在分布式架构中,密码重置不能只考虑单个节点,必须顾及节点间的认证和同步关系。

4.1 Redis 主从复制架构

假设我们有一个一主一从的结构,主节点(Master)和从节点(Slave)都设置了相同的密码(requirepass),并且从节点通过masterauth配置项来认证主节点。

场景:忘记了主从共用的密码。

操作原则:逐个节点处理,优先处理从节点,最后处理主节点,以最小化对写入服务的影响。

  1. 重置从节点密码

    • 按照第3章的单机步骤,在从节点上操作:停止从节点 -> 修改其redis.conf中的requirepass为空 -> 启动从节点。
    • 此时从节点无法同步主节点数据,因为它的masterauth配置还是旧的、错误的密码。先不管。
    • 通过无密码连接上从节点,使用CONFIG SET masterauth \"YourNewStrongPassword!123\"设置新的主节点认证密码(假设我们已经决定新密码是这个)。
    • 同时,也用CONFIG SET requirepass \"YourNewStrongPassword!123\"设置从节点自身的新密码。
    • 将新密码写入从节点的redis.conf(更新requirepassmasterauth)。
    • 重启从节点,此时它依然无法连接主节点,因为主节点密码还没改。
  2. 重置主节点密码

    • 在业务低峰期,按照第3章步骤操作主节点:停止主节点 -> 修改requirepass为空 -> 启动主节点。
    • 通过无密码连接主节点,使用CONFIG SET requirepass \"YourNewStrongPassword!123\"设置新密码。
    • 将新密码写入主节点的redis.conf
    • 重启主节点。主节点重启期间,应用写入会失败,需有短暂服务降级或熔断准备。
  3. 恢复主从同步

    • 主节点启动后,从节点(配置了新的masterauth)会自动重连并开始全量或增量同步。
    • 检查主从状态:
      # 在主节点执行 redis-cli -a YourNewStrongPassword!123 info replication # 查看 connected_slaves 数量 # 在从节点执行 redis-cli -a YourNewStrongPassword!123 info replication # 查看 role:slave 和 master_link_status:up

4.2 Redis Sentinel(哨兵)架构

哨兵架构更复杂,因为涉及多个 Sentinel 进程监控主从,并且 Sentinel 之间、Sentinel 与 Redis 节点之间也可能有认证(requirepasssentinel auth-pass)。

核心配置项

  • Redis 节点:requirepass(节点自身密码),masterauth(从节点连接主节点的密码)。
  • Sentinel:requirepass(Sentinel API 的密码,用于客户端或 Sentinel 间通信),sentinel auth-pass <master-name> <password>(Sentinel 连接监控的 Redis 主节点的密码)。

重置策略:必须保持密码配置的一致性。假设所有 Redis 节点共用密码A,所有 Sentinel 共用密码B

  1. 规划新密码:决定新的 Redis 节点密码(new_redis_pass)和新的 Sentinel 密码(new_sentinel_pass)。
  2. 先更新 Sentinel 配置中的 Redis 密码:在所有 Sentinel 的配置文件中,修改sentinel auth-pass mymaster new_redis_pass逐个重启 Sentinel。此时 Sentinel 会用新密码去连接 Redis,但 Redis 还在用旧密码,所以 Sentinel 会认为主节点下线,触发故障转移逻辑?不会,因为 Sentinel 连接失败,它无法获取主节点信息,监控状态会异常,但不会错误地触发切换。这是关键风险点,操作要快。
  3. 按照“主从架构”步骤,更新所有 Redis 节点密码new_redis_pass。同样,先改从节点,最后改主节点。当主节点密码更新后,Sentinel 就能用新密码成功连接并恢复监控。
  4. 最后更新 Sentinel 自身的requirepass:在所有 Sentinel 配置文件中修改requirepass new_sentinel_pass,然后逐个重启 Sentinel。客户端连接 Sentinel 时也需要使用这个新密码。

操作心得:在哨兵环境下,密码重置是“牵一发而动全身”的操作。务必在维护窗口进行,并准备好回滚方案(即备份所有配置文件)。可以考虑编写一个脚本,在极短时间内(秒级)批量更新所有节点的配置并重启,以减少监控盲窗期。同时,密切监控哨兵的+sdown-sdown日志。

5. 常见问题、避坑指南与高阶技巧

5.1 强制 Kill 后 AOF 文件损坏怎么办?

如果你在appendonly yes的情况下使用了kill -9,Redis 启动时可能会报错:

Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>

解决步骤

  1. 务必先备份损坏的 AOF 文件
  2. 使用 Redis 自带的修复工具:
    sudo redis-check-aof --fix /var/lib/redis/appendonly.aof
    工具会尝试截断到最后一个完整的命令。这意味着你会丢失 AOF 文件尾部不完整的那部分数据(通常是强制终止前最后几条或几十条写命令)。
  3. 修复完成后,用修复后的文件启动 Redis。启动后,检查关键数据是否完整。
  4. 教训:在生产环境,如果条件允许,在强制终止前,可以尝试通过CONFIG SET appendonly no动态关闭 AOF(但这需要连接权限,在忘记密码时不可行)。因此,定期备份 RDB 和 AOF 文件是至关重要的运维习惯

5.2 配置了rename-command导致 CONFIG 命令不可用

有些安全加固配置会重命名或禁用CONFIG命令,例如:

rename-command CONFIG \"\"

如果CONFIG命令被禁用,上述通过CONFIG SET修改密码的方法就失效了。

解决方案

  1. 在修改配置文件临时取消密码的同时,也必须将rename-command CONFIG这行注释掉或恢复原名。
  2. 重启 Redis 后,CONFIG命令可用,再执行密码修改。
  3. 密码修改并写回配置文件后,再将rename-command CONFIG的配置加回去,并重启生效。

5.3 使用 ACL 的 Redis 6.0+ 版本

Redis 6.0 引入了更细粒度的 ACL(访问控制列表)。密码可能只是默认用户default的一个属性。查看 ACL 状态:

127.0.0.1:6379> ACL LIST 1) \"user default on #5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 ~* +@all\"

这里的#后面跟着的是 SHA256 哈希值,不是明文密码。如果你忘记了 ACL 密码,处理思路类似:

  1. 关闭 Redis,修改配置文件。
  2. 在配置文件中,找到aclfile路径或直接在配置中定义用户。可以临时注释掉所有user配置行,或者添加一个无密码的超级用户。
    # 临时禁用 ACL,回退到 requirepass 模式(如果兼容) # aclfile /etc/redis/users.acl # 或者,添加一个开放的用户(极度危险,仅限临时操作) user default on nopass ~* +@all
  3. 启动 Redis,此时可以无密码访问。然后使用ACL SETUSER命令重新为default用户设置密码,或重新配置你的 ACL 规则。
  4. 将正确的 ACL 配置持久化到配置文件或aclfile,然后重启。

5.4 密码重置后客户端应用连接失败

密码在 Redis 服务端改好了,但客户端库(如 Jedis, Lettuce, redis-py)配置里还是旧密码,会导致连接池报错。

排查步骤

  1. 检查客户端配置:确认连接字符串、配置文件或环境变量中的密码已更新。
  2. 检查连接池:很多客户端有连接池缓存。密码更新后,连接池中已建立的、使用旧密码的连接在重用时必然失败。需要重启客户端应用,以重建连接池。
  3. 验证网络与防火墙:确保客户端机器能访问 Redis 的 IP 和端口。

5.5 预防重于治疗:密码管理最佳实践

  1. 使用配置管理工具:将 Redis 密码存储在安全的配置中心(如 HashiCorp Vault, AWS Secrets Manager)或环境变量中,而不是硬编码在配置文件或代码里。通过工具在部署时注入。
  2. 配置文件版本化与备份:将redis.conf和 Sentinel 配置文件纳入版本控制(Git),并在每次变更前备份。
  3. 启用慢日志和监控:配置slowlog-log-slower-thanmonitor命令(谨慎使用)审计异常访问。设置告警,对频繁的认证失败保持警惕。
  4. 定期轮换密码:建立密码轮换机制,即使忘记,也有迹可循。在分布式系统中,轮换密码需要遵循类似上文主从/哨兵的滚动更新流程。
  5. 记录在安全的密码库:使用专业的密码管理软件(如 1Password, LastPass)记录初始密码和每次变更,并设置严格的访问权限。

密码是安全的第一道门槛,遗忘虽是小概率事件,但一旦发生,在高压下的应急操作极易出错。理解 Redis 的持久化、关闭流程和架构依赖,按照“备份-修改-验证-恢复”的严谨步骤操作,才能将这个看似简单的“重置密码”任务,变成一次安全、平滑的运维演练。