35人参与 • 2026-01-04 • Redis
数据倾斜是指在redis分布式集群(如redis cluster或codis)中,数据(内存占用)或访问请求(qps)没有均匀地分布到各个节点上,导致部分节点负载过高,而其他节点相对空闲的现象。这违背了分布式系统负载均衡的设计初衷。
数据倾斜主要分为两种:
通常,两者会相互关联和加剧。
bgsave或rewriteaof操作耗时剧增,阻塞主线程风险高。cluster addslots 分配不均,或者迁移过程中出现异常,会导致部分节点管理的槽位更多,存储的数据也相应更多。{} 包裹键名的一部分,例如 user:{1000}:profile 和 user:{1000}:orders。redis会仅使用{}内的内容来计算槽位,从而保证相关联的多个key落在同一个节点。{global}:key1, {global}:key2),那么所有数据都会集中到同一个节点,造成严重的存储和请求倾斜。hot_news:2024)开头的key,由于哈希算法特性,可能恰好都映射到了同一个或某几个槽位。o(n) 复杂度的命令(如 hgetall、lrange 0 -1、keys *、sort),消耗大量cpu资源。查看集群节点与槽位分布:
redis-cli -c -h <host> -p <port> cluster nodes
观察每个节点后面的 slots 范围是否均匀,以及 connected 连接数。
分析节点内存与key数:
redis-cli -c -h <host> -p <port> info memory | grep used_memory_human redis-cli -c -h <host> -p <port> info keyspace
可以编写脚本遍历所有节点,对比数据。
redis-cli --bigkeys 命令(在集群模式下需对每个节点执行):redis-cli -h <host> -p <port> --bigkeys -i 0.1
redis-rdb-tools: 对rdb文件进行分析,生成内存报告,最准确。redis-cli --hotkeys 命令(需要先开启 maxmemory-policy 为 lfu):redis-cli -h <host> -p <port> --hotkeys
使用 monitor 命令(生产环境慎用,临时采样): 短暂运行,观察哪些key被频繁操作。
基于代理或客户端埋点: 在应用端或代理层(如codis proxy、twemproxy)统计key的访问频率。
all_users,可以拆分为 all_users:shard1、all_users:shard2 ... 等多个子key,通过哈希将用户id分散到不同子key中。redis-cli --cluster rebalance 命令,在节点间重新均衡槽位。但这只能均衡槽位数量,无法解决因大key或hash tag导致的单个槽位内数据过大的问题。hot_news)拆分为多个物理key(如 hot_news:1、hot_news:2)。客户端访问时,通过一个确定性规则(如 用户id % 分片数)决定访问哪个分片。这本质上是将压力从单key分摊到多节点。keys、flushall、hgetall 等),使用 scan 系列命令替代。redis数据倾斜的本质是数据或流量在分布式系统中分布不均。解决思路可以概括为:
通过系统性的监控、分析和优化,可以有效地管理和缓解redis数据倾斜问题,保证缓存服务的稳定和高性能。
到此这篇关于redis 数据倾斜问题详解的文章就介绍到这了,更多相关redis 数据倾斜内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论