测试环境:
CentOS7.6 redis 三主三从:
server | port | 主从标记 |
---|---|---|
111.111.111.110 | 7000 | slaver |
111.111.111.111 | 7001 | slaver |
111.111.111.112 | 7002 | master |
111.111.111.113 | 7003 | master |
111.111.111.114 | 7004 | master |
111.111.111.115 | 7005 | slaver |
脚本1:查找所有的主节点槽位下的指定redis key并落盘到文件中
#!/bin/bash
##随便登录集群中的一个节点,然后识别出所有的主节点
my_array=`/usr/local/bin/redis-cli -h 111.111.111.110 -p 7000 -c -a ${REDIS_CLUSTER_PASSWORD} --raw cluster nodes | grep master | awk '{print $2}'`
echo "master node is as follows:"
echo "$my_array"
echo "-------------------------------------"
##计数使用
num=1
##循环每个主节点, 找出指定的key
for a in $my_array
do
echo "第$num个master node: $a"
##将 111.111.111.110:7000 拆成 111.111.111.110 与 7000
OLD_IFS="$IFS"
IFS=":"
arr=($a)
IFS="$OLD_IFS"
echo "${arr[0]}=${arr[1]}"
##$1 传递key名称的模糊查询 $2 传递文件名称,可以用key做文件名称的前缀
#/usr/local/bin/redis-cli -c -h "${arr[0]}" -p ${arr[1]} -c -a ${REDIS_CLUSTER_PASSWORD} --raw KEYS "$1" >>/home/bigdata_admin/RSULTS/$2#${arr[0]}_${arr[1]}
/usr/local/bin/redis-cli -h "${arr[0]}" -p ${arr[1]} -c -a ${REDIS_CLUSTER_PASSWORD} --raw KEYS "$1" >>`pwd`/RSULTS/$2#${arr[0]}_${arr[1]}
num=$((num+1))
done
调用脚本,查找所有主节点上槽位下的redis key:
sh findFixKey.sh redis_prefix* stored_file_prefix
脚本2:读取落盘文件中redis key并删除之
#!/bin/bash
path=$1
my_array=(`ls $1`)
echo "-----${my_array[@]}"
count="${#my_array[@]}"
echo $count
if [ $count -gt 0 ];then
for a in ${my_array[@]}
do
TODAY=`date "+%Y-%m-%d %H:%M:%S"`
echo "-----脚本执行日期:$TODAY,执行开始-----"
## henan#111.111.111.110_7000
echo -e "\n\n-------正在操作文件: $a"
# 截取文件名总的ip和port,以便key在哪台主节点可以进入对应server上删除指定数据
# NF 表示的是浏览记录的域的个数
# $NF 表示的最后一个Field(列),即输出最后一个字段的内容
ip=`echo $a | awk -F "#" '{print $NF}' | awk -F "_" '{print $1}'`
port=`echo $a | awk -F "#" '{print $NF}' | awk -F "_" '{print $2}'`
## 计数
num=1
while read line
do
echo "-----文件 $a 的第$num个key是:$line"
## 执行删除redis key操作
/usr/local/bin/redis-cli -h $ip -p $port -c -a ${REDIS_CLUSTER_PASSWORD} --raw del "$line"
## 计数累加
num=$((num+1))
done < ./${path}/$a
done
else
echo "入参文件夹$path 中没有文件,请仔细核对!"
fi
执行删除脚本,脚本传入上一步中的文件夹:
sh forFileDelKey.sh RESULTS/
如果已知redis主节点list,可以简单使用如下方式,清除指定前缀的redis key:
redis-cli -h $ip -p $port -c -a ${REDIS_CLUSTER_PASSWORD} --raw keys "${指定前缀}*" | xargs redis-cli -h $ip -p $port -c -a ${REDIS_CLUSTER_PASSWORD} --raw del
参考列表:
版权声明:本文为liuwei0376原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。