redis搭建高可用群集、扩容、收缩

文章目录

redis是什么

1.redis是非关系型数据库。
Redis重要特性 :速度快,c语言写的,代码优雅,单线程架构
2.redis应用场景:
(1)缓存-键过期时间
把session会话存在redis,过期删除
缓存用户信息,缓存Mysql部分数据,用户先访问redis,redis没有再访问mysql,然后回写给redis
商城优惠卷过期时间
(2)排行榜-列表&有序集合
热度/点击数排行榜
直播间礼物积分排行
(3)计数器-天然支持计数器
帖子浏览数
视频播放数
评论数
点赞/踩
(4)社交网络-集合
粉丝
共同好友
兴趣爱好
标签
(5)消息队列-发布订阅
配合ELK缓存收集来的日志

redis群集

1.redis集群:当遇到单机、内存、并发、流量等瓶颈时,可以采用Cluster架构方案达到负载均衡目的。
Redis Cluster之前的分布式方案有两种:
1)客户端分区方案: 优点分区逻辑可控,缺点是需要自己处理数据路由,高可用和故障转移等。
2)代理方案: 优点是简化客户端分布式逻辑和升级维护便利,缺点加重架构部署和性能消耗。
官方提供的 Redis Cluster集群方案,很好的解决了集群方面的问题
2.数据分布
分布式数据库首先要解决把整个数据库集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,
每个节点负责整体数据的一个子集,需要关注的是数据分片规则,Redis Cluster采用哈希分片规则。

搭建群集

三台centos7服务器:每台两个节点因为公司环境最少三个master三个slave
redis1:192.168.43.10
redis2:192.168.43.100
reids3:192.168.43.191

1.首先创建安装目录

[root@redis1 ~]# mkdir -p /opt/redis_cluster/redis_{6380,6381}/{conf,logs,pid}
[root@redis1 ~]# mkdir -p /data/redis_cluster/redis_{6380,6381}
[root@redis1 ~]# 

2.将redis的包解压到redis_cluster中

[root@redis1 src]# tar xf redis-5.0.7.tar.gz -C /opt/redis_cluster/
[root@redis1 src]# cd /opt/redis_cluster/
[root@redis1 redis_cluster]# ls
redis-5.0.7  redis_6380  redis_6381
[root@redis1 redis_cluster]# 

3.将解压后的目录做个链接然后进入编译安装

[root@redis1 redis_cluster]# ln -s /opt/redis_cluster/redis-5.0.7 /opt/redis_cluster/redis
[root@redis1 redis_cluster]# cd /opt/redis_cluster/redis
[root@redis1 redis]# make && make install
.....................................
...................................
cd src && make install
make[1]: 进入目录“/opt/redis_cluster/redis-5.0.7/src”
    CC Makefile.dep
make[1]: 离开目录“/opt/redis_cluster/redis-5.0.7/src”
make[1]: 进入目录“/opt/redis_cluster/redis-5.0.7/src”

Hint: It's a good idea to run 'make test' ;)

    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
make[1]: 离开目录“/opt/redis_cluster/redis-5.0.7/src”

4.然后修改配置文件,注意ip地址(此处用的是一个脚本)

#!/bin/bash
cat >/opt/redis_cluster/redis_6380/conf/redis_6380.conf<<EOF
bind 192.168.43.10                    #本机ip地址
port 6380										#端口号
daemonize yes
pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log"
dbfilename "redis_6380.rdb"
dir "/data/redis_cluster/redis_6380/"
cluster-enabled yes
cluster-config-file nodes_6380.conf
cluster-node-timeout 15000
EOF
cd /opt/redis_cluster/
cp redis_6380/conf/redis_6380.conf redis_6381/conf/redis_6381.conf
sed -i 's#6380#6381#g' redis_6381/conf/redis_6381.conf 
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf

执行一下,并查看配置文件有没有错误

