Redis分片集群
  RuXuq8CpAyRj 2023年11月15日 24 0

搭建分片集群

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:

●海量数据存储问题

●高并发写的问题

使用分片集群可以解决.上述问题,分片集群特征:

●集群中有多个master,每个master保存不同数据

●每个master都可以有多个slave节点

●master之间通过ping监测彼此健康状态

●客户端请求可以访问集群任意节点,最终都会被转发到正确节点。

Redis分片集群_Redis高可用

散列插槽

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高可用_02

效果检验:

Redis分片集群_Redis_03

可以看到Redis存取值的时候,会自动切换插槽

Redis如何判断某个key应该在哪个实例?

●将16384个插槽分配到不同的实例

●根据key的有效部分计算哈希值,对16384取余

●余数作为插槽,寻找插槽所在实例即可

如何将同一类数据固定的保存在同一个Redis实例?

●这一类数据使用相同的有效部分,例如key都以{typeld}为前缀


验证:

Redis分片集群_Redis_04

可以看到当加上前缀之后,两者的插槽值是相同的,保存到了同一个Redis上


集群伸缩

redis-cli --cluster提供了很多操作集群的命令,可以通过下面方式查看:

Redis分片集群_redis集群_05

比如,添加节点的命令:

Redis分片集群_Redis_06

案例:

向集群中添加一个新的master节点,并向其中存储num = 10

需求:

●启动一个新的redis实例,端口为7004

●添加7004到之前的集群,并作为一个master节点

●给7004节点分配插槽,使得num这个key可以存储到7004实例

Redis分片集群_Redis_07

Redis分片集群_redis集群_08

Redis分片集群_redis集群_09

Redis分片集群_Redis_10

-

Redis分片集群_Redis高可用_11

Redis分片集群_redis集群_12

Redis分片集群_Redis分片集群_13

删除节点

Redis分片集群_Redis分片集群_14

主节点有插槽不能直接删除,需要先将插槽移动到其他节点上才能删除

Redis分片集群_Redis分片集群_15

Redis分片集群_Redis_16

故障转移

自动转移

Redis分片集群_redis集群_17

Redis分片集群_Redis_18

Redis分片集群_Redis_19

当集群中有一个master宕机会发生什么呢?

1.首先是该实例与其它实例失去连接

2.然后是疑似宕机:

Redis分片集群_Redis分片集群_20

3.最后是确定下线,自动提升一-个slave为 新的master:

Redis分片集群_Redis高可用_21

手动数据迁移

利用cluster failover命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。其流程如下:

Redis分片集群_redis集群_22

手动的Failover支持三种不同模式:

●缺省:默认的流程,如图1~6步

●force:省略了对offset的一致性校验

●takeover:直接执行第5步,忽略数据一致性、忽略master状态和其它master的意见

命令演示

原始状态:

Redis分片集群_Redis_23

执行 CLUSTER FAILOVER 命令

Redis分片集群_redis集群_24

Redis分片集群_Redis高可用_25


RedisTemplate访问分片集群

RedisTemplate底层同样基于lettuce实现了分片集群的支持,而使用的步骤与哨兵模式基本一致:

1.引入redis的starter依赖

2.配置分片集群地址

3.配置读写分离

与哨兵模式相比,其中只有分片集群的配置方式略有差异,如下:

Redis分片集群_redis集群_26

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分片集群_redis集群_27

观察控制台日志

Redis分片集群_Redis_28

向Redis中set值

Redis分片集群_redis集群_29

观察控制台日志

Redis分片集群_Redis高可用_30

Redis各个节点实例

Redis分片集群_Redis分片集群_31

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
RuXuq8CpAyRj