零、背景
在压测过程中发现有部分 redis cluster 节点内存占用比其它节点高(来自监控)
内存倾斜的隐患
- 更早达到容量瓶颈,触发淘汰策略
- 承担更多的负载( 读 / 写 ),导致节点压力增大,可能触发宕机。
一、问题
redis cluster slot 分配不均匀
redis cluster 集群内存分配算法的缺陷
问题算法:单节点内存 = 集群总内存 / 节点数
合理算法:单节点内存 = (集群总内容 / slot 数量) * 当前节点 slot 数量
二、排查
2.1 key 分布问题?
key 根据 crc16 计算之后比较均匀,排除 key 分布不均
在 key 均匀的情况下,考虑 slot 分配问题
2.2 slot 分布问题?
查找 slot 分布
redis 控制台执行:cluster slots
取最后一个节点的 rely 日志如下(日志含义见参考链接)
1 | (0)(0)10137 |
通过 awk 计算每个节点管理的槽 ( slot ) 数量
1 | # 把上面的日志粘贴到 slots 文件中 |
由于本案例当中,大部分节点都是包含 326 个 slot,问题节点明显偏多 360
2.2.1 相关命令解释
awk NR 代表行号
awk getline 获取下一行,并且赋值到 $0 (本意是代表当前行数据)。
sort -k 3 -r,以第三列排序(-k 3),倒序输出(-r)
head -n 3,输出前三行
三、结论
根据上述假设,经过验证,发现确实是由于 slot 分配不均匀导致
四、改进
人工手动调整 slot 较多节点的内存,使之达到与其它节点内存占用水平。
提示:redis 可以通过修改参数( maxmemory,单位 byte )调整最大内存。