【Redis】Redis分布式缓存 - 分片集群
分片集群不再具有哨兵集群。
散列插槽
Redis会把每一个master节点映射到 0 - 16383(2^14 -1) 插槽上(Hash Slot)上,查看集群信息时就能看到对应信息。

数据key不是与节点绑定,而是与插槽绑定。Redis会根据key的有效部分计算插槽值。
key的有效部分为两种:
- key中包含"{}",且”{}“中至少包含1个字符,那么{}中的部分就是有效部分。
- key中不包含{},整个key都是有效部分。
计算方式:利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。
做插槽的原因是:如果集群的master节点进行了扩容,那么分配到新节点上对应的插槽的数据会一并迁移到新节点中。也就是数据和插槽绑定,这样对于数据可以更好的进行分片。
Redis如何判断某个key应该在哪个实例上?
通过对key计算hash值并对16384取余,余数就是插槽,寻找插槽所在的实例即可。
如何将同一类数据固定的保存在同一Redis实例中?
同一类的数据使用相同的有效部分,并使用{},也就是设置同类数据的有效部分相同。
集群伸缩
添加节点命令:
#默认是添加一个主节点
add-node
#添加一个从节点--cluster-slave
案例:向集群中添加一个新的master节点,并向其中存储num=10
需求:启动一个Redis实例,端口号为7004
添加7004到之前的集群,并作为一个master节点
给7004节点分配插槽,使得num这个key可以存储到7004实例上。
案例的难点在于如何在对应num的插槽恰好分配到新节点上。
首先确定num对应的插槽【2765】
#添加节点:这里的前面的IP:端口号为新节点所在的 后面的为集群中的已存在的节点
redis-cli --cluster add-node IP:端口号 IP:端口号
#重新分片:这里的IP:端口号为被分片的
redis-cli --cluster reshard IP:端口号
#指定插槽号
How many solts do you want to move(from 1 to 16384)?
3000

故障转移
演示脚本:
#当前7002为主节点
redis-cli -p 7002 shutdown
#重启7002
redis-server 7002/redis.conf
当集群中有一个master节点宕机会发生什么?
会进行自动故障转移:
1、当前实例会与其他实例失去连接
2、疑似宕机

3、确定下线,自动提升一个slave为新的master

那么如何进行手动故障转移?
1、首先进行数据迁移
利用cluster failover命令可以手动让集群中的某个master节点宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。


案例:让7002夺回master节点权
#在7002执行
cluster failover
使用RedisTemplate访问分片集群
底层基于lettuce实现了分片集群的支持,使用步骤和烧心哨兵模式基本一致:

读写分离:验证
