├── README.md ├── Redis_Cluster_tool └── documentation /README.md: -------------------------------------------------------------------------------- 1 | 说明: 2 | 由于之前版本存在bug,为此原来的程序已经删掉,在原来的版本上进行了修复,程序采用Perl编写,我把代码发出来供大家参考,也可自行修改。此版本已经在正式环境使用,也通过测试。但未必很多场景都能测试到,也希望各位有优化的建议或修复的bug可发我邮箱kevin6386@163.com,共同完善。 3 | 4 | 5 | +------------------------------------------------------------------------+ 6 | |Redis Cluster Tool for Redis Cluster | 7 | |version:V1.1 2016/09/12 支持Redis Cluster 密码 | 8 | |只是对Redis Cluster 原生命令进行封装和计算,没有其他改动,放心使用 | 9 | | 欢迎使用Redis Cluster Tool 工具 | 10 | +------------------------------------------------------------------------+ 11 | options : 12 | 'help', # 帮助 13 | 't', # 设置参数: 14 | ms:移动slot,reshard 重新分片, 15 | del:删除节点, 16 | add:添加节点, 17 | add_slave:添加slave, 18 | up:升级slave, 19 | create:创建集群,注意主从分别为不同物理机 20 | up:升级 21 | info:集群信息 22 | nodes:集群节点信息 23 | 'h', # 主机host:如 24 | -h 1.1.1.1:port , 25 | 多个主机时:-h '1.1.1.1:port,2.2.2.2:port'用','隔开 26 | 'p', # 端口 27 | 'n', # node 节点,如: -n 'id' 如果2个时,-n 'source-id,destion-id' 28 | 'r', #指定slot 范围,如:-r 0-16383 29 | 'b', #指定backup 地址:如 -b ip:port,-b 'ip:port,ip2:port2' 30 | Sample : 31 | 32 | redis_cluster_tool -t nodes -h host:port 33 | #查看集群节点信息 34 | redis_cluster_tool -t info -h host:port 35 | #查看集群信息 36 | redis_cluster_tool -t create -h 'host1:port1,host2:port2,host3:port3' -b 'backip1:port1,backip2:port2,backip3:port3' 37 | #创建集群,并自动根据不同物理ip配置主从关系,尽量根据对应关系来进行创建如:host1:port1 对应的备份关系为backip1:port1 38 | #并在创建完集群后自动进行根据master个数分片 39 | redis_cluster_tool -t reshard -h host:port 40 | #自动根据当前master 进行将16384 进行重新分片,注意在集群创建初化时进行,当线上重新分配,其中的slot会有短暂中断情况 41 | #可以先人工计算,然后将slot以迁移方式进行 42 | redis_cluster_tool -t ms -h host:port -n node_id -r 0-16383 43 | #对slot进行迁移,将0-16383范围内的host:prot 的slot迁移到 nodeid 为 -n指定的节点 44 | redis_cluster_tool -t del -h host:port -n node_id 45 | #在host:port 中删除删除节点id 46 | redis_cluster_tool -t add -h source_host:source_port,target_host:target_port 47 | # 添加节点到source_host:port 中 48 | redis_cluster_tool -t add_slave -h host:port -n node_id 49 | #添加slave节点:将node_id 节点添加到host中 50 | redis_cluster_toole -t up -h host:port 51 | #将host和port实例升级weimaster 52 | 53 | 使用 54 | 编辑程序redis_cluster_tool 55 | 56 | my $pass='redis';#设置密码 57 | -------------------------------------------------------------------------------- /Redis_Cluster_tool: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | #Redis Tool for Redis Cluster 3 | #kevin6386@163.com 2016/09/12 v.1.1 4 | #Support Passwrod for Redis Cluster 5 | use strict; 6 | use Getopt::Long; 7 | use Term::ANSIColor; 8 | my %opt; 9 | my $type; 10 | ### 11 | my $host; 12 | my $host_in; 13 | my $source_host; 14 | my $tar_host; 15 | my $port; 16 | my $tar_port; 17 | my $sou_port; 18 | my $start_slot; 19 | my $pass='redis';#设置密码 20 | my $node; 21 | my $source_node; 22 | my $range; 23 | my $end_slot; 24 | my $target_ip; 25 | my $source_id; 26 | my $sou_host; 27 | my $backip; 28 | my $backip_port; 29 | my $target_host; 30 | my $host_port; 31 | my $rn; 32 | my $set; 33 | my $redis_cli=`which redis-cli`; 34 | chomp($redis_cli); 35 | #设置参数 36 | sub get_options{ 37 | #Get options info 38 | GetOptions(\%opt, 39 | 'help', # 帮助 40 | 't=s', # 设置参数:ms 移动slot,reshard 重新分片,del 删除节点,add 添加节点,add_slave 添加slave,up 升级slave,create 创建集群,请不要在单台部署所有服务 41 | 'h=s', # 主机host:如 -h 1.1.1.1:port ,多个主机时-h '1.1.1.1:port,2.2.2.2:port'用','隔开 42 | 'p=s', # 端口 43 | 'n=s', # node 节点,如: -n 'id' 如果2个时,-n 'source-id,destion-id' 44 | 'r=s', #指定slot 范围,如:-r 0-16383 45 | 'b=s', #指定backup 地址:如 -b ip:port,-b 'ip:port,ip2:port2' 46 | ) or print_usage(); 47 | if (!scalar(%opt)) { 48 | &print_usage(); 49 | } 50 | if($opt{'help'}){ 51 | &print_usage(); 52 | }; 53 | if($opt{'t'} ){ 54 | $type=$opt{'t'}; 55 | } 56 | my $num; 57 | if($opt{'h'} ){ 58 | $host=$opt{'h'}; 59 | $host_in=$opt{'h'}; 60 | if($host =~/,/){ 61 | $host=~s/:/ -p /g; 62 | $num=split(/,/,$host); 63 | }else{ 64 | $num=1; 65 | $host=~s/:/ -p /g; 66 | #定义host 和端口 按照格式: -h host -p port 67 | $host_port="-h $host"; 68 | } 69 | } 70 | if($opt{'p'} ){ 71 | $port=$opt{'p'}; 72 | } 73 | if($opt{'n'} ){ 74 | $node=$opt{'n'}; 75 | } 76 | if($opt{'r'} ){ 77 | $range=$opt{'r'}; 78 | if( $range =~ /-/img){ 79 | #设置slot,总共为16384个,根据输入的slot进行计算,否则为默认0-16383 80 | my @slots=split(/-/,$range); 81 | $start_slot=defined($slots[0])?$slots[0]:0; 82 | $end_slot=defined($slots[1])?$slots[1]:16383; 83 | $rn=0; 84 | }else{ 85 | $range=$opt{'r'}; 86 | $rn=1; 87 | } 88 | 89 | } 90 | my $bnum; 91 | if($opt{'b'} ){ 92 | $backip=$opt{'b'}; 93 | $backip_port=$opt{'b'}; 94 | if($backip =~/,/){ 95 | $backip=~s/:/ /g; 96 | $backip_port=~s/:/ -p /g; 97 | $bnum=split(/,/,$backip); 98 | } 99 | if($backip_port =~/,/){ 100 | $backip_port=~s/:/ -p /g; 101 | } 102 | } 103 | if($type eq 'info' && $host ne ''){ 104 | if($num eq '1' ){ 105 | &cluster_info($host_port); 106 | } 107 | }elsif($type eq 'del' && $host ne '' && $node ne ''){ 108 | &del; 109 | }elsif($type eq 'add' && $host ne '' ){ 110 | &add; 111 | 112 | }elsif($type eq 'reshard' && $host ne '' ){ 113 | &redis_reshard(); 114 | }elsif($type eq 'add_slave' && $host ne '' && $node ne ''){ 115 | &add_slave; 116 | 117 | }elsif($type eq 'up' && $host ne ''){ 118 | &up_master; 119 | }elsif($type eq 'nodes' && $host ne ''){ 120 | if($num eq '1' ){ 121 | &cluster_node($host_port); 122 | } 123 | }elsif($type eq 'create' && $host ne '' && $backip ne ''){ 124 | #print $host,"$num $bnum\n"; 125 | #判断master的个数和slave个数 126 | if($bnum lt $num ){ 127 | print "主从个数不等,配置好主从,每个主必须配置大于一个从\n"; 128 | exit; 129 | }else{ 130 | my @source_ip=split(/,/,$host); 131 | my @back_ip=split(/,/,$backip); 132 | for(my $i=0;$i<$num;$i++){ 133 | my $create_cmd="-h $source_ip[0] cluster meet $back_ip[$i]"; 134 | my $create_slave_cmd="$source_ip[$i],$back_ip[$i]"; 135 | #创建集群 136 | &create_cluster($create_cmd); 137 | #创建主从 138 | &create_replicate($create_slave_cmd); 139 | } 140 | #为当前redis 集群分配16384个slot,因为数初始,所以给16384初始值 141 | my $ip_rang="$source_ip[0]|16384"; 142 | &redis_reshard($ip_rang); 143 | } 144 | }elsif($type eq 'ms' && $host ne '' && $node ne '' && $range ne ''){ 145 | &MIG_SLOT(); 146 | }else{ 147 | &print_usage(); 148 | } 149 | } 150 | &get_options; 151 | #迁移slot,注意必须是初始化或允许丢失数据的情况下进行操作 152 | #执行顺序如下 153 | #CLUSTER SETSLOT MIGRATING 154 | #CLUSTER SETSLOT IMPORTING 155 | #CLUSTER SETSLOT STABLE 156 | #CLUSTER SETSLOT NODE 157 | sub MIG_SLOT{ 158 | #计算目标节点的ip地址和端口 159 | my $source_ip_port=$host; 160 | $source_ip_port=~s/ -p /:/g; 161 | my $ip_con=`$redis_cli -a $pass -h $host cluster nodes`; 162 | chomp($ip_con); 163 | if($ip_con eq ''){ 164 | print "$host con is error $ip_con \n"; 165 | exit; 166 | } 167 | $target_ip=`$redis_cli -a $pass -h $host cluster nodes|sed -n '/^$node/'p|awk '{print \$2}'`; 168 | $source_node=`$redis_cli -a $pass -h $host cluster nodes|grep '$source_ip_port'|awk '{print \$1}'`; 169 | chomp($source_node); 170 | chomp($target_ip); 171 | $target_ip=~s/:/ -p /g; 172 | my $slot; 173 | chomp($start_slot); 174 | chomp($end_slot); 175 | if($rn eq 1 ){ 176 | $slot=$range; 177 | chomp($slot); 178 | &check_key($slot); 179 | my $sinfo=`$redis_cli -a $pass -c -h $target_ip CLUSTER SETSLOT $slot STABLE`; 180 | print "清除迁移slot状态 稳定槽位1\n"; 181 | chomp($sinfo); 182 | if($sinfo !~ /ERR/mig){ 183 | my $ninfo=`$redis_cli -a $pass -h $host CLUSTER SETSLOT $slot NODE $node`; 184 | my $ninfo2=`$redis_cli -a $pass -h $target_ip CLUSTER SETSLOT $slot NODE $node`; 185 | print "设定 slot $slot 通知各节点 状态:$ninfo $ninfo2 \n"; 186 | } 187 | }else{ 188 | while ($start_slot <= $end_slot ){ 189 | $slot=$start_slot; 190 | chomp($slot); 191 | &check_key($slot); 192 | my $sinfo=`$redis_cli -a $pass -c -h $target_ip CLUSTER SETSLOT $slot STABLE`; 193 | chomp($sinfo); 194 | print "清除迁移slot状态 稳定槽位w\n"; 195 | if($sinfo !~ /ERR/mig){ 196 | my $ninfo=`$redis_cli -a $pass -h $host CLUSTER SETSLOT $slot NODE $node`; 197 | my $ninfo2=`$redis_cli -a $pass -h $target_ip CLUSTER SETSLOT $slot NODE $node`; 198 | } 199 | $start_slot++; 200 | } 201 | } 202 | } 203 | #判断槽位是否有值 204 | sub check_key{ 205 | my $slot=$_[0]; 206 | my $get_key=`$redis_cli -a $pass -h $host CLUSTER COUNTKEYSINSLOT $slot|awk '{print \$1}'`; 207 | chomp($get_key); 208 | if($get_key eq 0 ){ 209 | my $minfo=`$redis_cli -a $pass -h $host CLUSTER SETSLOT $slot MIGRATING $node`; 210 | print "将 $host $range MIGRATING(迁移) 到节点$node 上 状态:$minfo\n"; 211 | chomp($minfo); 212 | if($minfo !~ /ERR/mig){ 213 | my $iinfo=`$redis_cli -a $pass -h $target_ip CLUSTER SETSLOT $slot IMPORTING $source_node`; 214 | print "将 slot $slot importing(导入) 到节点$target_ip 上 状态:$iinfo\n"; 215 | } 216 | }else{ 217 | print "$host slot:$slot 存在值,个数为:$get_key ,程序将进行数据迁移,请知悉!\n"; 218 | #IMPORTING 219 | my $iinfo=`$redis_cli -a $pass -h $target_ip CLUSTER SETSLOT $slot IMPORTING $source_node`; 220 | #MIGRATING 221 | my $minfo=`$redis_cli -a $pass -h $host CLUSTER SETSLOT $slot MIGRATING $node`; 222 | &move_keys($slot); 223 | 224 | } 225 | } 226 | #迁移数据 227 | #CLUSTER SETSLOT IMPORTING . 228 | #CLUSTER SETSLOT MIGRATING . 229 | #CLUSTER GETKEYSINSLOTcommand and move them into the destination node using theMIGRATE command. 230 | #CLUSTER SETSLOT NODE in the source or destination. 231 | #We want to move hash slot 8 from A to B, so we issue commands like this: 232 | #We send B: CLUSTER SETSLOT 8 IMPORTING A 233 | #We send A: CLUSTER SETSLOT 8 MIGRATING B 234 | sub move_keys{ 235 | my $slot=$_[0]; 236 | if($slot ne ''){ 237 | #计算个数 238 | my $t_ip=$target_ip; 239 | $t_ip=~s/ -p / /g; 240 | my $n=`$redis_cli -a $pass -h $host CLUSTER COUNTKEYSINSLOT $slot|awk '{print \$1}'`; 241 | chomp($n); 242 | my @key=`$redis_cli -a $pass -h $host CLUSTER GETKEYSINSLOT $slot $n`; 243 | #MIGRATE不支持密码,暂时可能不可用 244 | `$redis_cli -a $pass -h $host config set requirepass ''`; 245 | `$redis_cli -a $pass -h $target_ip config set requirepass ''`; 246 | foreach my $k (@key){ 247 | chomp($k); 248 | my $info=`$redis_cli -a $pass -h $host MIGRATE $t_ip $k 0 1000`; 249 | print "slot $slot 迁移$k 到 $t_ip 数据:$info\n"; 250 | } 251 | #set slot 252 | my $s=`$redis_cli -a $pass -h $host CLUSTER SETSLOT $slot NODE $node`; 253 | my $ss=`redis-cli -a $pass -h $target_ip CLUSTER SETSLOT $slot NODE $node`; 254 | chomp($s); 255 | chomp($ss); 256 | print "通知$host $target_ip status:$s $ss\n"; 257 | $set=1; 258 | } 259 | } 260 | sub cluster_info{ 261 | my $result=`$redis_cli $_[0] -a $pass cluster info`; 262 | print $result; 263 | } 264 | #打印集群节点信息 265 | sub cluster_node{ 266 | my $result=`$redis_cli $_[0] -a $pass cluster nodes`; 267 | print $result; 268 | 269 | } 270 | #创建集群 271 | sub create_cluster{ 272 | my $info= `$redis_cli -a $pass $_[0] `; 273 | print "$redis_cli -a $pass $_[0] \n"; 274 | print $info; 275 | } 276 | #创建slave同步 277 | sub create_replicate{ 278 | #获取源主机ip 和端口,和slave ip 279 | my @ips=split(/,/,$_[0]); 280 | my $source_host_port=$ips[0]; 281 | my $backip=$ips[1]; 282 | if($backip =~ /(\d+\.\d+\.\d+\.\d+)(\s+)(\d+)/mg){ 283 | #修改slaveip 和port 格式 284 | $backip="-h $1 -p $3"; 285 | } 286 | #获取srouceip的nodeid 为创建主从做准备 287 | $source_host_port=~s/ -p /:/g; 288 | my $source_id=`$redis_cli -a $pass -h $ips[0] cluster nodes|grep myself|awk '{print \$1}'`; 289 | chomp($source_id); 290 | #设置主从 291 | my $info=`$redis_cli -a $pass $backip CLUSTER REPLICATE $source_id`; 292 | print "$redis_cli -a $pass -h $ips[0] cluster nodes|grep myself|awk '{print \$1}'\n$redis_cli -a $pass $backip CLUSTER REPLICATE $source_id\n"; 293 | print "将 $backip 添加为 $source_host_port 从status is $info\n"; 294 | } 295 | #重新分片 296 | sub redis_reshard{ 297 | my $ip_con=`$redis_cli -a $pass -h $host cluster nodes`; 298 | chomp($ip_con); 299 | if($ip_con eq ''){ 300 | print "$host con is error $ip_con \n"; 301 | exit; 302 | } 303 | my $ip; 304 | my $slot; 305 | if($_[0] =~ /\|/mig){ 306 | my @ip_slots=split(/\|/,$_[0]); 307 | $host=$ip_slots[0]; 308 | $slot=$ip_slots[1]; 309 | my $master_num=`$redis_cli -a $pass -h $host cluster nodes|grep master|grep -v fail|wc -l`; 310 | my @nodes=`$redis_cli -h $host -a $pass cluster nodes|grep master|grep -v fail|awk '{print \$1}'`; 311 | chomp($master_num); 312 | my @master_ip=`$redis_cli -a $pass -h $host cluster nodes|grep master|grep -v fail|awk '{print \$2}'|sort`; 313 | my $n=int ($slot/$master_num); 314 | #设置分片数组,每个ip分配的槽位多少 315 | my $j; 316 | my $nar; 317 | my $ip_slot; 318 | my $m=0; 319 | for($j=1;$j<=$master_num;$j++){ 320 | $nar=($n*$j); 321 | my $start=($m*$n); 322 | #定义ip 和slot组成一个单元,供后续设置slot使用 323 | chomp($master_ip[$m]); 324 | $ip_slot.="$master_ip[$m]|$nar".','; 325 | $m++; 326 | print "$m ffff \n"; 327 | } 328 | chop($ip_slot); 329 | my $e=0; 330 | my $i=0; 331 | #设置分片如:redis-cli -h 172.16.40.15 -p 7000 -a vooleredis cluster addslots 0 1 2 3 332 | my @ip_slots=split(/,/,$ip_slot); 333 | #根据ip和分片进行格式化 334 | foreach my $key (@ip_slots){ 335 | my @s=split(/\|/,$key); 336 | my $slot=$s[1]; 337 | my $ip=$s[0]; 338 | chomp($slot); 339 | chomp($ip); 340 | my $i; 341 | my $slots; 342 | for($i=$e;$i<=$slot;$i++){ 343 | $slots.=$i.' '; 344 | $e++; 345 | } 346 | $ip=~s/:/ -p /g; 347 | my $info=`$redis_cli -a $pass -h $ip cluster addslots $slots`; 348 | print "$ip 设置分片 状态:$info\n"; 349 | } 350 | }else{ 351 | print "$host\n"; 352 | my $i=1; 353 | my $en=16384; 354 | my @nodes=`$redis_cli -h $host -a $pass cluster nodes|grep master|grep -v fail|awk '{print \$1}'`; 355 | my $num=@nodes; 356 | chomp($num); 357 | my $n=int ($en/$num); 358 | my $j=0; 359 | my $set; 360 | my $chost; 361 | my $cport; 362 | my $cnode; 363 | foreach my $node (@nodes){ 364 | chomp($node); 365 | $cnode=$node; 366 | my $set=$n*$i; 367 | my @hosts=`$redis_cli -h $host -a $pass cluster nodes |grep master|grep -v fail|awk '{print \$2}'`; 368 | while ($j < $set ){ 369 | foreach my $keys (@hosts){ 370 | my @hosts=split(/:/,$keys); 371 | my $host=$hosts[0]; 372 | my $port=$hosts[1]; 373 | chomp($host); 374 | chomp($port); 375 | $chost=$host; 376 | $cport=$port; 377 | my $info=`$redis_cli -h $host -p $port -a $pass CLUSTER SETSLOT $j NODE $node`; 378 | print "auto Resharding :$j $info \n"; 379 | } 380 | $j++; 381 | } 382 | $i++; 383 | } 384 | if($j <=16383 ){ 385 | my $cha=16383 - $j; 386 | while($cha < 16384){ 387 | my $info=`$redis_cli -h $chost -p $cport -a $pass CLUSTER SETSLOT $cha NODE $cnode`; 388 | print "auto Resharding :$cha $info \n"; 389 | $cha++; 390 | 391 | } 392 | } 393 | 394 | } 395 | } 396 | 397 | ########### 398 | sub add{ 399 | my @ips=split(/,/,$host); 400 | my $target_ip=$ips[1]; 401 | chomp($target_ip); 402 | $target_ip=~s/ -p / /g; 403 | my $host=$ips[0]; 404 | my $info= `$redis_cli -h $host -a $pass cluster meet $target_ip`; 405 | chomp($info); 406 | print "$redis_cli -h $host -a $pass cluster meet $target_ip 将$target_ip 添加$ips[0] 集群状态:$info\n"; 407 | } 408 | sub del{ 409 | my $info=`$redis_cli -h $host -a $pass CLUSTER FORGET $node`; 410 | print "$host 删除节点$node 状态:$info\n"; 411 | 412 | } 413 | sub add_slave{ 414 | my $info=`$redis_cli -h $host -a $pass cluster replicate $node`; 415 | chomp($info); 416 | print "将$host 设置为$node 的从 :$info \n"; 417 | } 418 | sub up_master{ 419 | my $m_id=`$redis_cli -h $host -a $pass cluster nodes|grep $host_in|awk '{print \$4}'`; 420 | chomp($m_id); 421 | my $m_ip=`$redis_cli -h $host -a $pass cluster nodes|grep '^$m_id'|awk '{print \$2}'`; 422 | chomp($m_ip); 423 | my $info = `$redis_cli -h $host -a $pass CLUSTER FAILOVER `; 424 | chomp($info); 425 | print "将$host 提升为master $info ,原Master 为$m_ip \n"; 426 | } 427 | sub print_usage{ 428 | print color 'bold blue'; print <>/tmp/aa.txt 111 | redis-cli -c -h $ip -p $port -a redis get $i 112 | done 113 | done 114 | 115 | 使用方法 : 116 | ./get_key.sh 172.16.40.15 7001 5480 #被迁移的ip 端口 和范围内的槽位 117 | 迁移数据5462-10922 118 | 119 | ./redis_cluster_tool -t ms -h 172.16.40.15:7001 -n b358c4db550640cd9ecc9861115cb2f5d0504bd5 -r 5462-10922 120 | #b358c4db550640cd9ecc9861115cb2f5d0504bd5 将槽位迁移目标节点 121 | 显示如下图: 122 | 123 | 当存在数据时会将数据进行迁移,否则直接迁移槽位即可 124 | 125 | 重新分片: 126 | [root@localhost ~]# ./redis_cluster_tool -t reshard -h 172.16.40.15:7000 127 | 涉及迁移数据,为保证数据安全性,暂时利用数据迁移功能进行迁移。根据master 计算得知各个节点的槽位如下: 128 | 172.16.40.15:7000 分得槽位范围: 0 5461 129 | 172.16.40.15:7001 分得槽位范围: 5462 10922 130 | 172.16.40.15:7002 分得槽位范围: 10923 16383 131 | 请使用 ./redis_cluster_tool -t ms -h host:port -n nodeid -r range 进行分配 132 | 删除节点: 133 | 查看集群: 134 | 135 | [root@localhost ~]# ./redis_cluster_tool -t nodes -h 172.16.40.15:7000 136 | 4dbf2af3a77f2ff54b520558ee451fc968906507 172.16.40.15:7001 master - 0 1474371620296 3 connected 6001-10922 137 | b2ca7e0345a84c3f299cc5a09c2b9985424c3bcc 172.16.40.15:7005 slave 687e32407e37c0ef4343378636d31e957bfb9846 0 1474371622299 2 connected 138 | 875a541193288f9a5a9e469491ed32b0697ea376 172.16.40.15:7000 myself,master - 0 0 4 connected 0-6000 139 | 687e32407e37c0ef4343378636d31e957bfb9846 172.16.40.15:7002 master - 0 1474371621298 2 connected 10923-16383 140 | 2160454279ced52d0b7d208113d0190986298042 172.16.40.15:7003 slave 875a541193288f9a5a9e469491ed32b0697ea376 0 1474371620797 4 connected 141 | 0221d794c0669de759c43e7e57ec401f3832b957 172.16.40.15:7004 slave 4dbf2af3a77f2ff54b520558ee451fc968906507 0 1474371620296 3 connected 142 | [root@localhost ~]# 143 | 删掉节点 144 | 145 | [root@localhost ~]# ./redis_cluster_tool -t del -h 172.16.40.15:7000 -n 687e32407e37c0ef4343378636d31e957bfb9846 146 | 172.16.40.15 -p 7000 删除节点687e32407e37c0ef4343378636d31e957bfb9846 状态:OK 147 | 查看集群 148 | 149 | 此时7002 不存在但是槽位10923-16383 已经不存在,线上禁止直接删除master 150 | [root@localhost ~]# ./redis_cluster_tool -t nodes -h 172.16.40.15:7000 151 | 4dbf2af3a77f2ff54b520558ee451fc968906507 172.16.40.15:7001 master - 0 1474371715930 3 connected 6001-10922 152 | b2ca7e0345a84c3f299cc5a09c2b9985424c3bcc 172.16.40.15:7005 slave - 0 1474371714428 2 connected 153 | 875a541193288f9a5a9e469491ed32b0697ea376 172.16.40.15:7000 myself,master - 0 0 4 connected 0-6000 154 | 2160454279ced52d0b7d208113d0190986298042 172.16.40.15:7003 slave 875a541193288f9a5a9e469491ed32b0697ea376 0 1474371714928 4 connected 155 | 0221d794c0669de759c43e7e57ec401f3832b957 172.16.40.15:7004 slave 4dbf2af3a77f2ff54b520558ee451fc968906507 0 1474371716429 3 connected 156 | 添加节点: 157 | 添加 158 | 159 | [root@localhost ~]# ./redis_cluster_tool -t add -h 172.16.40.15:7002,172.16.40.15:7000 160 | 将172.16.40.15 7000 添加172.16.40.15 -p 7002 集群状态:OK 161 | [root@localhost ~]# 162 | 查看集群: 163 | 164 | [root@localhost ~]# ./redis_cluster_tool -t nodes -h 172.16.40.15:7000 165 | 4dbf2af3a77f2ff54b520558ee451fc968906507 172.16.40.15:7001 master - 0 1474371908170 3 connected 6001-10922 166 | b2ca7e0345a84c3f299cc5a09c2b9985424c3bcc 172.16.40.15:7005 slave 687e32407e37c0ef4343378636d31e957bfb9846 0 1474371907670 2 connected 167 | 875a541193288f9a5a9e469491ed32b0697ea376 172.16.40.15:7000 myself,master - 0 0 4 connected 0-6000 168 | 687e32407e37c0ef4343378636d31e957bfb9846 172.16.40.15:7002 master - 0 1474371907170 2 connected 10923-16383 169 | 2160454279ced52d0b7d208113d0190986298042 172.16.40.15:7003 slave 875a541193288f9a5a9e469491ed32b0697ea376 0 1474371906669 4 connected 170 | 0221d794c0669de759c43e7e57ec401f3832b957 172.16.40.15:7004 slave 4dbf2af3a77f2ff54b520558ee451fc968906507 0 1474371906669 3 connected 171 | 添加新节点 172 | 173 | redis-server redis_7006.conf & 174 | 175 | [root@localhost ~]# ./redis_cluster_tool -t add -h 172.16.40.15:7006,172.16.40.15:7000 176 | 将172.16.40.15 7000 添加172.16.40.15 -p 7006 集群状态:OK 177 | 178 | 查看集群: 179 | 180 | [root@localhost 7006]# /usr/local/bin/redis-cli -h 172.16.40.15 -p 7000 -a redis cluster nodes 181 | 4dbf2af3a77f2ff54b520558ee451fc968906507 172.16.40.15:7001 master - 0 1474373250315 3 connected 6001-10922 182 | 687e32407e37c0ef4343378636d31e957bfb9846 172.16.40.15:7002 master - 0 1474373249314 2 connected 10923-16383 183 | 0221d794c0669de759c43e7e57ec401f3832b957 172.16.40.15:7004 slave 4dbf2af3a77f2ff54b520558ee451fc968906507 0 1474373249815 3 connected 184 | 3d6ebc11386689f2b4d3c116872bfa271affce1c 172.16.40.15:7006 master - 0 1474373248813 0 connected 185 | b2ca7e0345a84c3f299cc5a09c2b9985424c3bcc 172.16.40.15:7005 slave 687e32407e37c0ef4343378636d31e957bfb9846 0 1474373248813 2 connected 186 | 875a541193288f9a5a9e469491ed32b0697ea376 172.16.40.15:7000 myself,master - 0 0 4 connected 0-6000 187 | 2160454279ced52d0b7d208113d0190986298042 172.16.40.15:7003 slave 875a541193288f9a5a9e469491ed32b0697ea376 0 1474373250815 4 connected 188 | [root@localhost 7006]# 189 | 为新节点3d6ebc11386689f2b4d3c116872bfa271affce1c分配槽位: 190 | 191 | [root@localhost ~]# ./redis_cluster_tool -t ms -h 172.16.40.15:7000 -n 3d6ebc11386689f2b4d3c116872bfa271affce1c -r 0-500 192 | #从172.16.40.15:7000 上分配 -r 0-500 给新加的节点 -n 3d6ebc11386689f2b4d3c116872bfa271affce1c 193 | 查看集群 194 | 195 | [root@localhost 7006]# /usr/local/bin/redis-cli -h 172.16.40.15 -p 7000 -a redis cluster nodes 196 | 4dbf2af3a77f2ff54b520558ee451fc968906507 172.16.40.15:7001 master - 0 1474373478069 3 connected 6001-10922 197 | 687e32407e37c0ef4343378636d31e957bfb9846 172.16.40.15:7002 master - 0 1474373478970 2 connected 10923-16383 198 | 0221d794c0669de759c43e7e57ec401f3832b957 172.16.40.15:7004 slave 4dbf2af3a77f2ff54b520558ee451fc968906507 0 1474373479071 3 connected 199 | 3d6ebc11386689f2b4d3c116872bfa271affce1c 172.16.40.15:7006 master - 0 1474373477268 5 connected 0-500 200 | b2ca7e0345a84c3f299cc5a09c2b9985424c3bcc 172.16.40.15:7005 slave 687e32407e37c0ef4343378636d31e957bfb9846 0 1474373479171 2 connected 201 | 875a541193288f9a5a9e469491ed32b0697ea376 172.16.40.15:7000 myself,master - 0 0 4 connected 501-6000 202 | 2160454279ced52d0b7d208113d0190986298042 172.16.40.15:7003 slave 875a541193288f9a5a9e469491ed32b0697ea376 0 1474373478570 4 connected 203 | [root@localhost 7006]# 204 | #0-500 过去了说明正常 205 | 添加从节点 206 | 查看集群 207 | 208 | [root@localhost ~]# ./redis_cluster_tool -t nodes -h 172.16.40.15:7000 209 | 4dbf2af3a77f2ff54b520558ee451fc968906507 172.16.40.15:7001 master - 0 1474375187528 3 connected 6001-10922 210 | 687e32407e37c0ef4343378636d31e957bfb9846 172.16.40.15:7002 master - 0 1474375187528 2 connected 10923-16383 211 | 0221d794c0669de759c43e7e57ec401f3832b957 172.16.40.15:7004 slave 4dbf2af3a77f2ff54b520558ee451fc968906507 0 1474375189030 3 connected 212 | 3d6ebc11386689f2b4d3c116872bfa271affce1c 172.16.40.15:7006 master - 0 1474375188028 5 connected 0-720 213 | b2ca7e0345a84c3f299cc5a09c2b9985424c3bcc 172.16.40.15:7005 slave 687e32407e37c0ef4343378636d31e957bfb9846 0 1474375189030 2 connected 214 | 875a541193288f9a5a9e469491ed32b0697ea376 172.16.40.15:7000 myself,master - 0 0 4 connected 721-6000 215 | 2160454279ced52d0b7d208113d0190986298042 172.16.40.15:7003 slave 875a541193288f9a5a9e469491ed32b0697ea376 0 1474375187027 4 connected 216 | [root@localhost ~]# 217 | 将7003 节点添加为7006 的从 218 | 219 | [root@localhost ~]# ./redis_cluster_tool -t add_slave -h 172.16.40.15:7003 -n 3d6ebc11386689f2b4d3c116872bfa271affce1c 220 | 将172.16.40.15 -p 7003 设置为3d6ebc11386689f2b4d3c116872bfa271affce1c 的从 :OK 221 | [root@localhost ~]# 222 | 查看集群: 223 | [root@localhost ~]# ./redis_cluster_tool -t nodes -h 172.16.40.15:7000 224 | 4dbf2af3a77f2ff54b520558ee451fc968906507 172.16.40.15:7001 master - 0 1474375632056 3 connected 6001-10922 225 | 687e32407e37c0ef4343378636d31e957bfb9846 172.16.40.15:7002 master - 0 1474375630054 2 connected 10923-16383 226 | 0221d794c0669de759c43e7e57ec401f3832b957 172.16.40.15:7004 slave 4dbf2af3a77f2ff54b520558ee451fc968906507 0 1474375631556 3 connected 227 | 3d6ebc11386689f2b4d3c116872bfa271affce1c 172.16.40.15:7006 master - 0 1474375630555 5 connected 0-720 228 | b2ca7e0345a84c3f299cc5a09c2b9985424c3bcc 172.16.40.15:7005 slave 687e32407e37c0ef4343378636d31e957bfb9846 0 1474375631055 2 connected 229 | 875a541193288f9a5a9e469491ed32b0697ea376 172.16.40.15:7000 myself,master - 0 0 4 connected 721-6000 230 | 2160454279ced52d0b7d208113d0190986298042 172.16.40.15:7003 slave 3d6ebc11386689f2b4d3c116872bfa271affce1c 0 1474375631055 5 connected 231 | [root@localhost ~]# 232 | 升级slave为master 233 | 将7002 升级为7005的master 234 | 查看集群 235 | 236 | [root@localhost ~]# ./redis_cluster_tool -t nodes -h 172.16.40.15:7000 237 | 4dbf2af3a77f2ff54b520558ee451fc968906507 172.16.40.15:7001 master - 0 1474376007020 8 connected 6001-10922 238 | 687e32407e37c0ef4343378636d31e957bfb9846 172.16.40.15:7002 slave b2ca7e0345a84c3f299cc5a09c2b9985424c3bcc 0 1474376006019 7 connected 239 | 0221d794c0669de759c43e7e57ec401f3832b957 172.16.40.15:7004 slave 4dbf2af3a77f2ff54b520558ee451fc968906507 0 1474376005518 8 connected 240 | 3d6ebc11386689f2b4d3c116872bfa271affce1c 172.16.40.15:7006 master - 0 1474376006019 5 connected 0-720 241 | b2ca7e0345a84c3f299cc5a09c2b9985424c3bcc 172.16.40.15:7005 master - 0 1474376005518 7 connected 10923-16383 242 | 875a541193288f9a5a9e469491ed32b0697ea376 172.16.40.15:7000 myself,master - 0 0 4 connected 721-6000 243 | 2160454279ced52d0b7d208113d0190986298042 172.16.40.15:7003 slave 3d6ebc11386689f2b4d3c116872bfa271affce1c 0 1474376006519 5 connected 244 | [root@localhost ~]# 245 | 升级为master 246 | 247 | [root@localhost ~]# ./redis_cluster_tool -t up -h 172.16.40.15:7002 248 | /usr/local/bin/redis-cli -h 172.16.40.15 -p 7002 -a redis CLUSTER FAILOVER 249 | 将172.16.40.15 -p 7002 提升为master OK ,原Master 为172.16.40.15:7005 250 | [root@localhost ~]# 251 | 查看集群: 252 | 253 | [root@localhost ~]# ./redis_cluster_tool -t nodes -h 172.16.40.15:7000 254 | 4dbf2af3a77f2ff54b520558ee451fc968906507 172.16.40.15:7001 master - 0 1474376029548 8 connected 6001-10922 255 | 687e32407e37c0ef4343378636d31e957bfb9846 172.16.40.15:7002 master - 0 1474376030049 9 connected 10923-16383 256 | 0221d794c0669de759c43e7e57ec401f3832b957 172.16.40.15:7004 slave 4dbf2af3a77f2ff54b520558ee451fc968906507 0 1474376029048 8 connected 257 | 3d6ebc11386689f2b4d3c116872bfa271affce1c 172.16.40.15:7006 master - 0 1474376030550 5 connected 0-720 258 | b2ca7e0345a84c3f299cc5a09c2b9985424c3bcc 172.16.40.15:7005 slave 687e32407e37c0ef4343378636d31e957bfb9846 0 1474376029548 9 connected 259 | 875a541193288f9a5a9e469491ed32b0697ea376 172.16.40.15:7000 myself,master - 0 0 4 connected 721-6000 260 | 2160454279ced52d0b7d208113d0190986298042 172.16.40.15:7003 slave 3d6ebc11386689f2b4d3c116872bfa271affce1c 0 1474376030550 5 connected 261 | [root@localhost ~]# 262 | 263 | 插入脚本: 264 | [root@localhost soft]# cat in.sh 265 | #!/bin/bash 266 | number=20000000 267 | let i=1 268 | while [ $i -le $number ];do 269 | redis-cli -h 172.16.40.15 -c -p 7000 -a redis set $i test$i >>/tmp/in.sh 270 | ((i++)) 271 | done 272 | 检测key脚本 273 | [root@localhost ~]# cat check_key.pl 274 | #!/usr/bin/perl 275 | ##Redis Tool for Redis Cluster 276 | ##kevin6386@163.com 2016/09/12 v.1.1 277 | ##Support Passwrod for Redis Cluster 278 | use strict; 279 | my $pass='redis'; 280 | my $host='172.16.40.15 -p 7001 '; 281 | my $en=2000; 282 | my $i=0; 283 | while(1){ 284 | while ($i < $en ){ 285 | my $slot=$i; 286 | my $n=`redis-cli -a $pass -c -h $host CLUSTER COUNTKEYSINSLOT $slot|awk '{print \$1}'`; 287 | chomp($n); 288 | my @key=`redis-cli -a $pass -c -h $host CLUSTER GETKEYSINSLOT $slot $n`; 289 | foreach my $k (@key){ 290 | chomp($k); 291 | my $re=`redis-cli -c -h $host -a redis get $k`; 292 | print "slot $slot key:$k 数据:$re \n"; 293 | } 294 | $i++; 295 | } 296 | } 297 | 298 | --------------------------------------------------------------------------------