[root@redis1 redis]# vim redis.sh
[root@redis1 redis]# bash redis.sh 
[root@redis1 redis]# cat /opt/redis_cluster/redis_6380/conf/redis_6380.conf 
bind 192.168.43.10                    #
port 6380
daemonize yes
pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log"
dbfilename "redis_6380.rdb"
dir "/data/redis_cluster/redis_6380/"
cluster-enabled yes
cluster-config-file nodes_6380.conf
cluster-node-timeout 15000
[root@redis1 redis]# 

查看端口

[root@redis1 redis]# netstat -anput |grep redis
tcp        0      0 192.168.43.10:6380      0.0.0.0:*               LISTEN      18495/redis-server  
tcp        0      0 192.168.43.10:6381      0.0.0.0:*               LISTEN      18497/redis-server  
tcp        0      0 192.168.43.10:16380     0.0.0.0:*               LISTEN      18495/redis-server  
tcp        0      0 192.168.43.10:16381     0.0.0.0:*               LISTEN      18497/redis-server  
[root@redis1 redis]# 

5.复制redis1的软件目录到redis2,redis3中去

[root@redis1 redis]# scp -rp /opt/redis_cluster/ root@192.168.43.100:/opt
[root@redis1 redis]# scp -rp /opt/redis_cluster/ root@192.168.43.191:/opt

6.到Redis2上安装redis

[root@redis2 ~]# cd /opt/redis_cluster/redis
[root@redis2 redis]# make install
cd src && make install
make[1]: 进入目录“/opt/redis_cluster/redis/src”

Hint: It's a good idea to run 'make test' ;)

    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
make[1]: 离开目录“/opt/redis_cluster/redis/src”
[root@redis2 redis]# 

执行脚本修改主配置文件中的ip地址,并启动服务

#!/bin/bash
find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "s#10#100#g"
mkdir -p /data/redis_cluster/redis_{6380,6381}
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
[root@redis2 redis]# vim redis.sh
[root@redis2 redis]# bash redis.sh 
[root@redis2 redis]# netstat -anput |grep redis
tcp        0      0 192.168.43.100:6380     0.0.0.0:*               LISTEN      19462/redis-server  
tcp        0      0 192.168.43.100:6381     0.0.0.0:*               LISTEN      19464/redis-server  
tcp        0      0 192.168.43.100:16380    0.0.0.0:*               LISTEN      19462/redis-server  
tcp        0      0 192.168.43.100:16381    0.0.0.0:*               LISTEN      19464/redis-server  
[root@redis2 redis]# 

7.redis3中也是这样,要注意ip地址修改

[root@redis3 ~]# cd /opt/redis_cluster/redis
[root@redis3 redis]# make install
cd src && make install
make[1]: 进入目录“/opt/redis_cluster/redis/src”

Hint: It's a good idea to run 'make test' ;)

    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
make[1]: 离开目录“/opt/redis_cluster/redis/src”
[root@redis3 redis]# 

执行脚本修改主配置文件中的ip地址,并启动服务

#!/bin/bash
find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "s#10#191#g"
mkdir -p /data/redis_cluster/redis_{6380,6381}
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
[root@redis3 redis]# vim redis.sh
[root@redis3 redis]# bash redis.sh 
[root@redis3 redis]# netstat -anput |grep redis
tcp        0      0 192.168.43.191:6380     0.0.0.0:*               LISTEN      19462/redis-server  
tcp        0      0 192.168.43.191:6381     0.0.0.0:*               LISTEN      19464/redis-server  
tcp        0      0 192.168.43.191:16380    0.0.0.0:*               LISTEN      19462/redis-server  
tcp        0      0 192.168.43.191:16381    0.0.0.0:*               LISTEN      19464/redis-server  
[root@redis3 redis]# 

