3.4 Redis分片集群

一、搭建分片集群

  1. 哨兵集群没有解决的问题

    1. 海量数据存储问题

    2. 高并发写的问题

  2. 使用分片集群可以解决上述问题

    1. 集群中有多个master,每个master保存不同的数据

    2. 每个master可以有多个slave节点

    3. master之间通过ping检测彼此健康状态

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

  3. 搭建分片集群可以参考附录

二、散列插槽

  1. Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上

  2. 数据key不是与节点绑定,而是与插槽绑定。Redis会根据key的有效部分计算插槽值,分两种情况:

    1. key中包含"{}",且"{}"中至少包含一个字符,"{}"中的部分是有效部分

    2. key中不包含"{}",整个key都是有效部分

  3. cli链接方式:

    redis-cli -c -p 端口地址

三、集群伸缩

  1. 添加一个节点到集群

    redis-cli --cluster add-node 新节点ip:新节点端口 已经存在的节点ip:已经存在的节点端口

    备注:添加一个主节点

  2. 查看分片集群信息

    redis-cli -p 随便一个端口地址 cluster nodes
  3. 给添加的节点添加插槽

    redis-cli --cluster reshard 被拆出插槽的节点ip:被拆出插槽的节点端口

    备注:后续填写内容:

    How many slots do you want to move? 你想要移动出多少个插槽

    What is the receiving node ID? 谁来接收这部分插槽:接收的节点的id

    Source node #1:被拆出插槽的节点id

    Source node #2:填写done即可

    最后一个yes就可以完成移动了

四、故障转移

  1. 集群中有一个master宕机会发生什么呢

    1. 该实例与其他实例失去连接

    2. 疑似宕机

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

  2. 数据迁移——手动故障转移

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

      手动迁移-故障转移

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

      1. 缺省:默认流程,入图1-6

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

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

    3. 命令:cluster failover

五、RedisTemplate访问分片集群

  1. 步骤

    1. 引入redis的starter依赖

    2. 配置分片集群地址

      spring:
        redis:
          cluster:
            nodes: # 指定分片集群的每一个节点信息(不管主从,全部配置)
            	- ip:端口
            	- ip:端口
            	- ip:端口
            	- ip:端口
            	- ……
    3. 配置读写分离

    基本与哨兵模式无意,除了配置分片集群的yml有点差异

最后更新于

这有帮助吗?