sujin190
V2EX  ›  Redis

紧急求助,为什么 redis 用 info 看到有两百万左右 key,但是用 save 命令 dump 处理只有几万呢?

By sujin190 at 2018 年 4 月 9 日 · 8391 次点击

崩了。。求助

19 条回复  •  2018-04-10 11:42:16 +08:00
jyf
   1
jyf  
   2018 年 4 月 9 日   ❤️ 1
至少你要给个两个命令输出信息的截图啊
sujin190
   2
sujin190  
OP
   2018 年 4 月 9 日
@jyf #1 就是 redis-cli info 之后看到 key space 加起来有将近 200 多万 key,忘了保存截图了
唉,惊讶的发现 slave 切 master 之后,瞬间数据 key space 信息只剩 30 多万 key 了,血崩。。
monsterxx03
   3
monsterxx03  
   2018 年 4 月 9 日 via iPhone   ❤️ 1
因为你里面有很多 expire 的 key,忘了哪个版本之前,del 是不会同步到 slave 的,所以切了之后一下次全部 expire 了
sujin190
   4
sujin190  
OP
   2018 年 4 月 9 日
@monsterxx03 #3 还是 2.8,那么 slave 的内存怎么回收呢? bgsave 的时候似乎能处理过期问题,这跪了。。
judeng
   5
judeng  
   2018 年 4 月 9 日   ❤️ 1
info 命令显示的包含过期键,过期键 bgsave 时不会同步到 slave 上
rrfeng
   6
rrfeng  
   2018 年 4 月 9 日 via Android
keys
expires

楼主没学好英文吗?
sujin190
   7
sujin190  
OP
   2018 年 4 月 9 日
@rrfeng #6。。。这个不是重点好吧,先解决问题才是
sujin190
   8
sujin190  
OP
   2018 年 4 月 9 日
@judeng #5 好吧,slave 有不自动 bgsave 是啥问题? redis 坑还不少啊,感觉
swulling
   9
swulling  
   2018 年 4 月 9 日
expire 的 key 没有不是很正常么,为啥叫雪崩?
monsterxx03
   10
monsterxx03  
   2018 年 4 月 9 日   ❤️ 2
其实你应该可以不用管, 数据并没丢,只是 expire 的 key 被删除了, redis 的清除过期 key 的机制有好几种, 如果你去读 slave, 读到一个 过期的 key 会在访问时删除,如果内存达到了你设置的 max-memory, 过期的 key 会被优先踢出去.

info 看到的里面 keys 是包含过期 key 的.
judeng
   11
judeng  
   2018 年 4 月 9 日
@sujin190 没看不懂问题; redis 不会自动 bgsave,不管是 master 还是 slave
sujin190
   12
sujin190  
OP
   2018 年 4 月 9 日
@judeng #11 slave,从某天开始突然不 bgsave,又没注意,被坑了,不知道这种情况会是啥问题,难道是内存不足,无法完成 bgsave 么?

master 是关闭持久化的,虽然是 bgsave 但是,似乎还是导致延时上涨,所有就由 slave 来 bgsave 了
sujin190
   13
sujin190  
OP
   2018 年 4 月 9 日
@swulling #9 血崩,表示我现在很崩溃,master 被系统 kill 掉了,slave 的 bgsave 自己停了,数据也不知道哪去了大半。。。
sujin190
   14
sujin190  
OP
   2018 年 4 月 9 日
@monsterxx03 #10 哦,master 被系统 kill 掉了,从库数据只剩一小半,奇怪了,说起来怎么防止 redis 被系统 oom kill 掉呢?
monsterxx03
   15
monsterxx03  
   2018 年 4 月 9 日 via iPhone   ❤️ 1
搜下 redis vm.overcommit_memory,估计你没设才会在 bgsave 的时候 oom,但还是要设置下 redis 的 max memory,占用内存到物理内存肯定会被 kill
sujin190
   16
sujin190  
OP
   2018 年 4 月 9 日
@monsterxx03 #15 好的,我研究下,感谢!
kimown
   17
kimown  
   2018 年 4 月 10 日 via Android
@sujin190
解决后能分享下问题原因吗
catinred
   18
catinred  
   2018 年 4 月 10 日
建议楼主先读读 Redis 的 FAQ https://redis.io/topics/faq
sujin190
   19
sujin190  
OP
   2018 年 4 月 10 日   ❤️ 1
@kimown #17 slave 最后同步 master 的时间是正常的,bgsave 无法成功应该是内存不足的问题,可以看 @monsterxx03 #15 的提示

master 被系统 oom killer 是因为整台机器都给 redis 用了,所以没有设置最大内存使用,也没有设置 swap,redis 有峰值使用所以差不多申请了所有的物理内存,虽然平时只用差不多一般,机器上还部署有监控系统的 agent,所以其在某次申请内存的时候触发了系统 oom killer,也没有对 redis 进程的 oom_adj 进行特别设置,所以系统果断 kill 掉了 redis 进程

数据少了大半的问题就简单了,发现时 redis 已经被 kill 掉了一晚上了,所以都过期了啊

可以看看这个 https://cachecloud.github.io/2017/02/16/Redis%E7%9A%84Linux%E7%B3%BB%E7%BB%9F%E4%BC%98%E5%8C%96/

说起来做了监控,但没加 redis 的告警,业务使用 redis 连不上也不出系统错误,而是除了其他业务错误,导致其他系统告警完全忽略了,也是自己给自己挖了好大的坑
© 2026 V2EX · 37ms · 3.9.8.5