8.手动配置节点发现
当把所有节点都启动后查看进程会有cluster的字样,但是登录后执行CLUSTER NODES命令会发现只有每个节点自己的ID,目前集群内的节点,还没有互相发现,所以搭建redis集群我们第一步要做的就是让集群内的节点互相发现.
在执行节点发现命令之前我们先查看一下集群的数据目录会发现有生成集群的配置文件
查看后发现只有自己的节点内容,等节点全部发现后会把所发现的节点ID写入这个文件
集群模式的Redis除了原有的配置文件之外又加了一份集群配置文件.当集群内节点
信息发生变化,如添加节点,节点下线,故障转移等.节点会自动保存集群状态到配置文件.
需要注意的是,Redis自动维护集群配置文件,不需要手动修改,防止节点重启时产生错乱.
节点发现使用命令: CLUSTER MEET {IP} {PORT}
提示:在集群内任意一台机器执行此命令就可以

[root@redis1 opt]# redis-cli -h 192.168.43.10 -p 6380
192.168.43.10:6380> CLUSTER NODES
faad8f255b87ec4aecacae4428043b5487e7ecc6 :6380@16380 myself,master - 0 0 0 connected
192.168.43.10:6380> CLUSTER MEET 192.168.43.10 6381
OK
192.168.43.10:6380> CLUSTER MEET 192.168.43.100 6381
OK
192.168.43.10:6380> CLUSTER MEET 192.168.43.100 6380
OK
192.168.43.10:6380> CLUSTER MEET 192.168.43.191 6380
OK
192.168.43.10:6380> CLUSTER MEET 192.168.43.191 6381
OK
192.168.43.10:6380> CLUSTER NODES
7420c64e1e42d18cc9f61ee5ffdbd65338985529 192.168.43.191:6381@16381 master - 0 1615359256000 4 connected
e85ba321afac0fd2ebf31690586808deccf9ead5 192.168.43.100:6381@16381 master - 0 1615359257000 2 connected
90aa2ba54b757a14c01af5cc77f2c7daf631fedb 192.168.43.100:6380@16380 master - 0 1615359258158 3 connected
0fd1400bfd48dba7180c12112015b90eedf13320 192.168.43.191:6380@16380 master - 0 1615359258000 4 connected
cd579926ef0b48a1456bc29134ac078702a7c7e4 192.168.43.10:6381@16381 master - 0 1615359259176 1 connected
faad8f255b87ec4aecacae4428043b5487e7ecc6 192.168.43.10:6380@16380 myself,master - 0 1615359259000 0 connected
192.168.43.10:6380> 

可以看到发现了群集中的其他节点
9.Redis Cluster手动分配槽位
虽然节点之间已经互相发现了,但是此时集群还是不可用的状态,因为并没有给节点分配槽位,而且必须是所有的槽位都分配完毕后整个集群才是可用的状态.
反之,也就是说只要有一个槽位没有分配,那么整个集群就是不可用的.
可以测试创建一个键

192.168.43.10:6380> set k1 1
(error) CLUSTERDOWN Hash slot not served
192.168.43.10:6380> 

看到会报错,然后我们查看一下群集状态

192.168.1.102:6380> CLUSTER INFO
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:4
cluster_stats_messages_sent:1200
cluster_stats_messages_received:1200
192.168.1.102:6380>

失败的fail

前面说了,我们虽然有6个节点,但是真正负责数据写入的只有3个节点,其他3个节点只是作为主节点的从节点,也就是说,只需要分配期中三个节点的槽位就可以了
分配槽位的方法:
分配槽位需要在每个主节点上来配置,此时有2种方法执行:
分别登录到每个主节点的客户端来执行命令
在其中一台机器上用redis客户端远程登录到其他机器的主节点上执行命令

[root@redis1 ~]# redis-cli -h 192.168.43.10 -p 6380 cluster addslots {0..5461}
OK
[root@redis1 ~]# redis-cli -h 192.168.43.100 -p 6380 cluster addslots {5462..10922}
OK
[root@redis1 ~]# redis-cli -h 192.168.43.191 -p 6380 cluster addslots {10923..16383}
OK
[root@redis1 ~]# 

