Redis DEBUG 命令问题排查

Redis DEBUG 命令问题排查

DEBUG 命令介绍

Redis 提供了 DEBUG 命令用于调试和诊断,但也是”高危命令”之一。生产环境中误用或滥用 DEBUG 命令可能导致严重后果。

DEBUG 命令的主要子命令

# 危险的 DEBUG 命令
DEBUG SET-ACTIVE-EXPIRE 0    # 停用过期 key 淘汰(可能导致内存爆炸)
DEBUG SLEEP 10               # 让 Redis 休眠 10 秒(阻塞所有请求)
DEBUG SEGFAULT               # 模拟段错误,导致 Redis 崩溃
DEBUG CHANGE-REPL-ID         # 修改复制 ID(可能导致复制混乱)
DEBUG POPULATE 1000000       # 写入 100 万条测试数据(填满内存)

# 相对安全的
DEBUG HTSTATS                # 查看哈希表统计
DEBUG SDSLOG                 # SDS 日志
DEBUG HELP                   # 显示帮助

DEBUG 引发的问题

1. Debug Sleep 阻塞问题

redis-cli DEBUG SLEEP 30
    ↓
Redis 进程进入睡眠(单线程)
    ↓
所有操作被阻塞:
  - 客户端请求排队
  - 主从复制中断
  - 哨兵心跳超时 → 触发切换
  - 连接超时 → 客户端重连

影响范围
– 30 秒的 SLEEP = 全局停机 30 秒
– 可能触发哨兵切换、连接池打满

2. Debug Segfault 崩溃

redis-clI DEBUG SEGFAULT
# 直接导致 Redis 进程 crash

# 后果:
# - 如果是主库,触发哨兵 failover
# - 未持久化的数据全部丢失
# - 客户端所有连接断开

3. Debug Set-Active-Expire 误用

# 禁用过期 key 淘汰
redis-cli DEBUG SET-ACTIVE-EXPIRE 0

# 后果:
# 过期 key 不会被清理
# 内存持续增长
# 最终内存满,触发 OOM

# 可能没有立即发现问题
# 等到内存满时已经难以追查原因

排查 DEBUG 命令的来源

1. 查看命令执行记录

# 查看慢查询日志(如果 DEBUG 执行较慢)
SLOWLOG GET 10

# 查看近期执行的命令
redis-cli MONITOR | grep DEBUG
# 注意:MONITOR 会降低 Redis 性能,谨慎使用

2. 查看客户端来源

# 查看当前连接
redis-cli CLIENT LIST | grep -i debug

# 查看哪个客户端执行了特定命令
redis-cli CLIENT LIST | awk '$NF ~ /DEBUG/'

3. 分析应用日志

# 在应用端搜索 Redis 操作日志
grep -r "DEBUG" /var/log/app/ --include="*.log"
grep -r "debug" /path/to/code --include="*.py" --include="*.java"

预防 DEBUG 误操作

1. 禁用 DEBUG 命令

# redis.conf
rename-command DEBUG ""

2. 使用 ACL 精细化控制

# Redis 6.0+ ACL
# 创建只有基本命令权限的用户
redis-cli ACL SETUSER readonly_user on >password1 +@read +@connection ~*

# 创建生产用户(禁用危险命令)
redis-cli ACL SETUSER prod_user on >password2 +@all -@dangerous -DEBUG ~*

# 管理员用户(全部权限)
redis-cli ACL SETUSER admin_user on >password3 +@all ~*

3. 命令分类保护

# 危险的命令组(建议全部 rename 或 ACL 限制)
# @dangerous 类别包括:
# - DEBUG
# - FLUSHALL
# - FLUSHDB
# - SHUTDOWN
# - KEYS
# - CONFIG

# rename.conf
rename-command DEBUG ""
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command SHUTDOWN admin-shutdown
rename-command CONFIG admin-config
rename-command KEYS admin-keys

DEBUG 的合理使用场景

场景 1:开发环境

# 开发环境使用 DEBUG 生成测试数据
redis-cli DEBUG POPULATE 1000000 test 100
# 创建 100 万条 key 为 test:0 ~ test:999999,value 为 100 字节

# 然后验证集群性能、槽位分布等

场景 2:调试哈希表

# 查看某个数据库的哈希表状态
redis-cli INFO stats
redis-cli DEBUG HTSTATS 0

# 了解哈希表的 rehash 状态

场景 3:调试复制问题

# 检查复制 ID
redis-clI DEBUG CHANGE-REPL-ID  # 仅在必要时使用

# 查看复制状态
redis-clI DEBUG REPLCONF
# 注:此命令不同版本行为可能不同

DEBUG 问题的应急处理

如果已经执行了 DEBUG SLEEP

# 无法打断 SLEEP,只能等待

# 紧急措施:
# 1. 如果主库在 SLEEP,准备切换
# 2. 通知应用层增加重试等待时间
# 3. Redis 恢复后检查:
#    - 主从状态
#    - 连接数
#    - 数据一致性

如果已经执行了 DEBUG SEGFAULT

# 进程已经崩溃

# 恢复步骤:
# 1. 检查 RDB/AOF 是否存在
# 2. 如果存在备份,确保不丢失
# 3. 重启 Redis(会自动恢复数据)
redis-server /etc/redis/redis.conf

# 4. 检查数据完整性
redis-clI DBSIZE
redis-clI INFO Keyspace

# 5. 重新建立主从
redis-clI SLAVEOF master-host 6379

如果 DEBUG 填满了内存

# DEBUG POPULATE 导致内存满

# 处理:
# 1. 立即修改淘汰策略
redis-clI CONFIG SET maxmemory-policy allkeys-lru

# 2. 等待淘汰释放内存
# 或者手动删除测试数据
redis-clI SCAN 0 MATCH "test:*" COUNT 1000 | while read key; do
    redis-clI UNLINK "$key"
done

# 3. 恢复正常配置
redis-clI CONFIG SET maxmemory-policy noeviction  # 如果是默认策略

面试要点

  • DEBUG 是高危命令:能导致 Redis 崩溃、阻塞、数据丢失
  • 生产环境必须禁用:rename-command DEBUG “”
  • ACL 保护:Redis 6.0+ 通过 ACL 限制命令执行
  • 排查来源:SLOWLOG + CLIENT LIST + 应用日志
  • 应急措施:禁用命令 ➝ ACL 控制 ➝ 审核操作流程
  • 安全最佳实践:开发可用,生产禁用,审计操作记录
  • 其他高危命令:FLUSHALL、FLUSHDB、SHUTDOWN、KEYS、CONFIG 同样需要保护
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容