redis集群介绍
-
redis
redis是一种典型的no-sql 即非关系数据库 像python的字典一样 存储key-value键值对 工作在memory中所以很适合用来充当整个互联网架构中各级之间的cache,比如很多人访问mysql,会对mysql这台服务器增加很大的压力,但是如果我们在mysql之上再搭建一个redis用来做缓存的话,可以大大的减少mysql这台服务器的压力。因为我们第一次访问mysql的话会从硬盘上读取,会非常的慢,这样当我们下一次访问,会从redis缓存中读取就相当于在内存读取,非常的快。直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。这样减少mysq的压力 -
redis集群:
目前有三种模式:
(1)Twitter开发的twemproxy
(2)豌豆荚开发的codis
(3) redis官方的redis-cluster
在这里只介绍第三种,如果想了解前两种模式,可以去百度百度,以为第三种redis-cluster是这三种模式里面性能最强大的,是redis分布式解决方案.当遇到单机、内存、并发、流量等瓶颈时,可以采用Cluster架构方案达到负载均衡目的。redis-cluster采用的是哈希分片的规则
注意:什么时候整个集群不可用(cluster_state:fail)?
a.如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态.
b.如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态. -
redis集群搭建:
(1).redis环境:redis1 192.168.42.143 redis2 192.168.42.168 redis3 192.168.42.172
(2) . redis1创建redis相关目录
[root@redis1 ~]# mkdir -p /opt/redis_cluster/redis_{6380,6381}/{conf,logs,pid} (redis安装目录) [root@redis1 ~]# mkdir -p /data/redis_cluster/redis_{6380,6381} (redis数据存放的目录)
(3.)安装redis(注意redis是gcc的环境下才可以实现)
[root@redis1 conf]# wget http://download.redis.io/releases/redis-5.0.7.tar.gz [root@redis1 conf]# tar -zxf redis-5.0.7.tar.gz -C /opt/redis_cluster/ [root@redis1 redis_cluster]# ln -s /opt/redis_cluster/redis-5.0.7/ /opt/redis_cluster/redis [root@redis1 redis_cluster]# cd redis [root@redis1 redis]# make && make install
(3.)创建redis配置文件:
[root@redis1 ~]# vim /opt/redis_cluster/redis_6380/conf/redis_6380.conf bind 192.168.42.143 #(只接受的该IP发来的请求,如果不进行设置,那么将处理所有请求) port 6380 #(端口号) daemonize yes #(redis放在后台运行,如果不放在后台就把"yes"修改为"no") pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid" #(Redis 默认存放文件,也可配置到其他目录下) logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log" #(redis默认存放日志文件的目录,也可配置到其他目录下) dbfilename "redis_6380.rdb" #(备份的文件的文件名) dir "/data/redis_cluster/redis_6380/" #(数据库镜像备份的文件rdb/AOF文件放置的路径。这里的路径跟文件名要分开配置是因为Redis 在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,再把该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中) cluster-enabled yes cluster-config-file nodes_6380.conf cluster-node-timeout 15000
(4)增加一个从节点6381
[root@redis1 conf]# vim /opt/redis_cluster/redis_6381/conf/redis_6381.conf bind 192.168.42.143 port 6381 daemonize yes pidfile "/opt/redis_cluster/redis_6381/pid/redis_6381.pid" logfile "/opt/redis_cluster/redis_6381/logs/redis_6381.log" dbfilename "redis_6381.rdb" dir "/data/redis_cluster/redis_6381/" cluster-enabled yes cluster-config-file nodes_6381.conf
(5.)启动redis的6380和6381的节点
[root@redis1 redis]#redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf [root@redis1 redis]#redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
(6)查看redis1节点是否起来
[root@redis1 conf]# netstat -anpt | grep redis tcp 0 0 192.168.42.143:6380 0.0.0.0:* LISTEN 69475/redis-server tcp 0 0 192.168.42.143:6381 0.0.0.0:* LISTEN 72181/redis-server tcp 0 0 192.168.42.143:16380 0.0.0.0:* LISTEN 69475/redis-server tcp 0 0 192.168.42.143:16381 0.0.0.0:* LISTEN 72181/redis-server
(7.)为了方便我们可以吧redis1上的配置文件和数据复制到redis2和redis3上
[root@redis1 conf]# scp -rp /opt/redis_cluster/ root@192.168.42.168:/opt [root@redis1 conf]# scp -rp /opt/redis_cluster/ root@192.168.42.172:/opt
(8.)redis2上安装redis:
[root@redis2 ~]# cd /opt/redis_cluster/redis [root@redis2 redis]# make install
(9.)redis2上修改redis的6380配置文件(和redis1的配置一样,只不过1修改一下IP)
[root@redis2 redis]# vim /opt/redis_cluster/redis_6380/conf/redis_6380.conf bind 192.168.42.168 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
(10).redis上修改另一个从节点6381节点
[root@redis2 conf]# vim /opt/redis_cluster/redis_6381/conf/redis_6381.conf bind 192.168.42.168 port 6381 daemonize yes pidfile "/opt/redis_cluster/redis_6381/pid/redis_6381.pid" logfile "/opt/redis_cluster/redis_6381/logs/redis_6381.log" dbfilename "redis_6381.rdb" dir "/data/redis_cluster/redis_6381/" cluster-enabled yes cluster-config-file nodes_6381.conf
(11.)redis2上创建redis数据目录
[root@redis2 conf]# mkdir -p /data/redis_cluster/redis_{6380,6381}
(12).启动redis2的6381和6380节点
[root@redis2 conf]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf [root@redis2 conf]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
(13.)查看redis2节点是否起来
[root@redis1 conf]# netstat -anpt | grep redis tcp 0 0 192.168.42.168:6380 0.0.0.0:* LISTEN 69475/redis-server tcp 0 0 192.168.42.168:6381 0.0.0.0:* LISTEN 72181/redis-server tcp 0 0 192.168.42.168:16380 0.0.0.0:* LISTEN 69475/redis-server tcp 0 0 192.168.42.168:16381 0.0.0.0:* LISTEN 72181/redis-server
(14).redis3上安装redis:
[root@redis2 ~]# cd /opt/redis_cluster/redis [root@redis2 redis]# make install
(15.)redis3上修改redis的6380配置文件(和redis1的配置一样,只不过1修改一下IP)
[root@redis3 redis]# vim /opt/redis_cluster/redis_6380/conf/redis_6380.conf bind 192.168.42.172 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
(10).redis上修改另一个从节点6381节点
[root@redis3 conf]# vim /opt/redis_cluster/redis_6381/conf/redis_6381.conf bind 192.168.42.172 port 6381 daemonize yes pidfile "/opt/redis_cluster/redis_6381/pid/redis_6381.pid" logfile "/opt/redis_cluster/redis_6381/logs/redis_6381.log" dbfilename "redis_6381.rdb" dir "/data/redis_cluster/redis_6381/" cluster-enabled yes cluster-config-file nodes_6381.conf
(11.)redis2上创建redis数据目录
[root@redis3 conf]# mkdir -p /data/redis_cluster/redis_{6380,6381}
(12).启动redis2的6381和6380节点
[root@redis3 conf]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf [root@redis3 conf]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
(13.)查看redis3节点是否起来
[root@redis3 conf]# netstat -anpt | grep redis tcp 0 0 192.168.42.172:6380 0.0.0.0:* LISTEN 69475/redis-server tcp 0 0 192.168.42.172:6381 0.0.0.0:* LISTEN 72181/redis-server tcp 0 0 192.168.42.172:16380 0.0.0.0:* LISTEN 69475/redis-server tcp 0 0 192.168.42.172:16381 0.0.0.0:* LISTEN 72181/redis-server
redis集群配置
-
手动发现redis1,redis2,redis3的节点
(1)编写redis登录脚本root@redis1 ~]# cat 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
(2).登录到redis
[root@redis2 redis_cluster]# sh redis.sh login 6380 192.168.42.168:6380>
(3).让redis1发现所有节点(不用发现本机节点6380)
192.168.42.168:6380> CLUSTER MEET 192.168.42.143 6381 OK 192.168.42.168:6380> CLUSTER MEET 192.168.42.168 6381 OK 192.168.42.168:6380> CLUSTER MEET 192.168.42.168 6380 OK 192.168.42.168:6380> CLUSTER MEET 192.168.42.172 6380 OK 192.168.42.168:6380> CLUSTER MEET 192.168.42.172 6381 OK
(4).查看节点(我们会看到有六个节点)
192.168.42.143:6380> CLUSTER NODES 58da397b3e1b6ee93325b79a5438dd0a4baa3328 192.168.42.168:6381@16381 master - 0 1615541687000 3 connected 012e85970f1fe7e7b397f61334fdcb3db4878996 192.168.42.172:6380@16380 master - 0 1615541687940 4 connected 82ced8730a72e96ad74390a23dcd9b35aecc86a2 192.168.42.143:6380@16380 myself,master - 0 1615541686000 1 connected a8434b5508d42e5932447b18bcbb4d65866487a6 192.168.42.143:6381@16381 master - 0 1615541688952 2 connected edc47a9e9ea2b6a4fa7e202dfba3842f9a130819 192.168.42.168:6380@16380 master - 0 1615541687000 0 connected 94e47a08824bdb56748e6c0d131fbfe9db6bd7c7 192.168.42.172:6381@16381 master - 0 1615541687000 5 connected
(5.)节点都发现完毕后我们再次查看集群配置文件
[root@redis1] cat /data/redis_cluster/redis_6380/nodes_6380.conf
(6.)Redis Cluster 通讯流程
在分布式存储中需要提供维护节点元数据信息的机制,所谓元数据是指:节点负责哪些数据,是否出现故障灯状态信息,
redis 集群采用 Gossip(流言)协议,Gossip 协议工作原理就是节点彼此不断交换信息,一段时间后所有的节点都会知道集群完整信息,这种方式类似流言传播。
通信过程:
1)集群中的每一个节点都会单独开辟一个 Tcp 通道,用于节点之间彼此通信,防火墙放行(端口号+10000).
2)每个节点在固定周期内通过特定规则选择结构节点发送 ping 消息
3)接收到 ping 消息的节点用 pong 消息作为响应。集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,
只要这些节点彼此可以正常通信,最终他们会打成一致的状态,当节点出现故障,新节点加入,主从角色变化等,它能够给不断的ping/pong消息,从而达到同步目的。
通讯消息类型:
Gossip
Gossip 协议职责就是信息交换,信息交换的载体就是节点间彼此发送Gossip 消息。
常见 Gossip 消息分为:ping、 pong、 meet、 fail 等
meet
meet 消息:用于通知新节点加入,消息发送者通知接受者加入到当前集群,meet 消息通信正常完成后,接收节点会加入到集群中并进行ping、 pong 消息交换
ping
ping 消息:集群内交换最频繁的消息,集群内每个节点每秒想多个其他节点发送 ping 消息,用于检测节点是否在线和交换彼此信息。
pong
Pong 消息:当接收到 ping,meet 消息时,作为相应消息回复给发送方确认消息正常通信,节点也可以向集群内广播自身的 pong 消息来通知整个集群对自身状态进行更新。
fail
fail 消息:当节点判定集群内另一个节点下线时,回向集群内广播一个fail 消息,其他节点收到 fail 消息之后把对应节点更新为下线状态。(7.)查看完成后,我们会发现无法在里面写数据,
[root@redis2 redis_cluster]# sh redis.sh login 6380 192.168.42.143:6380> set k1 1 (error) CLUSTERDOWN Hash slot not serve
(8)解决无法在里面写数据,因为并没有给redis节点分配槽位,而且必须是所有的槽位都分配完毕后整个集群才是可用的状态.
反之,也就是说只要有一个槽位没有分配,那么整个集群就是不可用的.[root@redis1 redis_cluster]# sh /opt/redis_cluster/redis.sh login 6380 192.168.42.143:6380> CLUSTER info (查看后我们发现第一行cluster_state为失败) 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:1 cluster_stats_messages_ping_sent:1013 cluster_stats_messages_pong_sent:1010 cluster_stats_messages_meet_sent:6 cluster_stats_messages_sent:2029 cluster_stats_messages_ping_received:1010 cluster_stats_messages_pong_received:1019 cluster_stats_messages_received:2029
(9).为redis的3个主节点给配槽位
root@redis1 ~]# redis-cli -h 192.168.42.143 -p 6380 cluster addslots {0..5461} OK [root@redis1 ~]# redis-cli -h 192.168.42.168 -p 6380 cluster addslots {5462..10922} OK [root@redis1 ~]# redis-cli -h 192.168.42.172 -p 6380 cluster addslots {10923..16383} OK
(10).我们在查看redis节点状态(我们会发现第一行cluster_state为ok)
192.168.42.143: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:1 cluster_stats_messages_ping_sent:1448 cluster_stats_messages_pong_sent:1438 cluster_stats_messages_meet_sent:6 cluster_stats_messages_sent:2892 cluster_stats_messages_ping_received:1438 cluster_stats_messages_pong_received:1454 cluster_stats_messages_received:2892
(11.)为redis主节点6080设置从节点6081
192.168.42.143主:6080—192.168.42.168从:6081
192.168.42.168主:6080----192.168.42.172从6081
192.168.42.172主:6080----192.168.42.143从:6081[root@redis1 ~]# redis-cli -h 192.168.42.168 -p 6381 CLUSTER REPLICATE 82ced8730a72e96ad74390a23dcd9b35aecc86a2(后面的ID号是redis1的6080主节点,意思是redis2的6381是redis1的6080的从节点) OK [root@redis1 ~]# redis-cli -h 192.168.42.172 -p 6381 CLUSTER REPLICATE edc47a9e9ea2b6a4fa7e202dfba3842f9a130819(后面的ID号是redis2的6080主节点,意思是redis3的6381是redis2的6080的从节点)) OK [root@redis1 ~]# redis-cli -h 192.168.42.143 -p 6381 CLUSTER REPLICATE 012e85970f1fe7e7b397f61334fdcb3db4878996(后面的ID号是redis3的6080主节点,意思是redis1的6381是redis3的6080的从节点)) OK
(12).测试是否能在数据库redis中写数据
[root@redis1 ~]# sh /opt/redis_cluster/redis.sh login 6380 192.168.42.143:6380> set k1 k1 -> Redirected to slot [12706] located at 192.168.42.172:6380 (数据在redis3中写着) OK
(13.)测试我们我门往里面写100个数据
a.编写100个数据的脚本[root@redis1 ~]# vim input_key.sh #!/bin/bash for i in $(seq 1 1000) do redis-cli -c -h 192.168.42.143 -p 6380 set k_${i} v_${i} && echo "set k_${i} is ok" done
b.执行脚本
[root@redis1 ~]# sh input_key.sh
(14.)我们查看一下是否分片不同节点上
192.168.42.168:6380> get k_1 -> Redirected to slot [4969] located at 192.168.42.143:6380 "v_1" 192.168.42.143:6380> get k_100 -> Redirected to slot [5541] located at 192.168.42.168:6380 "v_100" 192.168.42.168:6380> get k_200 -> Redirected to slot [3317] located at 192.168.42.143:6380 "v_200" 192.168.42.143:6380> get k_300 -> Redirected to slot [15301] located at 192.168.42.172:6380 "v_300"
redos故障转移
1.中止redis2的服务:
pkill redis-serverw
我们在登录到redis中查看192.168.42.172的6381是否从slave转换为master
192.168.42.143:6380> CLUSTER NODES 58da397b3e1b6ee93325b79a5438dd0a4baa3328 192.168.42.168:6381@16381 slave,fail 82ced8730a72e96ad74390a23dcd9b35aecc86a2 1615544997071 1615544995252 3 disconnected 012e85970f1fe7e7b397f61334fdcb3db4878996 192.168.42.172:6380@16380 master - 0 1615545017573 4 connected 10923-16383 82ced8730a72e96ad74390a23dcd9b35aecc86a2 192.168.42.143:6380@16380 myself,master - 0 1615545017000 1 connected 0-5461 a8434b5508d42e5932447b18bcbb4d65866487a6 192.168.42.143:6381@16381 slave 012e85970f1fe7e7b397f61334fdcb3db4878996 0 1615545015000 4 connected edc47a9e9ea2b6a4fa7e202dfba3842f9a130819 192.168.42.168:6380@16380 master,fail - 1615544997072 1615544992000 0 disconnected 94e47a08824bdb56748e6c0d131fbfe9db6bd7c7 192.168.42.172:6381@16381 master - 0 1615545016000 6 connected 5462-10922
先启动redis2的服务,然后在重回master
[root@redis1 ~]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf [root@redis1 ~]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf [root@redis1 ~]# redis-cli -h 192.168.42.168 -p 6380 CLUSTER FAILOVER
自动搭建部署Redis Cluster
手动搭建集群便于理解集群创建的流程和细节,不过手动搭建集群需要很多步骤,当集群节点众多时,必然会加大搭建集群的复杂度和运维成本,
因此官方提供了 redis-trib.rb的工具方便我们快速搭建集群。redis-trib.rb是采用 Ruby 实现的 redis 集群管理工具,内部通过 Cluster相
关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用前要安装 ruby 依赖环境
1.前提准备:
停掉所有的节点,然后清空数据,恢复成一个全新的集群,所有机器执行命令(如果之钱没有安装过可恶意不用停掉)
[root@redis1 ~]# pkill redis
[root@redis1 ~]# rm -rf /data/redis_cluster/redis_6380/*
[root@redis1 ~]# rm -rf /data/redis_cluster/redis_6381/*
- 启动所有节点
redis1:
[root@redis1 ~]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
[root@redis1 ~]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
redis2
[root@redis2 ~]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
[root@redis2 ~]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
redis3
[root@redis3 ~]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
[root@redis3 ~]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
- 创建群集
[root@redis1 ~]# redis-cli --cluster create --cluster-replicas 1 192.168.42.143:6380 192.168.42.143:6380 192.168.42.168:6380 192.168.42.168:6381 192.168.42.172:6381 192.168.42.172:6381
- 检测完整性
[root@redis1 ~]# redis-cli --cluster check 192.168.42.143:6380
Redis集群的扩容操作可分为以下几个步骤
1)准备redis4新节点6090和6091
2)把redis4加入redis集群中
3)迁移槽和数据
-
redis4安装redis(我们可以复制redis1的数据)
[root@redis4 conf]# scp -rp /opt/redis_cluster/ root@192.168.42.160:/opt [root@redis4 ~]# cd /opt/redis_cluster/redis [root@redis4 redis]# make install
-
redis4上创建两个新的节点目录
[root@localhost redis_cluster]# mkdir -p /opt/redis_cluster/redis_{6390,6391}/{conf,logs,pid} [root@localhost redis_cluster]# mkdir -p /data/redis_cluster/redis_{6390,6391}
-
创建redis4的6090和6091节点配置文件
6090节点:[root@localhost redis_cluster]# vim /opt/redis_cluster/redis_6390/conf/redis_6390.conf bind 192.168.42.160 port 6390 daemonize yes pidfile "/opt/redis_cluster/redis_6390/pid/redis_6390.pid" logfile "/opt/redis_cluster/redis_6390/logs/redis_6390.log" dbfilename "redis_6390.rdb" dir "/data/redis_cluster/redis_6390/" cluster-enabled yes cluster-config-file nodes_6390.conf
6091:
[root@localhost redis_cluster]# vim /opt/redis_cluster/redis_6390/conf/redis_6390.conf bind 192.168.42.160 port 6391 daemonize yes pidfile "/opt/redis_cluster/redis_6391/pid/redis_6391.pid" logfile "/opt/redis_cluster/redis_6391/logs/redis_6391.log" dbfilename "redis_6391.rdb" dir "/data/redis_cluster/redis_6391/" cluster-enabled yes cluster-config-file nodes_6391.conf
-
启动redis节点
[root@localhost redis_cluster]# bash redis_shell.sh start 6390 [root@localhost redis_cluster]# bash redis_shell.sh start 6391
-
让redis1发现加入redis4的新节点
[root@localhost redis_cluster]# redis-cli -c -h 192.168.42.143 -p 6380 cluster meet 192.168.42.160 6390 [root@localhost redis_cluster]# redis-cli -c -h 192.168.42.143 -p 6380 cluster meet 192.168.42.160 6391
-
为redis4上的节点6090分配槽位
redis-5.0.x 版本: [root@redis1 ~]# redis-cli --cluster reshard 192.168.10.3:6380 How many slots do you want to move (from 1 to 16384)? 2048 ##打印出进节点信息后,reshard命令需要确认迁移的槽数量,这里我们输入2048个 What is the receiving node ID? 6390的ID号 #输入6390的节点ID作为目标节点,也就是要扩容的节点,目标节点只能指定一个 Source node #1:redis1的主master的ID #之后输入源节点的ID,这里分别输入每个主节点的6380的ID最后输入done,或者直接输入all
-
为redis4节点6391配置为从节点(6390和6391都是master,且6391master没有分配槽,所以,需要把6391做成从节点,这里只是测试,再次强调,在线上一定不要把master和slave放在一台主机,要交叉分布,我这里是没有办法了,就只有6390可分配)
[root@redis1 ~]# redis-cli -h 192.168.42.160 -p 6391 cluster replicate d288a709e140d4efdf7a7cb33311ff4423cbfa43 OK
注意:后面的ID:d288a709e140d4efdf7a7cb33311ff4423cbfa43是redis4的master的ID
- 查看是否成为redis1的6080的从节点
[root@redis1 ~]# sh redis_shell.sh login 6380 192.168.42.143:6380> CLUSTER NODES 2636dad043b838ea7078b2de8c49b74b8f21de61 192.168.42.160:6391@16391 slave c2bf62e8ffda8668a81c5bfaecdeb0477975d93a 0 1615713650000 6 connected 57752c43e4f5bc808f2baa4f90f8a03caeeacd0d 192.168.42.168:6381@16381 slave d288a709e140d4efdf7a7cb33311ff4423cbfa43 0 1615713651000 4 connected d288a709e140d4efdf7a7cb33311ff4423cbfa43 192.168.42.143:6380@16380 myself,master - 0 1615713648000 1 connected 682-5460 c2bf62e8ffda8668a81c5bfaecdeb0477975d93a 192.168.42.172:6381@16381 master - 0 1615713651906 5 connected 11605-16383 c873b7f2c66b9d6671a975a0601e6f98308bae0a 192.168.42.160:6390@16390 master - 0 1615713650892 7 connected 0-681 5461-6143 10923-11604 612b2c5b397fc0d8822b0605c7e17f851793bfb6 192.168.42.168:6380@16380 master - 0 1615713649000 3 connected 6144-10922
redis节点收缩
流程说明:
1).首先需要确定下线节点是否有负责的槽,
如果是,需要把槽迁移到其他节点,保证节点下线后整个集群槽节点映射的完整性.
2).当下线节点不再负责槽或者本身是从节点时,
就可以通知集群内其他节点忘记该下线节点,当所有的节点忘记该节点后可以正常关闭.
- 将redis4的6390的 槽全给redis1的6380
[root@redis1 ~]# redis-cli --cluster reshard 192.168.42.143:6380
How many slots do you want to move (from 1 to 16384)? 1365 #分配多少个槽
输入6380的id #分配给谁(目标节点)
输入6390的id #从哪里分配(源节点)
done
- 查看redis4的6380是否还有槽
sh redis_shell.sh login 6380
192.168.42.143:6380> CLUSTER NODES
忘记redis节点
由于我们的集群是做了高可用的,所以当主节点下线的时候从节点也会顶上,所以最好我们先下线从节点,然后再下线主节点
命令:
忘记redis4的6390和6391的节点
redis-cli --cluster del-node 192.168.42.160:6391 ID
redis-cli --cluster del-node 192.168.42.160:6390 ID
查看是否还有6390和6391的节点
sh redis_shell.sh login 6380
192.168.42.143:6380> CLUSTER NODES