由于一共16383个槽所平均分给三个redis
分配完所有槽位之后我们再查看一下集群的节点状态和集群状态

192.168.43.10:6380> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:0
cluster_stats_messages_ping_sent:467
cluster_stats_messages_pong_sent:530
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:1002
cluster_stats_messages_ping_received:530
cluster_stats_messages_pong_received:472
cluster_stats_messages_received:1002
192.168.43.10:6380> 

可以看到三个节点都分配了槽位,而且集群的状态是OK的

10.手动配置集群高可用
虽然这时候集群是可用的了,但是整个集群只要有一台机器坏掉了,那么整个集群都是不可用的.
所以这时候需要用到其他三个节点分别作为现在三个主节点的从节点,以应对集群主节点故障时可以进行自动切换以保证集群持续可用.
注意:
(1).不要让复制节点复制本机器的主节点, 因为如果那样的话机器挂了集群还是不可用状态, 所以复制节点要复制其他服务器的主节点.
(2).使用redis-trid工具自动分配的时候会出现复制节点和主节点在同一台机器上的情况,需要注意
测试集群
这一次我们采用在一台机器上使用redis客户端远程操作集群其他节点
注意:
(1).需要执行命令的是每个服务器的从节点
(2).注意主从的ID不要搞混了.

192.168.43.10:6380> CLUSTER NODES
7420c64e1e42d18cc9f61ee5ffdbd65338985529 192.168.43.191:6381@16381 master - 0 1615359866000 4 connected
e85ba321afac0fd2ebf31690586808deccf9ead5 192.168.43.100:6381@16381 master - 0 1615359869551 2 connected
90aa2ba54b757a14c01af5cc77f2c7daf631fedb 192.168.43.100:6380@16380 master - 0 1615359868533 3 connected 5462-10922
0fd1400bfd48dba7180c12112015b90eedf13320 192.168.43.191:6380@16380 master - 0 1615359866488 5 connected 10923-16383
cd579926ef0b48a1456bc29134ac078702a7c7e4 192.168.43.10:6381@16381 master - 0 1615359867515 1 connected
faad8f255b87ec4aecacae4428043b5487e7ecc6 192.168.43.10:6380@16380 myself,master - 0 1615359868000 0 connected 0-5461

先查看自己群集的id号
然后进行添加
简单点理解主要结构就是这个样的:第一台的master对应第二台的slave,第二台的master对应第三台的slave,第三台的master对应第一台的slave
redis搭建高可用群集、扩容、收缩
但是这里的命令是颠倒过来的前面的ip地址是slave的后面的id号是master的
如果输错了,可以覆盖掉

[root@redis1 ~]# redis-cli -h 192.168.43.100 -p 6381 CLUSTER REPLICATE  faad8f255b87ec4aecacae4428043b5487e7ecc6
OK
[root@redis1 ~]# redis-cli -h 192.168.43.191 -p 6381 CLUSTER REPLICATE  90aa2ba54b757a14c01af5cc77f2c7daf631fedb
OK
[root@redis1 ~]# redis-cli -h 192.168.43.10 -p 6381 CLUSTER REPLICATE               0fd1400bfd48dba7180c12112015b90eedf13320
OK
[root@redis1 ~]# 

11.Redis Cluster测试集群
我们使用常规插入redis数据的方式往集群里写入数据看看会发生什么

[root@redis1 ~]# redis-cli -h 192.168.43.10 -p 6380 set k1 v1
(eror)MOVED 12706 192.168.43.191:6380
[root@redis1 ~]# 

结果提示error, 但是给出了集群另一个节点的地址
那么这条数据到底有没有写入呢? 我们登录这两个节点分别查看

[root@redis1 ~]# redis-cli -h 192.168.43.191 -p 6380 get k1    
(nil)

