最近刚换了个组,然后遇到了一个redis内存逐出的事故,但是监控没有发生任何报警。
因为刚转组不熟悉,所以就开始一点点了解,下面是一些背景。
redis使用的是proxy集群分布式架构。
业务上设计的redis是缓存型allkeys-lru淘汰策略,但是业务上把一些长久存储型的数据也保存在了此redis集群中。
redis大概分片数是50。每台机器2G的内存
之前一直相安无事,然后某一天的下午,突然发出了大量的键逐出的报警。
观察redis内存整体使用率,只用了120G/200G,使用率不到60%。
感觉不太对,又去grafana上看了metrics打点,发现有好几台机器的内存确实是已经满了,并且发生了逐出现象,内存逐出后可用内存升至1G左右,大约去掉了这些机器总内存的一半。
由于这些redis集群上有持久化数据(虽然也可以比较容易的恢复),所以造成的影响还是比较大的。如果是缓存的数据,如果对线上没有造成性能影响,那丢就丢了。
简单总结一下此次事故出现的原因:
一是redis监控只做了总内存的监控阈值报警,没有做每台机器的阈值报警;
二是不要太相信缓存会在分布式集群上比较均匀的分布,很有可能有一些数据会集中在某几个槽(slot)上,从而造成单槽内存逐出;
三是缓存型数据和存储型一定要分开存储,不要偷懒,不然出事故了可就要哭了。
网友评论