背景:有一套小redis集群,已经n长时间没有管过了,几百G内存不够用了,运维中心频繁资源告警,为了不影响应用正常使用,所以有了这次排查的过程。
redis-rdb-tools 安装
环境:Python 2.7
-
python redis :https://pypi.python.org/packages/source/r/redis/redis-2.8.0.tar.gz
tar -zxvf redis-2.8.0.tar.gz cd redis-2.8.0/ python2.7 setup.py install
-
python-lzf:https://pypi.org/project/python-lzf/
tar -zxvf python-lzf-0.2.4.tar.gz cd python-lzf-0.2.4/ python2.7 setup.py install
-
redis-rdb-tools:https://github.com/sripathikrishnan/redis-rdb-tools
# clone到本地以后打zip包 unzip redis-rdb-tools.zip cd redis-rdb-tools/ python2.7 setup.py install
计算KEY的数量
sh count-key.sh key*
单节点key的数量
# ! bin/bash
password="你的redis密码"
redis_home=/usr/local/bin
usage() {
echo "Usage: count.sh <redis_key>"
exit 0
}
if [ ! -n "$1" ] ;then
usage
else
for ip in 3 4 5 6 7 8 ;do
data_size=$($redis_home/redis-cli -h 0.0.0.$ip -p 6379 -c -a $password --scan --pattern "$1" | wc -l)
echo "0.0.0.$ip is key [$1] size:$data_size"
done
fi
0.0.0.$ip 需要改成你自己的ip和范围,太多自己优化一下写法,再套一层
所有节点key的总数量
# ! bin/bash
password="你的redis密码"
redis_home=/usr/local/bin
n=0
usage() {
echo "Usage: ttl.sh <redis_key>"
exit 0
}
if [ ! -n "$1" ] ;then
usage
else
for ip in 3 4 5 6 7 8 ;do
data_size=$($redis_home/redis-cli -h 0.0.0.$ip -p 6379 -c -a $password --scan --pattern "$1" | wc -l)
n=$((${n} + $data_size))
done
fi
echo "key [$1] total size:$n"
分析db文件计算某个key在单节点内存占用
rdb -c memory -k "keys*" >> /tmp/file.csv
# 分析出的csv第四列为单个key的大小bytes
cat /tmp/file.csv |awk -F"," '{sum +=$4};END{print sum }'
以上就是本次一个简单的排查分析,最终已经定位到了过大的key,现已经迁移到了新环境