结果没有,这是因为使用集群后由于数据被分片了,所以并不是说在那台机器上写入数据就会在哪台机器的节点上写入,
集群的数据写入和读取就涉及到了另外一个概念,ASK路由
Redis Cluster ASK路由介绍
在集群模式下,Redis接受任何键相关命令时首先会计算键对应的槽,再根据槽找出所对应的节点
如果节点是自身,则处理键命令;
否则回复MOVED重定向错误,通知客户端请求正确的节点,这个过程称为Mover重定向.
知道了ask路由后,我们使用-c选项批量插入一些数据
测试一下

[root@redis1 ~]# redis-cli -c -h 192.168.43.10 -p 6380 set k1 v1
OK
[root@redis1 ~]# redis-cli -c -h 192.168.43.10 -p 6380 get k1
"v1"
[root@redis1 ~]# 

发现有了

知道了ask路由后,我们使用-c选项批量插入一些数据

[root@redis1 ~]# cat input_key.sh 
#!/bin/bash
for i in $(seq 1 1000)
do
    redis-cli -c -h 192.168.43.10 -p 6380 set k_${i} v_${i} && echo "set k_${i} is ok"
done

写入后我们同样使用-c选项来读取刚才插入的键值,然后查看下redis会不会帮我们路由到正确的节点上

[root@redis1 ~]# redis-cli -c -h 192.168.43.10 -p 6380
192.168.43.10:6380> get k_800
"v_800"
192.168.43.10:6380> get k_900
-> Redirected to slot [15364] located at 192.168.43.191:6380
"v_900"
192.168.43.191:6380> get k_75
-> Redirected to slot [4038] located at 192.168.43.10:6380
"v_75"
192.168.43.10:6380> 

12.模拟故障转移
至此,我们已经手动的把一个redis高可用的集群部署完毕了, 但是还没有模拟过故障
这里我们就模拟故障,停掉期中一台主机的redis节点,然后查看一下集群的变化
我们使用暴力的kill -9(真实环境禁止使用,建议使用kill或pkill)杀掉 redis2上的redis集群节点,然后观察节点状态
理想情况应该是redis3上的6381从节点升级为主节点
在redis1上查看集群节点状态
虽然我们已经测试了故障切换的功能,但是节点修复后还是需要重新上线
所以这里测试节点重新上线后的操作
重新启动redis2的6380,然后观察日志
观察redis1上的日志
这时假如我们想让修复后的节点重新上线,可以在想变成主库的从库执行CLUSTER FAILOVER命令
这里我们在redis2的6380上执行

操作命令:
中止redis2的服务:

[root@redis2 ~]#pkill redis-server

查看群集状态

192.168.43.10:6380> CLUSTER NODES
7420c64e1e42d18cc9f61ee5ffdbd65338985529 192.168.43.191:6381@16381 master - 0 1615361437499 6 connected 5462-10922
e85ba321afac0fd2ebf31690586808deccf9ead5 192.168.43.100:6381@16381 slave,fail faad8f255b87ec4aecacae4428043b5487e7ecc6 1615361403899 1615361400000 2 disconnected
90aa2ba54b757a14c01af5cc77f2c7daf631fedb 192.168.43.100:6380@16380 master,fail - 1615361403796 1615361401867 3 disconnected
0fd1400bfd48dba7180c12112015b90eedf13320 192.168.43.191:6380@16380 master - 0 1615361435456 5 connected 10923-16383
cd579926ef0b48a1456bc29134ac078702a7c7e4 192.168.43.10:6381@16381 slave 0fd1400bfd48dba7180c12112015b90eedf13320 0 1615361436475 5 connected
faad8f255b87ec4aecacae4428043b5487e7ecc6 192.168.43.10:6380@16380 myself,master - 0 1615361437000 0 connected 0-5461
192.168.43.10:6380> 

发现redis2的6380 6381端口file了 然后redis3的6381变为master了

再启动redis2的服务然后redis2重回master

[root@redis2 redis]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
[root@redis2 redis]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
[root@redis2 redis]# redis-cli  -h 192.168.43.100 -p  6380 CLUSTER FAILOVER
OK
[root@redis2 redis]#

