本文件只是为了我在工作中使用方便记录。


1、首先可以针对现场环境编写一个较为常用的脚本。通过这个脚本,可以保证在 redis 集群上的每个节点都执行统一的命令

 

##### redis.sh
REDIS_CLI=/home/xingchen/SoftWareBin/just_clients/redis/bin/redis-cli
COMMAND=$@

${REDIS_CLI} -h 172.22.212.2 -p 6370 $@
${REDIS_CLI} -h 172.22.212.2 -p 6371 $@
${REDIS_CLI} -h 172.22.212.2 -p 6372 $@
${REDIS_CLI} -h 172.22.213.2 -p 6370 $@
${REDIS_CLI} -h 172.22.213.2 -p 6371 $@
${REDIS_CLI} -h 172.22.213.2 -p 6372 $@
${REDIS_CLI} -h 172.21.221.2 -p 6370 $@
${REDIS_CLI} -h 172.21.221.2 -p 6371 $@
${REDIS_CLI} -h 172.21.221.2 -p 6372 $@

2、查看集群状态
 

$ sh redis.sh info memory | grep used_memory_human        // 查看 redis 每个节点已用内存
$ sh redis.sh info memory | grep maxmemory_human          // 查看 redis 每个节点可用的最大内存(如果发现查询结果为0,则表示不限制)
$ sh redis.sh dbsize                                      // 查看 redis 每个节点中 key 的数量。如果发现节点之间的数据量差别极大,这时候就需要考虑是否存在数据倾斜的问题
                                                          // 即是否存在某些 key 的值过大


$ sh redis.sh cluster info | grep state                   // 查询每个节点的状态。如果结果出现 fail,则集群中某些节点可能存在问题
cluster_state:ok
cluster_state:ok
cluster_state:ok
cluster_state:ok
cluster_state:ok
cluster_state:ok



$ sh redis.sh cluster nodes                               // 查询节点的主从信息
# 正常结果:
766c24407d8efb665d8335a41a544502d49f4aeb 172.22.107.1:6370@16370 master - 0 1544581985130 5 connected 10923-16383
b876e41e214a4530c61738cc9fcb53b6bb9412d0 172.22.73.1:6371@16371 slave af543c9c01a7f0261061b1bf306c22b7db43eaf3 0 1544581987129 4 connected
01ad3a948720330b67b7ae22492d47a1b67db518 172.22.73.1:6370@16370 master - 0 1544581987000 3 connected 5461-10922
033b1078ca9d049b47b7fead91958c387925303b 172.22.72.1:6371@16371 slave 01ad3a948720330b67b7ae22492d47a1b67db518 0 1544581986129 3 connected
0640d2e72ee9554c5579739fb6d04bf27b92495a 172.22.107.1:6371@16371 slave 766c24407d8efb665d8335a41a544502d49f4aeb 0 1544581984129 6 connected
af543c9c01a7f0261061b1bf306c22b7db43eaf3 172.22.72.1:6370@16370 myself,master - 0 1544581983000 1 connected 0-5460
b876e41e214a4530c61738cc9fcb53b6bb9412d0 172.22.73.1:6371@16371 slave af543c9c01a7f0261061b1bf306c22b7db43eaf3 0 1544581986204 4 connected
033b1078ca9d049b47b7fead91958c387925303b 172.22.72.1:6371@16371 myself,slave 01ad3a948720330b67b7ae22492d47a1b67db518 0 1544581984000 2 connected
# 异常结果(如果出现了类似于以下的结果,则说明当前redis集群状态异常,部分slot迁移时出现问题)
[5458-<-b4c6c588vf4d44fdfce13685379c091dc423f85] [5459-<-b4c6c588vf4d44fdfae136f5379c091dc423f8e] [5460-<-b4c6c5887f4d44fd3ce1368537bc091dc423f83] ...
...
...
...


$ watch "sh redis.sh randomkey"                           // 从 redis 的每个节点中取一个随机的key;linux 的 watch 命令可以保证两秒一刷新。
key_1
CLUSTER DOWN ; the cluster is down                        // (提示文本可能有很小的出入,但是核心的输出信息就是这样)
CLUSTER DOWN ; the cluster is down                        // 表示当前 redis 节点被阻塞(可能是因为slot迁移、或者redis节点重启后在初始化数据)
key_4
key_5
key_6

3、比较笨的方法删除多个Key

#将以my.test_key开头的key取出来放到文件中
$ sh redis.sh keys my.test_key* > redis_out.txt
#通过awk拼接字符串对没个key进行del
$ cat redis_out.txt | awk -F '###'  'BEGIN {print "#!/bin/sh"}  {print "sh redis.sh del "$1}} END {print ""}' > redis_out.sh
$ sh redis_out.sh 

4、集群问题修复命令(主要针对于 sh redis.sh cluster nodes 命令查询时得到异常结果的情况 )


# cd_redis 在 linux 服务器上 cd 到 redis 的安装路径
# 注意,正常来说,redis集群会有多个节点,但是理论上来说只有一个节点可以顺利执行以下命令
# 一般是 redis 的第一个节点,但是也可能是其他节点,因此建立都执行一遍
$ ./src/redis-trib.rb check ${redis_ip}:${redis_port}                   // 检查redis节点是否存在问题;这里只需要提供出现异常情况的节点即可
$ ./src/redis-trib.rb fix ${redis_ip}:${redis_port}                     // 尝试修复redis节点存在的问题;这里只需要提供出现异常情况的节点即可
01-19 03:20