查看Redis集群主从对应关系工具
工具的作用:
1)比“cluster nodes”更为直观的显示结果
2)指出落在同一个IP上的master
3)指出落在同一个IP上的master和slave对
运行效果图:
源代码(可从https://github.com/eyjian/redis-tools下载):
#!/bin/bash
# 源码位置:https://github.com/eyjian/redis-tools
#
# Redis集群部署注意事项:
# 在一个物理IP上部署多个redis实例时,要避免:
# 1) 一对master和slave出现在同一物理IP上(影响:物理机挂掉,部分keys彻底不可用)
# 2) 同一物理IP上出现多个master(影响:物理机挂掉,将导致两对切换)
#
# 使用示例(带一个参数):
# show_redis_map.sh 192.168.0.21:6380
#
# 检查Redis集群master和slave映射关系的命令行工具:
# 1) 查看是否多master出现在同一IP;
# 2) 查看一对master和slave出现在同一IP。
#
# 当同一IP出现二个或多个master,则相应的行标星显示,
# 如果一对master和slave出现在同一IP上,则相应的行标星显示。
#
# 输出效果:
# [01][MASTER] 192.168.0.21:6379 00cc3f37d938ee8ba672bc77b71d8e0a3881a98b
# [02][MASTER] 192.168.0.22:6379 1115713e3c311166207f3a9f1445b4e32a9202d7
# [03][MASTER] 192.168.0.23:6379 5cb6946f46ccdf543e5a1efada6806f3df72b727
# [04][MASTER] 192.168.0.24:6379 b91b1309b05f0dcc1e3a2a9521b8c00702999744
# [05][MASTER] 192.168.0.25:6379 00a1ba8e5cb940ba4171e0f4415b91cea96977bc
# [06][MASTER] 192.168.0.26:6379 64facb201cc5c7d8cdccb5fa211af5e1a04a9786
# [07][MASTER] 192.168.0.27:6379 f119780359c0e43d19592db01675df2f776181b1
# [08][MASTER] 192.168.0.28:6379 d374e28578967f96dcb75041e30a5a1e23693e56
# [09][MASTER] 192.168.0.29:6380 a153d2071251657004dbe77abd10e2de7f0a209a
#
# [01][SLAVE=>MASTER] 192.168.0.21:6380 => 192.168.0.28:6379
# [02][SLAVE=>MASTER] 192.168.0.22:6380 => 192.168.0.25:6379
# [03][SLAVE=>MASTER] 192.168.0.23:6380 => 192.168.0.24:6379
# [04][SLAVE=>MASTER] 192.168.0.24:6380 => 192.168.0.23:6379
# [05][SLAVE=>MASTER] 192.168.0.25:6380 => 192.168.0.22:6379
# [06][SLAVE=>MASTER] 192.168.0.26:6380 => 192.168.0.27:6379
# [07][SLAVE=>MASTER] 192.168.0.27:6380 => 192.168.0.29:6380
# [08][SLAVE=>MASTER] 192.168.0.28:6380 => 192.168.0.21:6379
# [09][SLAVE=>MASTER] 192.168.0.29:6379 => 192.168.0.26:6379
REDIS_CLI=${REDIS_CLI:-redis-cli}
REDIS_IP=${REDIS_IP:-127.0.0.1}
REDIS_PORT=${REDIS_PORT:-6379}
function usage()
{
echo "usage: `basename $0` redis_node"
echo "example: `basename $0` 127.0.0.1:6379"
}
# with a parameter: single redis node
if test $# -ne 1; then
usage
exit 1
fi
# 检查参数
eval $(echo "$1" | awk -F[\:] '{ printf("REDIS_IP=%s\nREDIS_PORT=%s\n",$1,$2) }')
if test -z "$REDIS_IP" -o -z "$REDIS_PORT"; then
echo "parameter error"
usage
exit 1
fi
# 确保redis-cli可用
which "$REDIS_CLI" > /dev/null 2>&1
if test $? -ne 0; then
echo -e "\`redis-cli\` not exists or not executable"
exit 1
fi
# master映射表,key为master的id,value为master的“ip:port”
declare -A master_map=()
# slave映表,key为master的id,value为slave的“ip:port”
declare -A slave_map=()
master_nodes_str=
master_slave_maps_str=
# 找出所有master
masters=`$REDIS_CLI -h $REDIS_IP -p $REDIS_PORT CLUSTER NODES | awk -F[\ \@] '/master/{ printf("%s,%s\n",$1,$2); }' | sort`
for master in $masters;
do
eval $(echo $master | awk -F[,] '{ printf("master_id=%s\nmaster_node=%s\n",$1,$2); }')
master_map[$master_id]=$master_node
if test -z "$master_nodes_str"; then
master_nodes_str="$master_node|$master_id"
else
master_nodes_str="$master_node|$master_id,$master_nodes_str"
fi
done
# 找出所有slave
# “CLUSTER NODES”命令的输出格式当前有两个版本,需要awk需要根据NF的值做区分
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`
for slave in $slaves;
do
eval $(echo $slave | awk -F[,] '{ printf("master_id=%s\nslave_node=%s\n",$1,$2); }')
slave_map[$master_id]=$slave_node
done
for key in ${!master_map[@]}
do
master_node=${master_map[$key]}
slave_node=${slave_map[$key]}
if test -z "$master_slave_maps_str"; then
master_slave_maps_str="$slave_node|$master_node"
else
master_slave_maps_str="$slave_node|$master_node,$master_slave_maps_str"
fi
done
# 显示所有master
index=1
old_master_node_ip=
master_nodes_str=`echo "$master_nodes_str" | tr ',' '\n' | sort`
for master_node_str in $master_nodes_str;
do
eval $(echo "$master_node_str" | awk -F[\|] '{ printf("master_node=%s\nmaster_id=%s\n", $1, $2); }')
eval $(echo "$master_node" | awk -F[\:] '{ printf("master_node_ip=%s\nmaster_node_port=%s\n", $1, $2); }')
tag=
# 同一IP上出现多个master,标星
if test "$master_node_ip" = "$old_master_node_ip"; then
tag=" (*)"
fi
printf "[%02d][MASTER] %-20s \033[0;32;31m%s\033[m%s\n" $index "$master_node" "$master_id" "$tag"
old_master_node_ip=$master_node_ip
index=$((++index))
done
# 显示所有slave到master的映射
index=1
echo ""
master_slave_maps_str=`echo "$master_slave_maps_str" | tr ',' '\n' | sort`
for master_slave_map_str in $master_slave_maps_str;
do
eval $(echo "$master_slave_map_str" | awk -F[\|] '{ printf("slave_node=%s\nmaster_node=%s\n", $1, $2); }')
eval $(echo "$slave_node" | awk -F[\:] '{ printf("slave_node_ip=%s\nslave_node_port=%s\n", $1, $2); }')
eval $(echo "$master_node" | awk -F[\:] '{ printf("master_node_ip=%s\nmaster_node_port=%s\n", $1, $2); }')
tag=
# 一对master和slave出现在同一IP,标星
if test ! -z "$slave_node_ip" -a "$slave_node_ip" = "$master_node_ip"; then
tag=" (*)"
fi
n=$(($index % 2))
if test $n -eq 0; then
printf "[%02d][SLAVE=>MASTER] \033[1;33m%21s\033[m => \033[1;33m%s\033[m%s\n" $index $slave_node $master_node "$tag"
else
printf "[%02d][SLAVE=>MASTER] %21s => %s%s\n" $index $slave_node $master_node "$tag"
fi
index=$((++index))
done
echo ""
查看Redis集群主从对应关系工具的更多相关文章
- (转)基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案
转载自:http://warm-breeze.iteye.com/blog/2020413 本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedi ...
- 基于Redis Sentinel的Redis集群(主从Sharding)高可用方案(转)
本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在 ...
- 基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案
本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在 ...
- 查看Redis集群所有节点内存工具
指定集群中任意一个节点,查看集群中所有节点当前已用物理内存.配置的最大物理内存和系统物理内存. 源码(可从https://github.com/eyjian/redis-tools下载): #! ...
- Redis Sentinel的Redis集群(主从&Sharding)高可用方案
在不使用redis3.0之后版本的情况下,对于redis服务端一般是采用Sentinel哨兵模式,也就是一主多备的方式. 这里,先抛出三个问题, 问题1:单节点宕机数据丢失?问题2:多节点(节点间没有 ...
- redis集群主从集群搭建、sentinel(哨兵集群)配置以及Jedis 哨兵模式简要配置
前端时间项目上为了提高平台性能,为应用添加了redis缓存,为了提高服务的可靠性,redis部署了高可用的主从缓存,主从切换使用的redis自带的sentinel集群.现在权作记录.
- redis集群主从中断,报io过高 不错
问题原因:1.由于这个集群redis操作非常频繁,1分钟操作数据达到1-2G,所有自动aof非常频繁,主从复制打包rdb也非常频繁,之前配置已经无法满足要求报异常如下6943:M 19 Jul 20: ...
- Redis集群-主从模式
1.架构设计 集群在单台主机上模拟搭建6个节点(3主3从的集群): 2.配置 创建与端口相同的文件夹存储Redis配置文件和持久化文件. 目录如下: 每个节点配置文件如下: 节点1: bind 192 ...
- redis集群使用Java工具类(Java jedis集群工具类)
package com.xiaomi.weather.vote.webservices.util.redisCache; import com.google.common.base.Strings; ...
随机推荐
- MVC中Ajax post 和Ajax Get——提交对象
HTTP 请求:GET vs. POST两种在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST.GET - 从指定的资源请求数据POST - 向指定的资源提交要处理的数据GET 基本上 ...
- excel数据复制到html表格<textarea>中
方案一 多行文本框接收到复制的excel值后,在文本框的chage事件中,将excel内容分割到二维数组中,然后填充到html的表格的input或textarea中. 数据格式: 单元格复制后的数据格 ...
- C#按制定的环境编译替换不出对应的配置项的解决措施。
1. 比如选择的 编译或者发布 环境是 QA ,但是QA里面配置的 替换节点 实际并没有被替换 解决方案: 在项目文件.csproj中最底部加入一下代码,应该成功.成功将QA的配置节点 替换掉默认的 ...
- [z]Linux下压缩与解压
1.压缩命令: 命令格式:tar -zcvf 压缩文件名.tar.gz 被压缩文件名 可先切换到当前目录下.压缩文件名和被压缩文件名都可加入路径. 2.解压缩命令: 命令格式:tar -z ...
- Linux移植之移植步骤
在这里总结一下我在移植Linux2.6.22.6内核过程时的步骤.移植成功后最终能挂接做好的根文件系统,并且启动第一个init程序.移植的步骤如下: 1.将网上下载的内核源码文件linux-2.6.2 ...
- Android开发之自定义Toast(带详细注释)
因为工作需求,所以自己研究了自定义Toast,这里做出总结: 在此之前有一点需要提前说明:Toast与其他组件一样,都属于UI界面中的内容,因此在子线程中无法使用Toast弹出提示内容,如果强行在子线 ...
- python多线程下载网页图片并保存至特定目录
#!python3 #multidownloadXkcd.py - Download XKCD comics using multiple threads. import requests impor ...
- Scrapy的安装和基本使用方法
Scrapy的安装 1. Windows下安装流程: 方法一: 命令行执行pip install scrapy 安装scrapy 注意:如果有anaconda,也可以打开“Anaconda promp ...
- TensorFlow安装时错误CondaValueError: prefix already exists: G:\softs\Anaconda\envs\tensorflow
TensorFlow安装时,TensorFlow环境已经调好了,就是下面的第(3)步, 可我自己偏偏选了个Python3.7,因为检测到自己的Python最新版本为3.7,就手贱安了TensorFlo ...
- servlet 知识点 WebServlet("/")与WebServlet("/*")的区别
(1)一个servlet的请求路径,如果配置成"/",那么它可以拦截除了.jsp之外的所有的请求. (2)一个servlet的请求路径,如果配置成"/*",那么 ...