然后在查看群集状态

192.168.43.10:6380> CLUSTER NODES
7420c64e1e42d18cc9f61ee5ffdbd65338985529 192.168.43.191:6381@16381 slave 90aa2ba54b757a14c01af5cc77f2c7daf631fedb 0 1615361688420 7 connected
e85ba321afac0fd2ebf31690586808deccf9ead5 192.168.43.100:6381@16381 slave faad8f255b87ec4aecacae4428043b5487e7ecc6 0 1615361687000 2 connected
90aa2ba54b757a14c01af5cc77f2c7daf631fedb 192.168.43.100:6380@16380 master - 0 1615361687000 7 connected 5462-10922
0fd1400bfd48dba7180c12112015b90eedf13320 192.168.43.191:6380@16380 master - 0 1615361687398 5 connected 10923-16383
cd579926ef0b48a1456bc29134ac078702a7c7e4 192.168.43.10:6381@16381 slave 0fd1400bfd48dba7180c12112015b90eedf13320 0 1615361685354 5 connected
faad8f255b87ec4aecacae4428043b5487e7ecc6 192.168.43.10:6380@16380 myself,master - 0 1615361685000 0 connected 0-5461
192.168.43.10:6380> 

redis2又变回master了

13.扩容节点
Redis集群的扩容操作可分为以下几个步骤
(1)准备新节点
(2)加入集群
(3)迁移槽和数据
首先我们在redis1上创建2个新节点

#!/bin/bash
mkdir -p /opt/redis_cluster/redis_{6390,6391}/{conf,logs,pid}
mkdir -p /data/redis_cluster/redis_{6390,6391}
cd /opt/redis_cluster/
cp redis_6380/conf/redis_6380.conf redis_6390/conf/redis_6390.conf
cp redis_6380/conf/redis_6380.conf redis_6391/conf/redis_6391.conf
sed -i 's#6380#6390#g' redis_6390/conf/redis_6390.conf
sed -i 's#6380#6391#g' redis_6391/conf/redis_6391.conf

启动节点

[root@redis1 opt]# bash redis_shell.sh start 6390
root      18495      1  0 14:36 ?        00:00:03 redis-server 192.168.43.10:6380 [cluster]
root      18497      1  0 14:36 ?        00:00:03 redis-server 192.168.43.10:6381 [cluster]
root      20481  18383  0 15:39 pts/0    00:00:00 bash redis_shell.sh start 6390
root      20489      1  0 15:39 ?        00:00:00 redis-server 192.168.43.10:6390 [cluster]
root      20491  20481  0 15:39 pts/0    00:00:00 grep redis
[root@redis1 opt]# bash redis_shell.sh start 6391
root      18495      1  0 14:36 ?        00:00:03 redis-server 192.168.43.10:6380 [cluster]
root      18497      1  0 14:36 ?        00:00:03 redis-server 192.168.43.10:6381 [cluster]
root      20489      1  0 15:39 ?        00:00:00 redis-server 192.168.43.10:6390 [cluster]
root      20498  18383  0 15:39 pts/0    00:00:00 bash redis_shell.sh start 6391
root      20506      1  0 15:39 ?        00:00:00 redis-server /opt/redis_cluster/redis_6391/conf/redis_6391.conf
root      20508  20498  0 15:39 pts/0    00:00:00 grep redis
[root@redis1 opt]# 

下面的是redis_shell.sh脚本内的内容

#!/bin/bash
USAG(){
    echo "sh $0 {start|stop|restart|login|ps|tail} PORT"
}
if [ "$#" = 1 ]
then
    REDIS_PORT='6379'
elif
    [ "$#" = 2 -a -z "$(echo "$2"|sed 's#[0-9]##g')" ]
then
    REDIS_PORT="$2"
else
    USAG
    exit 0
fi

