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

2018-04-09 08:56:38 +08:00
 sujin190

崩了。。求助

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

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

info 看到的里面 keys 是包含过期 key 的.
judeng
2018-04-09 16:02:03 +08:00
@sujin190 没看不懂问题; redis 不会自动 bgsave,不管是 master 还是 slave
sujin190
2018-04-09 20:03:31 +08:00
@judeng #11 slave,从某天开始突然不 bgsave,又没注意,被坑了,不知道这种情况会是啥问题,难道是内存不足,无法完成 bgsave 么?

master 是关闭持久化的,虽然是 bgsave 但是,似乎还是导致延时上涨,所有就由 slave 来 bgsave 了
sujin190
2018-04-09 20:05:01 +08:00
@swulling #9 血崩,表示我现在很崩溃,master 被系统 kill 掉了,slave 的 bgsave 自己停了,数据也不知道哪去了大半。。。
sujin190
2018-04-09 20:06:20 +08:00
@monsterxx03 #10 哦,master 被系统 kill 掉了,从库数据只剩一小半,奇怪了,说起来怎么防止 redis 被系统 oom kill 掉呢?
monsterxx03
2018-04-09 20:12:59 +08:00
搜下 redis vm.overcommit_memory,估计你没设才会在 bgsave 的时候 oom,但还是要设置下 redis 的 max memory,占用内存到物理内存肯定会被 kill
sujin190
2018-04-09 23:09:04 +08:00
@monsterxx03 #15 好的,我研究下,感谢!
kimown
2018-04-10 07:17:01 +08:00
@sujin190
解决后能分享下问题原因吗
catinred
2018-04-10 10:05:02 +08:00
建议楼主先读读 Redis 的 FAQ https://redis.io/topics/faq
sujin190
2018-04-10 11:42:16 +08:00
@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 连不上也不出系统错误,而是除了其他业务错误,导致其他系统告警完全忽略了,也是自己给自己挖了好大的坑

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/445235

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX