Redis6.x高可用之Cluster集群和分片

1.Cluster集群介绍

  • 背景

    • Sentinel解决了主从架构故障自动迁移的问题
    • 但是Master主节点的写能力和存储能力依旧受限
    • 使用redis的集群cluster就是为了解决单机redis容量有限的问题,将数据按一定的规则分配到多台机器
  • 什么是集群Cluster

    • 是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理
    • 容易和分布式弄混,分布式系统简单的可以认为是一个庞大的系统,进行拆分多个小系统
  • redis集群模式介绍

    • Cluster模式是redis3.0开始推出
    • 采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接
    • 官方要求:至少6个节点才可以保证高可用,即3主3从;扩展性强、更好做到高可用
    • 各个节点会互相通信,采用gossip协议交换节点元数据信息
    • 数据分散存储到各个节点上

2.Cluster数据分片和虚拟哈希槽介绍

  • 背景

    • 主节点的写能力和存储能力受限
    • 单台机器无法满足需求,因此把数据分散存储到多个机器
    • 类似案例:mysql分库分表
  • 常见的数据分区算法

    • 哈希取模:对选择的partitioning key计算其哈希值,得到的哈希值就是对应的分区
    • 范围分片:通过确定分区键是否在某个范围内来选择分区
    • 一致性Hash分区
    • redis cluster集群没有采用一致性哈希方案,而是采用【数据分片】中的哈希槽来进行数据存储与读取的
  • 什么是redis的哈希槽slot

    • redis集群预分好16384个槽,当需要在redis集群中放置一个key-value时,根据CRC16(key) mod 16384的值,决定将一个key放到哪个桶中
  • 大体流程

    • 假设主节点的数量为3,将16384个槽位按照【用户自己的规则】去分配这3个节点,每个节点复制一部分槽位

      • 节点1的槽位区间范围为0-5460
      • 节点2的槽位区间范围为5461-10922
      • 节点3的槽位区间范围为10923-16383
      • 注意:从节点是没有槽位的,只有主节点才有
    • 存储查找

      • 对要存储查找的键进行CRC16哈希运算,得到一个值,并取模16384,判断这个值在哪个节点的范围区间
      • 假设CRC16("test_key")%16384=3000,就是节点一
      • CRC16算法不是简单的hash算法,是一种校验算法

  • 使用哈希槽的好处就在于可以方便的添加或移除节点

    • 当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了
    • 当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了

3.Cluster集群环境搭建

  • 说明

    • 旧版本的需要使用ruby语言进行构建,新版5之后直接用redis-cli即可
    • 6个节点,三主三从,主从节点会自动分配,不是人工指定
    • 主节点故障后从节点会替换主节点
  • 注意点:把之前的RDB、AOF文件删除

  • 配置

    bind 0.0.0.0
    port 6381
    daemonize yes
    requirepass "123456"
    logfile "/usr/local/redis/temp/redis6381.log"
    dbfilename "redis6381.rdb"
    dir "/usr/local/redis/temp"
    appendonly yes
    appendfilename "appendonly6381.aof"
    masterauth "123456"
    
    # 是否开启集群
    cluster-enabled yes
    # 生成的node文件,记录集群节点信息,默认为nodes.conf
    cluster-config-file nodes-6381.conf
    # 节点连接超时时间
    cluster-node-timeout 20000
    # 集群节点的ip,当前节点的ip
    cluster-announce-ip 123.57.94.239
    # 集群节点映射端口
    cluster-announce-port 6381
    # 集群节点总线端口,节点之间互相通信,常规端口+1万
    cluster-announce-bus-port 16381
    
  • 启动6个节点

    ./bin/redis-server ./temp/redis6381.conf 
    ./bin/redis-server ./temp/redis6382.conf 
    ./bin/redis-server ./temp/redis6383.conf 
    ./bin/redis-server ./temp/redis6384.conf 
    ./bin/redis-server ./temp/redis6385.conf 
    ./bin/redis-server ./temp/redis6386.conf 
    
  • 加入集群(其中一个节点执行即可)

    • --cluster:构建集群全部节点信息
    • --cluster-replicas 1:主从节点的比例,1表示一主一从的方式
    ./bin/redis-cli -a 123456 --cluster create 123.57.94.239:6381 123.57.94.239:6382 123.57.94.239:6383 123.57.94.239:6384 123.57.94.239:6385 123.57.94.239:6386 --cluster-replicas 1
    
  • 检查状态信息(其中一个节点执行即可)

    ./bin/redis-cli -a 123456 --cluster check 123.57.94.239:6381
    

4.Cluster集群读写命令

  • 集群状态

    ./bin/redis-cli -c -a 123456 -p 6381
    # 集群信息
    cluster info
    # 节点信息
    cluster nodes
    
  • 测试集群读写命令set/get

    • key哈希运算计算槽位置
    • 槽在当前节点的话直接插入/读取,否则自动转向到对应的节点
  • 操作都是主节点操作,从节点只是备份

  • 流程解析

    • 启动应用
    • 加入集群
    • 从节点请求复制主节点(主从复制)
      • 先全量
      • 再增量

5.Cluster集群整合SpringBoot

  • 配置文件

    spring:
      redis:
        cluster:
          # 最大转发次数
          max-redirects: 3
          nodes: 123.57.94.239:6381,123.57.94.239:6382,123.57.94.239:6383,123.57.94.239:6384,123.57.94.239:6385,123.57.94.239:6386
        cache:
        # 指定缓存类型
        type: redis
        password: 123456
    
  • 高可用架构总结

    • 主从模式:读写分离、备份,一个master可以有多个slaves
    • 哨兵sentinel:监控,自动转移,哨兵发现主服务器挂了后,就会从slave中重新选举一个主服务器
    • 集群:为了解决单机redis容量有限的问题,将数据按一定的规则分配到多台机器,内存/QPS不受限于单机,提高并发量
posted @ 2021-08-04 15:57  Gen2021  阅读(208)  评论(0编辑  收藏  举报