REDIS_IP=$(hostname -I|awk '{print $1}')
PATH_DIR=/opt/redis_cluster/redis_${REDIS_PORT}/
PATH_CONF=/opt/redis_cluster/redis_${REDIS_PORT}/conf/redis_${REDIS_PORT}.conf
PATH_LOG=/opt/redis_cluster/redis_${REDIS_PORT}/logs/redis_${REDIS_PORT}.log

CMD_START(){
    redis-server ${PATH_CONF}
}
CMD_SHUTDOWN(){
    redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT} shutdown
}

CMD_LOGIN(){
    redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT}
}

CMD_PS(){
    ps -ef|grep redis
}

CMD_TAIL(){
    tail -f ${PATH_LOG}
}

case $1 in
    start)
        CMD_START
        CMD_PS
        ;;
    stop)
        CMD_SHUTDOWN
        CMD_PS
        ;;
    restart)
		CMD_START
        CMD_SHUTDOWN
        CMD_PS
        ;;
    login)
        CMD_LOGIN
        ;;
    ps)
        CMD_PS
        ;;
    tail)
        CMD_TAIL
        ;;
    *)
        USAG
esac

然后发现节点

[root@redis1 opt]# redis-cli -c -h redis1 -p 6380 cluster meet 192.168.43.10 6390
OK
[root@redis1 opt]# redis-cli -c -h redis1 -p 6380 cluster meet 192.168.43.10 6391
OK
[root@redis1 opt]# 

扩容

14.在redis1上使用工具扩容:注意新版本使用步骤(2)
(1)旧版本3…
cd /opt/redis_cluster/redis/src/
./redis-trib.rb add-node 192.168.1.102:6390 192.168.1.102:6380
./redis-trib.rb add-node 192.168.1.102:6390 192.168.1.102:6380
./redis-trib.rb reshard 192.168.1.102:6380
(2)或直接使用redis-cli命令完成

[root@redis1 opt]# redis-cli --cluster reshard 192.168.43.10:6380
//打印出进群每个节点信息后,reshard命令需要确认迁移的槽数量,这里我们输入4096个:
How many slots do you want to move (from 1 to 16384)? 4096
//输入6390的节点ID作为目标节点,也就是要扩容的节点,目标节点只能指定一个
What is the receiving node ID? 6390的ID号
//之后输入源节点的ID,这里分别输入每个主节点的6380的ID最后输入done,或者直接输入all
Source node #1:faad8f255b87ec4aecacae4428043b5487e7ecc6
Source node #2:done
//下面输入yes
Do you want to proceed with the proposed reshard plan (yes/no)? yes

迁移完成后命令会自动退出,这时候我们查看一下集群的状态

192.168.43.10:6380> CLUSTER NODES
e85ba321afac0fd2ebf31690586808deccf9ead5 192.168.43.100:6381@16381 slave faad8f255b87ec4aecacae4428043b5487e7ecc6 0 1615362564000 11 connected
cd579926ef0b48a1456bc29134ac078702a7c7e4 192.168.43.10:6381@16381 slave 0fd1400bfd48dba7180c12112015b90eedf13320 0 1615362564000 5 connected
faad8f255b87ec4aecacae4428043b5487e7ecc6 192.168.43.10:6380@16380 myself,master - 0 1615362564000 11 connected 4096-6826 10923-12287
7420c64e1e42d18cc9f61ee5ffdbd65338985529 192.168.43.191:6381@16381 slave 90aa2ba54b757a14c01af5cc77f2c7daf631fedb 0 1615362565031 7 connected
90aa2ba54b757a14c01af5cc77f2c7daf631fedb 192.168.43.100:6380@16380 master - 0 1615362567057 7 connected 6827-10922
9ed0c74f218f54c93835d1f3d9a893c184ae9e7f 192.168.43.10:6390@16390 master - 0 1615362563000 10 connected 0-4095
0fd1400bfd48dba7180c12112015b90eedf13320 192.168.43.191:6380@16380 master - 0 1615362565000 5 connected 12288-16383
1b4f53fc8591f0e833a072482ddb2f28060710a9 192.168.43.10:6391@16391 master - 0 1615362566046 9 connected
192.168.43.10:6380> 

