赞
踩
主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:
使用分片集群可以解决上述问题,如图:
分片集群特征:
Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上,查看集群信息时就能看到:
数据key不是与节点绑定,而是与插槽绑定。redis会根据key的有效部分计算插槽值,分两种情况:
例如:key是num,那么就根据num计算,如果是{itcast}num,则根据itcast计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。
如图,在7001这个节点执行set a 1时,对a做hash运算,对16384取余,得到的结果是15495,因此要存储到103节点。
到了7003后,执行get num
时,对num做hash运算,对16384取余,得到的结果是2765,因此需要切换到7001节点
Redis如何判断某个key应该在哪个实例?
如何将同一类数据固定的保存在同一个Redis实例?
redis-cli --cluster提供了很多操作集群的命令,可以通过下面方式查看:
比如,添加节点的命令:
需求:向集群中添加一个新的master节点,并向其中存储 num = 10
这里需要两个新的功能:
启动
redis-server redis-7007.conf
添加节点的语法如下:
执行命令:
redis-cli --cluster add-node 192.168.85.143:7007 192.168.85.143:7001
通过命令查看集群状态:
redis-cli -p 7001 cluster nodes
如图,7007加入了集群,并且默认是一个master节点:
但是,可以看到7007节点的插槽数量为0,因此没有任何数据可以存储到7007上
我们要将num存储到7007节点,因此需要先看看num的插槽是多少:
如上图所示,num的插槽为2765.
我们可以将0~3000的插槽从7001转移到7007,命令格式如下:
具体命令如下:
建立连接:
redis-cli --cluster reshard 192.168.85.143:7001
得到下面的反馈:
询问要移动多少个插槽,我们计划是3000个:
新的问题来了:
那个node来接收这些插槽??
显然是7007,那么7007节点的id是多少呢?
这里询问,你的插槽是从哪里移动过来的?
这里我们要从7001获取,因此填写7001的id:
确认要转移吗?输入yes:
然后,通过命令查看结果:
目的达成。
# 迁移要移除节点的槽和数据
redis-cli --cluster reshard 192.168.85.143:7001 --cluster-from 7a20bb3e97da5f974afdf4659c69b45b248117a4 --cluster-to 62a4db796e61ddda9fb9511d0f07af8b0c827ac4 --cluster-slots 3000 --cluster-yes
# 删除节点 连接到7001 删除7007的那个id
redis-cli --cluster del-node 192.168.85.143:7001 7a20bb3e97da5f974afdf4659c69b45b248117a4
集群初识状态是这样的:
其中7001、7002、7003都是master,我们计划让7002宕机。
当集群中有一个master宕机会发生什么呢?
直接停止一个redis实例,例如7002:
redis-cli -p 7002 shutdown
1)首先是该实例与其它实例失去连接
2)然后是疑似宕机:
利用cluster failover命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。
该命令只能在群集slave节点执行,让slave节点进行一次人工故障切换。
人工故障切换是预期的操作,而非发生了真正的故障,目的是以一种安全的方式(数据无丢失)将当前master节点和其中一个slave节点(执行cluster-failover的节点)交换角色
其流程如下:
这种failover命令可以指定三种模式:
案例需求:在7002这个slave节点执行手动故障转移,重新夺回master地位
步骤如下:
1)利用redis-cli连接7002这个节点
2)执行cluster failover命令
如图:
RedisTemplate底层同样基于lettuce实现了分片集群的支持,而使用的步骤与哨兵模式基本一致:
1)引入redis的starter依赖
2)配置分片集群地址
3)配置读写分离
与哨兵模式相比,其中只有分片集群的配置方式略有差异,如下:
spring:
redis:
cluster:
nodes:
- 192.168.85.143:7001
- 192.168.85.143:7002
- 192.168.85.143:7003
- 192.168.85.143:7004
- 192.168.85.143:7005
- 192.168.85.143:7006
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。