Redis小功能大用处-replica-ignore-maxmemory
由于诸多原因,现在已经很少能长篇大论介绍Redis的相关技术,但日常工作以及脑子中经常想整理和总结一些Redis的点点滴滴,既能帮助自己记录问题,又能帮助他人减少碰到类似问题,于是有个想法,准备写一个小的系列:Redis小功能大用处。
本文将介绍Redis 5后一个新的配置replica-ignore-maxmemory (默认开启)
一、问题
1.现象:
• 缓存场景:允许逐出,常年逐出。
• 主从不一致:主从键值个数不一致。
• 故障切换后,命中率下降穿透DB,可用性下降,故障!
• 版本:4.0.14
• 从节点:read only
2. 简单分析
常见的不一致大概几种情况
• maxmemory不一致。
• 数据结构优化参数不一致:查看ziplist相关、quicklist相关等配置一致。
二、错误认知:从节点更新数据完全听从主节点
1. 客户端命令:yes
2. 过期删除命令:yes(since 4.0.11彻底解决)
具体参考:Redis2.8-4.0过期键优化详解
3. 逐出删除命令:各干各的,主依然同步给从
无论是all-keys、还是volatile,主节点和从节点逐出的key肯定不可能完全一样(因为LRU也是近似算法),但主节点会自己删除的key命令同步给从节点,长此以往master节点数据会slave节点多,具体可以参考server.c每次处理命令都要做maxemory的检测和处理,直到满足条件,才会执行命令call
三、为什么这样设计
缓存场景,运行丢数据,没有过多考虑命中率问题。
四、Redis 5.0的改进
含义很明显:从节点不会自己逐出,下面代码也有简单说明
• 配置名:replica-ignore-maxmemory
• 配置别名:slave-ignore-maxmemory
• 可以动态修改:MODIFIABLE_CONFIG
• 默认值为1:yes
evict.c的变化:从节点且开启了repl_slave_ignore_maxmemory不参与逐出
五、最后
本文只是介绍一个很实用的配置,内容比较简单,请勿喷。
文章转自公众号:Redis开发运维实战