Redis节点高可用之Cluster集群搭建

一 介绍

  • 背景

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

    • 是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理
    • 容易和分布式弄混,分布式系统简单的可以认为就一个庞大的系统,进行拆分度多个小系统
  • Cluster模式是Redis3.0开始推出
  • 采用无中心结构,每个节点保存数据和整个集群状态, 每个节点都和其他所有节点连接
  • 官方要求:至少6个节点才可以保证高可用,即3主3从;扩展性强、更好做到高可用
  • 各个节点会互相通信,采用gossip协议交换节点元数据信息
  • 数据分散存储到各个节点上

二 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算法,是一种校验算法

三 搭建

  • 说明

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

    • 把之前的rdb、aof文件删除
  • 节点(网络安全组开放端口)

    • 6381、6382
    • 6383、6384
    • 6385、6386
  • 配置
    bind 0.0.0.0
    port 6381
    daemonize yes
    requirepass "123456"
    logfile "/usr/local/redis/log/redis1.log"
    dbfilename "xdclass1.rdb"
    dir "/usr/local/redis/data"
    appendonly yes
    appendfilename "appendonly1.aof"
    masterauth "123456"
    ​
    #是否开启集群
    cluster-enabled yes
    ​
    # 生成的node文件,记录集群节点信息,默认为nodes.conf,防止冲突,改为nodes-6381.conf
    cluster-config-file nodes-6381.conf
    ​
    #节点连接超时时间
    cluster-node-timeout 20000
    ​
    #集群节点的ip,当前节点的ip
    cluster-announce-ip 172.18.172.109
    ​
    #集群节点映射端口
    cluster-announce-port 6381
    ​
    #集群节点总线端口,节点之间互相通信,常规端口+1万
    cluster-announce-bus-port 16381
    bind 0.0.0.0
    port 6386
    daemonize yes
    requirepass "123456"
    logfile "/usr/local/redis/log/redis6.log"
    dbfilename "xdclass6.rdb"
    dir "/usr/local/redis/data"
    appendonly yes
    appendfilename "appendonly6.aof"
    masterauth "123456"
    ​
    cluster-enabled yes
    cluster-config-file nodes-6386.conf
    cluster-node-timeout 20000
    cluster-announce-ip 172.18.172.109
    cluster-announce-port 6386
    cluster-announce-bus-port 16386

  • 启动6个节点
    ./redis-server ../conf/cluster/redis1.conf
    ./redis-server ../conf/cluster/redis2.conf
    ./redis-server ../conf/cluster/redis3.conf
    ./redis-server ../conf/cluster/redis4.conf
    ./redis-server ../conf/cluster/redis5.conf
    ./redis-server ../conf/cluster/redis6.conf

  • 加入集群(其中一个节点执行即可)
    --cluster 构建集群全部节点信息
    --cluster-replicas 1 主从节点的比例,1表示1主1从的方式
     

    ./redis-cli -a 123456 --cluster create 172.18.172.109:6381 172.18.172.109:6382 172.18.172.109:6383 172.18.172.109:6384 172.18.172.109:6385 172.18.172.109:6386 --cluster-replicas 1

四 节点高可用之Cluster集群读写命令

  • 集群状态
    ./redis-cli -c -a 123456 -p 6379
    ​
    #集群信息
    cluster info
    ​
    #节点信息
    cluster nodes
  • 测试集群读写命令set/get
    key哈希运算计算槽位置
    槽在当前节点的话直接插入/读取,否则自动转向到对应的节点

  • 操作都是主节点操作,从节点只是备份

  • 流程解析
     

  • 启动应用
    加入集群
    从节点请求复制主节点(主从复制一样)

    • 先全量
    • 再增量

四 节点高可用之Cluster集群整合SpringBoot2.X 


   不在同个网络,所以集群改为阿里云公网ip地址才可以访问

  • 公司开发部署都会用同个网络
  • 配置文件修改
#对外的ip
cluster-announce-ip 8.129.113.233   
#对外端口
cluster-announce-port   
#集群桥接端口
cluster-announce-bus-por  

   动态修改配置

config set cluster-announce-ip 8.129.113.233
  • 连接池添加 (之前添加)
     

    <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-pool2</artifactId>
    </dependency>
  • 配置文件(注释Sentinel相关配置)
     cluster:
        #命名的最多转发次数
          max-redirects: 3
          nodes: 8.129.113.233:6381,8.129.113.233:6382,8.129.113.233:6383,8.129.113.233:6384,8.129.113.233:6385,8.129.113.233:6386

五 高可用架构总结

  • 主从模式:读写分离,备份,一个Master可以有多个Slaves
  • 哨兵sentinel:监控,自动转移,哨兵发现主服务器挂了后,就会从slave中重新选举一个主服务器
  • 集群: 为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器,内存/QPS不受限于单机,提高并发量。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值