Redis Cluster集群 升级 集群伸缩和SpringBoot操作Redis 集群

点赞多大胆,就有多大产!开源促使进步,献给每一位技术使用者和爱好者!

干货满满,摆好姿势,点赞发车

路漫漫其修远兮,吾将上下而求索

集群伸缩介绍

集群伸缩说白了就是在Redis中上线和下线节点,比如我们上篇文章中使用了6台节点3主3从来存储数据,如果公司业务蒸蒸日上6台节点不够用我们就需要新增节点,这个叫做集群扩容 ,如果有点凉或者高峰期过了就需要下线节点,这个叫做集群缩容。这里就说说Redis5.0.5版本怎么去扩容和缩容集群。

节点扩容

配置文件

这个配置和之前一样,改改端口文件名即可

port 8006
daemonize yes
logfile "8006.log"
dir "/usr/local/redis-5.0.5/data/"
protected-mode no
dbfilename dump-8006.rdb
# 开启集群
cluster-enabled yes
# 集群运行时文件
cluster-config-file nodes-8006.conf
# 是否集群所有的节点都正常集群才可使用,改为no
cluster-require-full-coverage no
# 节点请求超时时间 
cluster-node-timeout 15000
# 关闭保护模式
protected-mode no

启动节点 

redis-server redis-8006.conf
redis-server redis-8007.conf

查看节点启动状态

添加节点

1、使用redis-cli --cluster help命令查看帮助

create:创建一个集群
call:可以执行redis命令
add-node:将一个节点添加到集群里,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port
del-node:移除一个节点
reshard:重新分片
check:检查集群状态

2、使用add-node参数添加节点 

redis-cli --cluster add-node 127.0.0.1:8006 127.0.0.1:8000
redis-cli --cluster add-node 127.0.0.1:8007 127.0.0.1:8000

这里抱歉一下:我运行出来的图找不到了,所以借了一张,大概长这样 

查看节点状态

说明:我这里大家看到我打有马赛克,因为这张图是我分配完槽之后截的,因为之前的图一样找不到了,大家会发现这里多了两台节点8006和6007

分配槽

执行以下命令:

redis-cli --cluster reshard 127.0.0.1:8000

 这里会出现下图效果,这里会让你选择你想挪动多少槽,从1到16384,后续信息我在下方使用文字贴出,大家跟着去做!

 How many slots do you want to move (from 1 to 16384)? 2000
说明:需要多少个槽移动到新的节点上,自己设置,比如2000个槽
What is the receiving node ID? de7f62b1b649622bd18e8b4983864573ee6cc0e0
说明:把这2000个hash槽移动到哪个节点上去,需要指定节点id,我这里写的是8006的ID
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node 1:all
注意:输入all为从所有主节点中分别抽取相应的槽数指定到新节点中,抽取的总槽数为2000个;或者输入原节点ID然后输入done,意思将输入的节点ID,抽取的总槽数为2000个,我这里输入的是all。
Do you want to proceed with the proposed reshard plan (yes/no)? yes
注意:输入yes确认开始执行分片任务

查看新的节点状态

大家算一算这个是不是我们撒谎改变分配的有2000个槽,这2000个槽分别从8000、8001、8002分过来的,而8007并没有分配槽,他是8006的从节点,接下来我们设置一下。

配置主从关系

哈哈,大家可还记得如何人分配主从?

redis-cli -p 8007 cluster replicate de7f62b1b649622bd18e8b4983864573ee6cc0e0

查看集群状态发现8007变成slave 

至此我们完成了节点扩容,从原本的3主3从,扩容成4主4从。我们这里都是在同一台节点上完成的,在实际生产过程中都是在不同节点上的,只需要修改ip和端口号即可,相信这对优秀的各位来说都是小意思!

集群缩容

下线8007从节点

使用del-node ip:port nodeID

redis-cli --cluster del-node 127.0.0.1:8007 d4aa5b7ea13899beef910b93228fc27b48bf88f4

查看集群状态

你会发现8007节点已经下线了

下线8006主节点

