redis集群中存在bigkey
问题概述
redis集群环境查询较慢,内存使用不均匀,为了避免影响业务,我们运维这边做了集群状态的分析,排查后发现,ping丢包、延时及redis日志均无异常,redis集群并未切换,但是慢日志中存在部分key值查询较为耗时,结合redis日常使用情况,我们决定对该集群做bigkey分析。
问题原因
bigkey不利于集群对内存的统一管理,存在丢失数据的隐患;由于Redis单线程的特性,操作bigkey的通常比较耗时,也就意味着阻塞Redis可能性越大,这样会造成客户端阻塞或者引起故障切换,它们通常出现在慢查询中。
解决方案
一、登录redis从节点做bgsave
(1)登录
/usr/local/redis/bin/redis-cli -p 6379 -a '密码'
(2)验证节点信息
redis 127.0.0.1:6379>info replication
(3)所有从节点在后台异步保存当前数据库的数据到磁盘
redis 127.0.0.1:6379>bgsave
(4)文件生成
/data/redis/6379/data/dump.rdb
(5)将 rdb 文件上传至分析机 10.0.0.51
scp -r /data/redis/6379/data/dump.rdb 10.0.0.51: /data/enmo/rdb/业务名称/
二、在分析机 10.0.0.51 使用 redis-rdb-tools 进行 bigkey 分析
(1)开始分析
for rdbfile in `ls`;
do
nohup /usr/local/bin/rdb -c memory -e utf8 $rdbfile > memory\_$rdbfile.csv &
nohup /usr/local/bin/rdb -c memory -e utf8 --bytes 102400 $rdbfile > memory\_$rdbfile\_100k.csv &
done
(2)生成以下CSV文件
memory_190_6379.rdb.csv
三、将CVS文件导入到mysql数据库中 --mysql信息(库名:redis_rdb 表名:bigkey)
(1)进入到 redis_rdb 库下,将所有分析结果表导入到 bigkey表中
LOAD DATA LOCAL INFILE '/data/enmo/rdb/session/session02/20210621/memory_194_6379.rdb.csv'
INTO TABLE bigkey
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
(2)查看bigkey表中前50行数据
select * from bigkey order by key_size desc limit 50;
(3)查看数据量大于100k的key
select * from bigkey where key_size > 102400;
最终,开发人员决定对bigkey依照业务逻辑进行拆分。bigkey拆分后,查询效率显著提高,redis运行正常。
标签:分析,6379,memory,redis,bigkey,rdb,data From: https://blog.51cto.com/u_13482808/7281049