发现6390已经有了4095个槽

redis收缩

原理:扩容是6390从6380中拿去4096点空间,收缩就是从6390中拿4096点空间给6380

[root@redis1 opt]# redis-cli --cluster reshard 192.168.43.10:6380
//打印出进群每个节点信息后,reshard命令需要确认迁移的槽数量,这里我们输入4096个:
How many slots do you want to move (from 1 to 16384)? 4095
//输入6390的节点ID作为目标节点,也就是要扩容的节点,目标节点只能指定一个
What is the receiving node ID? 6380的ID号
//之后输入源节点的ID,这里分别输入每个主节点的6390的ID最后输入done,或者直接输入all
Source node #1:9ed0c74f218f54c93835d1f3d9a893c184ae9e7f
Source node #2:done
//下面输入yes
Do you want to proceed with the proposed reshard plan (yes/no)? yes

然后查看状态

192.168.43.10:6380> CLUSTER NODES
e85ba321afac0fd2ebf31690586808deccf9ead5 192.168.43.100:6381@16381 slave faad8f255b87ec4aecacae4428043b5487e7ecc6 0 1615362816000 11 connected
cd579926ef0b48a1456bc29134ac078702a7c7e4 192.168.43.10:6381@16381 slave 0fd1400bfd48dba7180c12112015b90eedf13320 0 1615362816000 5 connected
faad8f255b87ec4aecacae4428043b5487e7ecc6 192.168.43.10:6380@16380 myself,master - 0 1615362815000 11 connected 0-4094 4096-6826 10923-12287
7420c64e1e42d18cc9f61ee5ffdbd65338985529 192.168.43.191:6381@16381 slave 90aa2ba54b757a14c01af5cc77f2c7daf631fedb 0 1615362816368 7 connected
90aa2ba54b757a14c01af5cc77f2c7daf631fedb 192.168.43.100:6380@16380 master - 0 1615362816000 7 connected 6827-10922
9ed0c74f218f54c93835d1f3d9a893c184ae9e7f 192.168.43.10:6390@16390 master - 0 1615362818000 10 connected 4095
0fd1400bfd48dba7180c12112015b90eedf13320 192.168.43.191:6380@16380 master - 0 1615362818382 5 connected 12288-16383
1b4f53fc8591f0e833a072482ddb2f28060710a9 192.168.43.10:6391@16391 master - 0 1615362819386 9 connected
192.168.43.10:6380> 

可以看到6390已没有空间

15.忘记节点
由于我们的集群是做了高可用的,所以当主节点下线的时候从节点也会顶上,所以最好我们先下线从节点,然后在下线主节点
redis-cli --cluster del-node 192.168.43.10:6391 ID

[root@redis1 opt]# redis-cli --cluster del-node 192.168.43.10:6391 1b4f53fc8591f0e833a072482ddb2f28060710a9
>>> Removing node 1b4f53fc8591f0e833a072482ddb2f28060710a9 from cluster 192.168.43.10:6391
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[root@redis1 opt]# redis-cli --cluster del-node 192.168.43.10:6390 9ed0c74f218f54c93835d1f3d9a893c184ae9e7f
>>> Removing node 9ed0c74f218f54c93835d1f3d9a893c184ae9e7f from cluster 192.168.43.10:6390
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[root@redis1 opt]# 

Redis集群常用命令

集群(cluster)
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
节点(node)
CLUSTER MEET 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。
槽(slot)
CLUSTER ADDSLOTS [slot …] 将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS [slot …] 移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
CLUSTER SETSLOT MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。
键 (key)
CLUSTER KEYSLOT 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT 返回槽 slot 目前包含的键值对数量。CLUSTER GETKEYSINSLOT 返回 count 个 slot 槽中的键。

上一篇:Redis主从与哨兵


下一篇:Redis Sentinel 集群+虚拟IP+自定义脚本 高可用