1. 问题简述
前几天接收到报警,同时Redis团队监控到redis集群发生了主从切换;
最终分析原因是,删除大key,导致redis主服务器阻塞,sentinel哨兵认为主服务器宕机,进行了故障转移;如下图所示:
在Redis集群中,应用程序尽量避免使用大键;直接影响容易导致集群的容量和请求出现”倾斜问题“,同时在删除大键或者打键过期时,容易出现故障切换和应用程序雪崩的故障;
查询线上有一个集合键,集合oea_set_star_ol_2017元素个数达到4300万;当删除这个键,或者键过期时,会阻塞redis主进程,从而发生了主从切换;(集合中的每个元素对象都要释放内存空间,时间复杂度比较高)
2. 解决方案
众所周知,Redis是单进程执行命令请求的;集合已经有4000多万元素了,想要删除这个集合,肯定不能直接删除,否则必会阻塞主进程;
我们可以一点一点删除集合中的元素;
Redis 2.8以上版本提供了这么一个命令:SCAN 命令,其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令;
它们每次执行都只会返回少量元素;(而不会出现像 KEYS命令、 SMEMBERS 命令带来问题 —— 当 KEYS 命令被用于处理一个大的数据库时, 又或者