Redis分片集群

Redis分片集群



前言

假如redis容量不够,redis如何进行扩容?
redis主从和哨兵可以解决高可用,高并发读的问题,但是高并发写的问题如何解决?
使用分片集群可以解决上述问题。

一、分片集群结构?

分片集群特征:
·集群中有多个master,每个master保存不同的数据;
·每个master都可以有多个slave节点;
·master之间通过ping监测彼此健康状态;
·客户端请求可以访问集群任意节点,最终都会转发到正确节点。
在这里插入图片描述

二、搭建分片集群

分片集群需要的节点数量较多,这里搭建一个最小的分片集群,包含3个master节点,每个master节点包含一个slave节点,结构如下:
在这里插入图片描述

1.准备工作

1)制作6个实例,6379,6380,6381,6389,6390,6391
修改redis6379.conf配置文件如下:
在这里插入图片描述
2)再把内容复制到其他五个配置文件中去:
在这里插入图片描述
3)在各自的配置文件中修改各自的端口号,rdb文件名等等(就是把里面的所有的6379改为6380),其他配置文件操作一样:

在这里插入图片描述
4)之后启动6个redis实例:
在这里插入图片描述
5)查看启动情况:
在这里插入图片描述
成功之后会生成结点文件:
在这里插入图片描述
结点文件的生成位置与自己设置的默认目录有关。
6)进入rb环境
先进入redis最开始安装的src中:
在这里插入图片描述
在进入redis-6.2.6中:
在这里插入图片描述
redis-6.2.6里面有一个src目录,进入这个目录:
在这里插入图片描述
在这个目录下执行命令:
在这里插入图片描述
注意如果redis没有设置密码和设置了密码,命令会有所不同,这里是设置了密码的情况。
执行命令后会出现:
在这里插入图片描述
执行命令后redis会自动合成集群,我们填入yes后:
在这里插入图片描述
到这一步集群已经完成。

2.集群连接

之前的连接:redis-cli -p 端口号
在这里插入图片描述
集群连接:redis-cli -c -p 端口号
-c:采用集群策略连接,设置数据会自动切换到相应的写主机。
在这里插入图片描述
cluster nodes:查看集群中结点的信息
在这里插入图片描述
可以看到master与slave的主从信息。

三、集群操作和故障恢复

1)redis cluster如何分配这六个结点?
一个集群中至少有三个主节点;
选项–cluster-replicas 1 表示希望为集群中的每个主节点创建一个从节点;
分配原则:尽量保证每个主数据库运行在不同的ip地址,每个从库和主库不在一个ip地址上。
2)散列插槽slots
Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上,查看集群信息就能看到:
在这里插入图片描述
数据key不是与节点绑定而是与插槽绑定。redis会根据key的有效部分计算插槽,分两种情况:
· key中包含“{}”。且“{}”中至少包含一个字符,“{}”中的部分是有效部分;
· key中不包含“{}”,整个key都是有效部分
例如:key是num,那么久根据num计算,如果是{a}num,则根据a计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。
3)测试:
在这里插入图片描述
可以看到name计算出来的slot值是5798,而5798插槽在端口号为6780的主机上,所以进行了重定向。
总结:
在这里插入图片描述

四、集群伸缩

1、添加一个结点到集群
在这里插入图片描述
案例:
在这里插入图片描述
1)先创建一个redis6382.conf配置文件,把redis6379.conf的内容复制到里面,在里面把所有6379改为6382。:
在这里插入图片描述
2)启动端口号为6382的redis实例:
在这里插入图片描述
3)把6382实例加入到集群中:
在这里插入图片描述
查看集群中的节点信息:
在这里插入图片描述
可以看到已经成功加入,但是6382并没有任何插槽。
3)要把num存储到6382实例中,可以先查看num的插槽值,再把那插槽分配给6382实例:
在这里插入图片描述
可以看到num在端口号为6379的实例中并且slot是2765,只要把2765插槽分配到6382实例中,例如移动3000个,就可以把num存储到6382实例中:
使用reshard重新分片:
在这里插入图片描述
还需要告知数据接收和数据来源,如上图把6382的id复制到数据接收处,6379的id复制到数据来源处,最后完成done。
在这里插入图片描述
确定yes。
在这里插入图片描述
可以看到插槽0到2999已经移到6382端口的redis实例中了。
在这里插入图片描述
num已经在6382端口的redis实例中了,再把num的值set为10 完成。
在这里插入图片描述
2、删除集群中的一个结点
案例:删除6382这个实例
按照上述分片步骤先把6382上的插槽转移到其他结点上:
在这里插入图片描述
可以看到6382上面已经没有插槽了,在执行以下步骤:
在这里插入图片描述
forget 后面加上6382这个实例的id,再查看结点信息:
在这里插入图片描述
可以看到6382已经删除了。

五、故障转移

当集群中有一个master宕机会发生什么?
在这里插入图片描述

1、首先通过watch监控集群的状态:
在这里插入图片描述
在这里插入图片描述
2、再令某台主机宕机,例如令6380宕机:
在这里插入图片描述
查看集群状态:
在这里插入图片描述
可以看到6380的状态已经fail了,而6389成为了新的主机。(这里本来计划是6390成为新的主机的,是之前系统安排了6389作为6380的从机,所以6389成为了新的主机)
3、使6380再启动起来:
在这里插入图片描述
在这里插入图片描述
可以看到6380作为6389的slave加入到集群中了。
可以看到并不需要哨兵集群也能自动进行故障切换。
有时候需要手动进行故障转移
1、为什么?
比如集群中某台主机老化或者需要维护了,这时候可以启用一个新的节点,这个新节点性能比较好,让它作为这台主机的slave,手动让新节点去替换老化的主机,手动进行故障转移进行机器升级。
2、怎么做?
数据迁移:
在这里插入图片描述
案例:在6380这个slave节点执行手动故障转移,重新夺回master地位。
在这里插入图片描述
在这里插入图片描述

6380已经重新成为master了,而6389重新成为slave。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值