V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sujin190
V2EX  ›  Redis

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

  •  
  •   sujin190 ·
    snower · 2018-04-09 08:56:38 +08:00 · 7402 次点击
    这是一个创建于 2404 天前的主题,其中的信息可能已经有所发展或是发生改变。

    崩了。。求助

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

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

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

    master 是关闭持久化的,虽然是 bgsave 但是,似乎还是导致延时上涨,所有就由 slave 来 bgsave 了
    sujin190
        13
    sujin190  
    OP
       2018-04-09 20:05:01 +08:00
    @swulling #9 血崩,表示我现在很崩溃,master 被系统 kill 掉了,slave 的 bgsave 自己停了,数据也不知道哪去了大半。。。
    sujin190
        14
    sujin190  
    OP
       2018-04-09 20:06:20 +08:00
    @monsterxx03 #10 哦,master 被系统 kill 掉了,从库数据只剩一小半,奇怪了,说起来怎么防止 redis 被系统 oom kill 掉呢?
    monsterxx03
        15
    monsterxx03  
       2018-04-09 20:12:59 +08:00 via iPhone   ❤️ 1
    搜下 redis vm.overcommit_memory,估计你没设才会在 bgsave 的时候 oom,但还是要设置下 redis 的 max memory,占用内存到物理内存肯定会被 kill
    sujin190
        16
    sujin190  
    OP
       2018-04-09 23:09:04 +08:00
    @monsterxx03 #15 好的,我研究下,感谢!
    kimown
        17
    kimown  
       2018-04-10 07:17:01 +08:00 via Android
    @sujin190
    解决后能分享下问题原因吗
    catinred
        18
    catinred  
       2018-04-10 10:05:02 +08:00
    建议楼主先读读 Redis 的 FAQ https://redis.io/topics/faq
    sujin190
        19
    sujin190  
    OP
       2018-04-10 11:42:16 +08:00   ❤️ 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 连不上也不出系统错误,而是除了其他业务错误,导致其他系统告警完全忽略了,也是自己给自己挖了好大的坑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5324 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 07:25 · PVG 15:25 · LAX 23:25 · JFK 02:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.