搭建分片集群
主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:
●海量数据存储问题
●高并发写的问题
使用分片集群可以解决.上述问题,分片集群特征:
●集群中有多个master,每个master保存不同数据
●每个master都可以有多个slave节点
●master之间通过ping监测彼此健康状态
●客户端请求可以访问集群任意节点,最终都会被转发到正确节点。
散列插槽
Redis会把每一-个master节 点映射到0~16383共16384个插槽(hash slot)上,查看集群信息时就能看到:
数据key不是与节点绑定,而是与插槽绑定。redis会根 据key的有效部分计算插槽值,分两种情况: .
● key中包含"{",且“{}” 中至少包含1个字符,“{}”中的部分是有效部分
● key中不包含"{}” ,整个key都是有效部分
例如: key是num,那么就根据num计算,如果是{itcast}num,则根据itcast计算。计算方式是利用CRC16算法得到一
个hash值,然后对16384取余,得到的结果就是slot值。
效果检验:
可以看到Redis存取值的时候,会自动切换插槽
Redis如何判断某个key应该在哪个实例?
●将16384个插槽分配到不同的实例
●根据key的有效部分计算哈希值,对16384取余
●余数作为插槽,寻找插槽所在实例即可
如何将同一类数据固定的保存在同一个Redis实例?
●这一类数据使用相同的有效部分,例如key都以{typeld}为前缀
验证:
可以看到当加上前缀之后,两者的插槽值是相同的,保存到了同一个Redis上
集群伸缩
redis-cli --cluster提供了很多操作集群的命令,可以通过下面方式查看:
比如,添加节点的命令:
案例:
向集群中添加一个新的master节点,并向其中存储num = 10
需求:
●启动一个新的redis实例,端口为7004
●添加7004到之前的集群,并作为一个master节点
●给7004节点分配插槽,使得num这个key可以存储到7004实例
-
删除节点
主节点有插槽不能直接删除,需要先将插槽移动到其他节点上才能删除
故障转移
自动转移
当集群中有一个master宕机会发生什么呢?
1.首先是该实例与其它实例失去连接
2.然后是疑似宕机:
3.最后是确定下线,自动提升一-个slave为 新的master:
手动数据迁移
利用cluster failover命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。其流程如下:
手动的Failover支持三种不同模式:
●缺省:默认的流程,如图1~6步
●force:省略了对offset的一致性校验
●takeover:直接执行第5步,忽略数据一致性、忽略master状态和其它master的意见
命令演示
原始状态:
执行 CLUSTER FAILOVER 命令
RedisTemplate访问分片集群
RedisTemplate底层同样基于lettuce实现了分片集群的支持,而使用的步骤与哨兵模式基本一致:
1.引入redis的starter依赖
2.配置分片集群地址
3.配置读写分离
与哨兵模式相比,其中只有分片集群的配置方式略有差异,如下:
spring:
redis:
cluster:
nodes:
- 192.168.40.128:7001
- 192.168.40.128:7002
- 192.168.40.128:7003
- 192.168.40.128:8001
- 192.168.40.128:8002
- 192.168.40.128:8003
# sentinel:
# master: mymaster
# nodes:
# - 192.168.40.128:27001
# - 192.168.40.128:27002
# - 192.168.40.128:27003
从Redis中取值
观察控制台日志
向Redis中set值
观察控制台日志
Redis各个节点实例
标签:插槽,Redis,192.168,集群,key,分片,master,节点 From: https://blog.51cto.com/AmbitionGarden/8286235