Redis 中如何应对数据倾斜
什么是数据倾斜
如果 Redis 中的部署,采用的是切片集群,数据是会按照一定的规则分散到不同的实例中保存,比如,使用 Redis Cluster 或 Codis 。
数据倾斜会有下面两种情况:
1、 数据量倾斜 :在某些情况下,实例上的数据分布不均衡,某个实例上的数据特别多。
2、 数据访问倾斜 :虽然每个集群实例上的数据量相差不大,但是某个实例上的数据是热点数据,被访问得非常频繁。
发生了数据倾斜,会造成那些数据量大的和访问量高的实例节点,系统的负载升高,响应速度变慢。严重的情况会造成内存资源耗尽,引起系统崩溃。
数据量倾斜
数据量倾斜,也就是实例上的数据分布不均衡,某个实例中的数据分布得特别多 。
数据量的倾斜,主要有下面三种情况:
1、bigkey导致倾斜;
2、Slot分配不均衡导致倾斜;
3、Hash Tag导致倾斜。
下面来一一的分析下
bigkey导致倾斜
什么是 bigkey :我们将含有较大数据或含有大量成员、列表数据的 Key 称之为大Key。
- 一个 STRING 类型的 Key,它的值为 5MB(数据过大)
- 一个 LIST 类型的 Key,它的列表数量为 20000 个(列表数量过多)
- 一个 ZSET 类型的 Key,它的成员数量为 10000 个(成员数量过多)
- 一个 HASH 格式的 Key,它的成员数量虽然只有 1000 个但这些成员的 value 总大小为 100MB(成员体积过大)
如果某个实例中保存了 bigkey ,那么就有可能导致集群的数据倾斜。
bigkey 存在问题
- 内存空间不均匀:如果采用切片集群的部署方案,容易造成某些实例节点的内存分配不均匀;
- 造成网络拥塞:读取 bigkey 意味着需要消耗更多的网络流量,可能会更多 Redis 服务器造成影响;
- 过期删除:bigkey 不但读写慢&#