这个稍微有点麻烦,因为主节点上有数据槽,需要归还槽,然后在执行下线操作,否则就有可能造成数据丢失,这也是里边的小细节需要大家牢记!

执行:redis-cli --cluster reshard 127.0.0.1:8006

分配槽

这里一定要注意,我这里怎么变成4000了呢,我之前不是分配了2000个槽到8006吗?因为上边操作错误了。所以这里第一个ID是接收槽的节点的ID也就是8000的ID,第二个填写源节点的ID也就是8006的ID。

查看集群状态 

我们发现8006已经没有槽了,而8000多了10923-12255槽

 下线节点

redis-cli --cluster del-node 127.0.0.1:8006 de7f62b1b649622bd18e8b4983864573ee6cc0e0

查看集群状态

已经成功下线,我们进入集群测试添加查询数据都是没有问题的。

重定向

moved重定向

我们先来看看下边的命令出现的问题

  1. 上边的两个红色框分别为8000的槽和8001的槽
  2. 紧接着的是我们想集群中set了一个数据key为java,value为javaweb
  3. 接下来的cluster keyslot java命令是计算java这个key应该分配到那个槽中,结果为858,那么858这个槽在8000节点上所以数据就存储在了8000节点上
  4. 我们看最后一个红框,计算了python的槽值为7252,被8001节点维护,所以set值时大家发现多出一行提示重定向到8001上接下来我们的客户端就被重定向到了8001端口可以看到最后一行已经由8000编程了8001
  5. 如果我们去获取或者设置数据,如果直接在该节点维护那么会直接完成操作,如果不在该节点,Redis会向客户端回复moved,客户端会重定向到指定的节点上操作

ask重定向

moved和ask区别

  1.  两者都是客户端重定向
  2. moved确定槽已经迁移,不在当前节点
  3. ask是槽还在迁移中

大家会发现,如果我们迁移了槽或者槽正在迁移中我们的客户端来访问Redis Cluster中随机一个节点时如果数据不在该节点上会去做moved或者ask操作也就是重定向到其他的节点上 ,这样会对性能造成一定的影响。比如我们集群中有100个节点那么直接命中的概率就是1%。基于这个问题,我们面给大家说Stream客户端来解决

smart客户端

介绍

我们的集群数据在不同的slot中,在不同的节点上,key不在该节点上那么会发生moved重定向,去其他节点上操作,如果集群正在伸缩在做槽的迁移那么会发生ask重定向,会大大影响我们对Redis集群操作的性能,我们可以使用smart客户端完成高性能的操作Redis Cluster。我们通过JedisCluster对象操作Redis集群。

原理

  1. 从集群中选择一个可以运行的节点,使用Cluster slots初始化槽和节点映射
  2. 将这种映射关系存储到本地,为每一个节点创建一个Jedis Pool
  3. 之后直接连接到Redis节点上去执行命令
  4. smart客户端将key发送到指定的节点上,如果成功就会得到响应
  5. 如果出现连接出错,随机找个活跃节点,向其发送命令,大概率会得到 moved 异常,然后重新初始化 slot 和 node 的映射关系,再向目标节点发送命令
  6. 如果这样的情况连续出现 5 次,报错:Too many cluster redirection!

SpringBoot操作Redis Cluster

配置参考本渣《最新超详细注释解析SpringBoot2.X操作Redis5.X》,只需要修改配置文件中的连接即可,操作等等都一样

application.yml文件

spring:
  redis:
    cluster:
      nodes: 192.168.11.101:8000,192.168.11.101:8001,192.168.11.101:8002,192.168.11.101:8003,192.168.11.101:8004,192.168.11.101:8005
    timeout: 5000ms

 

总结

  • Redis单机,主从复制,哨兵,集群都可以成功搭建 
  • 各运行模式之间的关系,特点也都心中明朗
  • SpringBoot操作Redis单机,哨兵和集群
  • 怎么用好Redis,开发规范,出现的坑,相关面试题请大家关注Redis系列文章后续继续推出

我是不夜学长,用你勤劳的双手点个赞吧,这将是我创作更多优质文章的动力,好不好嘛!

 

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石添的编程哲学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值