Redis 集群相关问题

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


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

 


 
 
  1. ##### redis.sh
  2. REDIS_CLI=/home/xingchen/SoftWareBin/just_clients/redis/bin/redis-cli
  3. COMMAND= $@
  4. ${REDIS_CLI} -h 172.22.212.2 -p 6370 $@
  5. ${REDIS_CLI} -h 172.22.212.2 -p 6371 $@
  6. ${REDIS_CLI} -h 172.22.212.2 -p 6372 $@
  7. ${REDIS_CLI} -h 172.22.213.2 -p 6370 $@
  8. ${REDIS_CLI} -h 172.22.213.2 -p 6371 $@
  9. ${REDIS_CLI} -h 172.22.213.2 -p 6372 $@
  10. ${REDIS_CLI} -h 172.21.221.2 -p 6370 $@
  11. ${REDIS_CLI} -h 172.21.221.2 -p 6371 $@
  12. ${REDIS_CLI} -h 172.21.221.2 -p 6372 $@

2、查看集群状态
 


 
 
  1. $ sh redis.sh info memory | grep used_memory_human // 查看 redis 每个节点已用内存
  2. $ sh redis.sh info memory | grep maxmemory_human // 查看 redis 每个节点可用的最大内存(如果发现查询结果为 0,则表示不限制)
  3. $ sh redis.sh dbsize // 查看 redis 每个节点中 key 的数量。如果发现节点之间的数据量差别极大,这时候就需要考虑是否存在数据倾斜的问题
  4. // 即是否存在某些 key 的值过大
  5. $ sh redis.sh cluster info | grep state // 查询每个节点的状态。如果结果出现 fail,则集群中某些节点可能存在问题
  6. cluster_state:ok
  7. cluster_state:ok
  8. cluster_state:ok
  9. cluster_state:ok
  10. cluster_state:ok
  11. cluster_state:ok
  12. $ sh redis.sh cluster nodes // 查询节点的主从信息
  13. # 正常结果:
  14. 766c24407d8efb665d8335a41a544502d49f4aeb 172.22. 107.1: 6370@16370 master - 0 1544581985130 5 connected 10923- 16383
  15. b876e41e214a4530c61738cc9fcb53b6bb9412d 0 172.22. 73.1: 6371@16371 slave af543c9c01a7f0261061b1bf306c22b7db43eaf3 0 1544581987129 4 connected
  16. 01ad3a948720330b67b7ae22492d47a1b67db518 172.22. 73.1: 6370@16370 master - 0 1544581987000 3 connected 5461- 10922
  17. 033b1078ca9d049b47b7fead91958c387925303b 172.22. 72.1: 6371@16371 slave 01ad3a948720330b67b7ae22492d47a1b67db518 0 1544581986129 3 connected
  18. 0640d2e72ee9554c5579739fb6d04bf27b92495a 172.22. 107.1: 6371@16371 slave 766c24407d8efb665d8335a41a544502d49f4aeb 0 1544581984129 6 connected
  19. af543c9c01a7f0261061b1bf306c22b7db43eaf3 172.22. 72.1: 6370@16370 myself,master - 0 1544581983000 1 connected 0- 5460
  20. b876e41e214a4530c61738cc9fcb53b6bb9412d 0 172.22. 73.1: 6371@16371 slave af543c9c01a7f0261061b1bf306c22b7db43eaf3 0 1544581986204 4 connected
  21. 033b1078ca9d049b47b7fead91958c387925303b 172.22. 72.1: 6371@16371 myself,slave 01ad3a948720330b67b7ae22492d47a1b67db518 0 1544581984000 2 connected
  22. # 异常结果(如果出现了类似于以下的结果,则说明当前redis集群状态异常,部分slot迁移时出现问题)
  23. [ 5458-<-b4c6c588vf4d44fdfce13685379c091dc423f85] [ 5459-<-b4c6c588vf4d44fdfae136f5379c091dc423f8e] [ 5460-<-b4c6c5887f4d44fd3ce1368537bc091dc423f83] ...
  24. ...
  25. ...
  26. ...
  27. $ watch "sh redis.sh randomkey" // 从 redis 的每个节点中取一个随机的key;linux 的 watch 命令可以保证两秒一刷新。
  28. key_1
  29. CLUSTER DOWN ; the cluster is down // (提示文本可能有很小的出入,但是核心的输出信息就是这样)
  30. CLUSTER DOWN ; the cluster is down // 表示当前 redis 节点被阻塞(可能是因为slot迁移、或者redis节点重启后在初始化数据)
  31. key_4
  32. key_5
  33. key_6

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


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

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


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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值