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


暂无评论内容