查看Redis集群主从对应关系工具

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 工具的作用: 1)比“cluster nodes”更为直观的显示结果 2)指出落在同一个IP上的master 3)指出落在同一个IP上的master和slave对 运行效果图: 源代码(可从https://github.

工具的作用:

1)比“cluster nodes”更为直观的显示结果

2)指出落在同一个IP上的master

3)指出落在同一个IP上的master和slave对


运行效果图:



源代码(可从 https://github.com/eyjian/redis-tools下载):

点击(此处)折叠或打开

  1. #!/bin/bash
  2. # 源码位置:https://github.com/eyjian/redis-tools
  3. #
  4. # Redis集群部署注意事项:
  5. # 在一个物理IP上部署多个redis实例时,要避免:
  6. # 1) 一对master和slave出现在同一物理IP上(影响:物理机挂掉,部分keys彻底不可用)
  7. # 2) 同一物理IP上出现多个master(影响:物理机挂掉,将导致两对切换)
  8. #
  9. # 使用示例(带一个参数):
  10. # show_redis_map.sh 192.168.0.21:6380
  11. #
  12. # 检查Redis集群master和slave映射关系的命令行工具:
  13. # 1) 查看是否多master出现在同一IP;
  14. # 2) 查看一对master和slave出现在同一IP。
  15. #
  16. # 当同一IP出现二个或多个master,则相应的行标星显示,
  17. # 如果一对master和slave出现在同一IP上,则相应的行标星显示。
  18. #
  19. # 输出效果:
  20. # [01][MASTER] 192.168.0.21:6379 00cc3f37d938ee8ba672bc77b71d8e0a3881a98b
  21. # [02][MASTER] 192.168.0.22:6379 1115713e3c311166207f3a9f1445b4e32a9202d7
  22. # [03][MASTER] 192.168.0.23:6379 5cb6946f46ccdf543e5a1efada6806f3df72b727
  23. # [04][MASTER] 192.168.0.24:6379 b91b1309b05f0dcc1e3a2a9521b8c00702999744
  24. # [05][MASTER] 192.168.0.25:6379 00a1ba8e5cb940ba4171e0f4415b91cea96977bc
  25. # [06][MASTER] 192.168.0.26:6379 64facb201cc5c7d8cdccb5fa211af5e1a04a9786
  26. # [07][MASTER] 192.168.0.27:6379 f119780359c0e43d19592db01675df2f776181b1
  27. # [08][MASTER] 192.168.0.28:6379 d374e28578967f96dcb75041e30a5a1e23693e56
  28. # [09][MASTER] 192.168.0.29:6380 a153d2071251657004dbe77abd10e2de7f0a209a
  29. #
  30. # [01][SLAVE=>MASTER] 192.168.0.21:6380 => 192.168.0.28:6379
  31. # [02][SLAVE=>MASTER] 192.168.0.22:6380 => 192.168.0.25:6379
  32. # [03][SLAVE=>MASTER] 192.168.0.23:6380 => 192.168.0.24:6379
  33. # [04][SLAVE=>MASTER] 192.168.0.24:6380 => 192.168.0.23:6379
  34. # [05][SLAVE=>MASTER] 192.168.0.25:6380 => 192.168.0.22:6379
  35. # [06][SLAVE=>MASTER] 192.168.0.26:6380 => 192.168.0.27:6379
  36. # [07][SLAVE=>MASTER] 192.168.0.27:6380 => 192.168.0.29:6380
  37. # [08][SLAVE=>MASTER] 192.168.0.28:6380 => 192.168.0.21:6379
  38. # [09][SLAVE=>MASTER] 192.168.0.29:6379 => 192.168.0.26:6379
  39. REDIS_CLI=${REDIS_CLI:-redis-cli}
  40. REDIS_IP=${REDIS_IP:-127.0.0.1}
  41. REDIS_PORT=${REDIS_PORT:-6379}
  42. function usage()
  43. {
  44. echo "usage: `basename $0` redis_node"
  45. echo "example: `basename $0` 127.0.0.1:6379"
  46. }
  47. # with a parameter: single redis node
  48. if test $# -ne 1; then
  49. usage
  50. exit 1
  51. fi
  52. # 检查参数
  53. eval $(echo "$1" | awk -F[\:] '{ printf("REDIS_IP=%s\nREDIS_PORT=%s\n",$1,$2) }')
  54. if test -z "$REDIS_IP" -o -z "$REDIS_PORT"; then
  55. echo "parameter error"
  56. usage
  57. exit 1
  58. fi
  59. # 确保redis-cli可用
  60. which "$REDIS_CLI" > /dev/null 2>&1
  61. if test $? -ne 0; then
  62. echo -e "\`redis-cli\` not exists or not executable"
  63. exit 1
  64. fi
  65. # master映射表,key为master的id,value为master的“ip:port”
  66. declare -A master_map=()
  67. # slave映表,key为master的id,value为slave的“ip:port”
  68. declare -A slave_map=()
  69. master_nodes_str=
  70. master_slave_maps_str=
  71. # 找出所有master
  72. masters=`$REDIS_CLI -h $REDIS_IP -p $REDIS_PORT CLUSTER NODES | awk -F[\ \@] '/master/{ printf("%s,%s\n",$1,$2); }' | sort`
  73. for master in $masters;
  74. do
  75. eval $(echo $master | awk -F[,] '{ printf("master_id=%s\nmaster_node=%s\n",$1,$2); }')
  76. master_map[$master_id]=$master_node
  77. if test -z "$master_nodes_str"; then
  78. master_nodes_str="$master_node|$master_id"
  79. else
  80. master_nodes_str="$master_node|$master_id,$master_nodes_str"
  81. fi
  82. done
  83. # 找出所有slave
  84. # “CLUSTER NODES”命令的输出格式当前有两个版本,需要awk需要根据NF的值做区分
  85. slaves=`$REDIS_CLI -h $REDIS_IP -p $REDIS_PORT CLUSTER NODES | awk -F[\ \@] '/slave/{ if (NF==9) printf("%s,%s\n",$5,$2); else printf("%s,%s\n",$4,$2); }' | sort`
  86. for slave in $slaves;
  87. do
  88. eval $(echo $slave | awk -F[,] '{ printf("master_id=%s\nslave_node=%s\n",$1,$2); }')
  89. slave_map[$master_id]=$slave_node
  90. done
  91. for key in ${!master_map[@]}
  92. do
  93. master_node=${master_map[$key]}
  94. slave_node=${slave_map[$key]}
  95. if test -z "$master_slave_maps_str"; then
  96. master_slave_maps_str="$slave_node|$master_node"
  97. else
  98. master_slave_maps_str="$slave_node|$master_node,$master_slave_maps_str"
  99. fi
  100. done
  101. # 显示所有master
  102. index=1
  103. old_master_node_ip=
  104. master_nodes_str=`echo "$master_nodes_str" | tr ',' '\n' | sort`
  105. for master_node_str in $master_nodes_str;
  106. do
  107. eval $(echo "$master_node_str" | awk -F[\|] '{ printf("master_node=%s\nmaster_id=%s\n", $1, $2); }')
  108. eval $(echo "$master_node" | awk -F[\:] '{ printf("master_node_ip=%s\nmaster_node_port=%s\n", $1, $2); }')
  109. tag=
  110. # 同一IP上出现多个master,标星
  111. if test "$master_node_ip" = "$old_master_node_ip"; then
  112. tag=" (*)"
  113. fi
  114. printf "[%02d][MASTER] %-20s \033[0;32;31m%s\033[m%s\n" $index "$master_node" "$master_id" "$tag"
  115. old_master_node_ip=$master_node_ip
  116. index=$((++index))
  117. done
  118. # 显示所有slave到master的映射
  119. index=1
  120. echo ""
  121. master_slave_maps_str=`echo "$master_slave_maps_str" | tr ',' '\n' | sort`
  122. for master_slave_map_str in $master_slave_maps_str;
  123. do
  124. eval $(echo "$master_slave_map_str" | awk -F[\|] '{ printf("slave_node=%s\nmaster_node=%s\n", $1, $2); }')
  125. eval $(echo "$slave_node" | awk -F[\:] '{ printf("slave_node_ip=%s\nslave_node_port=%s\n", $1, $2); }')
  126. eval $(echo "$master_node" | awk -F[\:] '{ printf("master_node_ip=%s\nmaster_node_port=%s\n", $1, $2); }')
  127. tag=
  128. # 一对master和slave出现在同一IP,标星
  129. if test ! -z "$slave_node_ip" -a "$slave_node_ip" = "$master_node_ip"; then
  130. tag=" (*)"
  131. fi
  132. n=$(($index % 2))
  133. if test $n -eq 0; then
  134. printf "[%02d][SLAVE=>MASTER] \033[1;33m%21s\033[m => \033[1;33m%s\033[m%s\n" $index $slave_node $master_node "$tag"
  135. else
  136. printf "[%02d][SLAVE=>MASTER] %21s => %s%s\n" $index $slave_node $master_node "$tag"
  137. fi
  138. index=$((++index))
  139. done
  140. echo ""


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
3月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
123 0
|
1月前
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
112 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
3月前
|
存储 NoSQL Redis
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
|
3月前
|
NoSQL 数据可视化 Linux
2022 年超详细步骤讲解 CentOS 7 安装Redis 。解决Redis Desktop Manager 图形化工具连接失败解决 ;connection failed处理。开机自启Redis
这篇文章提供了在CentOS 7上安装Redis的详细步骤,包括上传Redis安装包、解压安装、编译、安装、备份配置文件、修改配置以支持后台运行和设置密码、启动Redis服务、使用客户端连接Redis、关闭Redis服务、解决Redis Desktop Manager图形化工具连接失败的问题、设置Redis开机自启动,以及Redis服务的启动和停止命令。
2022 年超详细步骤讲解 CentOS 7 安装Redis 。解决Redis Desktop Manager 图形化工具连接失败解决 ;connection failed处理。开机自启Redis
|
3月前
|
存储 监控 NoSQL
揭秘Redis慢查询:这个工具将彻底改变你的性能优化策略!
【8月更文挑战第8天】在互联网应用中,数据库性能常成瓶颈。Redis作为高速内存数据库亦可能遭遇慢查询问题。本文探讨慢查询成因与解决方法。首先定义慢查询及其影响因素,随后介绍Redis内置的慢查询日志功能,通过配置`slowlog-log-slower-than`与`slowlog-max-len`来监控执行时间过长的命令。利用`SLOWLOG get`命令分析日志,定位性能瓶颈所在。以`LRANGE`命令为例,提出数据结构调整、使用流水线、限制返回元素数量、异步执行及优化内存使用等策略。最终实现Redis性能提升,确保应用流畅运行。性能优化需持续监控、分析与调整。
89 1
|
4月前
|
存储 NoSQL 算法
Redis 集群模式搭建
Redis 集群模式搭建
92 5
|
3月前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的问题
|
3月前
|
NoSQL 数据可视化 Linux
一文教会你如何在Linux系统中使用Docker安装Redis 、以及如何使用可视化工具连接【详细过程+图解】
这篇文章详细介绍了如何在Linux系统中使用Docker安装Redis,并提供了使用可视化工具连接Redis的步骤。内容包括安装Redis镜像、创建外部配置文件、映射文件和端口、启动和测试Redis实例、配置数据持久化存储,以及使用可视化工具连接和操作Redis数据库的过程。