本文件只是为了我在工作中使用方便记录。
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
-
b876e41e214a4530c61738cc9fcb53b6bb9412d
0
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
-
b876e41e214a4530c61738cc9fcb53b6bb9412d
0
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节点存在的问题;这里只需要提供出现异常情况的节点即可