Redis6 高可用系列,Cluster集群和分片

一、Cluster集群

  • 背景

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

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

    Cluster集群模式图解(三主三从)

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

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

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

三、Cluster集群环境准备 

  • 说明

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

配置文件设置

        我这里是在 /usr/local/redis/ 目录下面创建了clusterConfig 目录,在该目录下新建redis.conf文件,配置文件内容如下:

bind 0.0.0.0

port 6379

daemonize yes

requirepass "1qazXSW@"

logfile "/usr/local/redis/log/redis.log"

dbfilename "xdclass.rdb"

dir "/usr/local/redis/data"

appendonly yes

appendfilename "appendonly.aof"

masterauth "1qazXSW@"

#是否开启集群
cluster-enabled yes

# 生成的node文件,记录集群节点信息,默认为nodes.conf
cluster-config-file nodes.conf

#节点连接超时时间
cluster-node-timeout 20000

#集群节点的ip,当前节点的ip
cluster-announce-ip 192.168.75.147

#集群节点映射端口
cluster-announce-port 6379

#集群节点总线端口,节点之间互相通信,常规端口+1万
cluster-announce-bus-port 16379

四、启动6个Cluster节点

进入 bin 目录  cd /usr/local/redis/bin/

 启动命令 x6

./redis-server ../cluserConf/redis.conf

将6个节点加入集群,进入任意节点,执行命令

./redis-cli -a 1qazXSW@ --cluster create 192.168.75.147:6379 192.168.75.149:6379 192.168.75.150:6379 192.168.75.151:6379 192.168.75.152:6379 192.168.75.153:6379 --cluster-replicas 1

其中

  • --cluster 表示构建集群全部节点信息
  • --cluster-replicas 1 表示主从节点的比例,1表示1主1从的方式

 键入命令后,输个yes,会输出集群构建结果

检查状态信息(其中一个节点执行即可)

./redis-cli -a 1qazXSW@ --cluster check 192.168.75.149:6379

五、Cluster集群读写命令

5.1、cluster模式查看集群状态

cluster模式进入任意redis节点客户端

./redis-cli -c -a 1qazXSW@

集群信息查看

127.0.0.1:6379> cluster info

 节点信息查看

127.0.0.1:6379> cluster nodes

 5.2、测试集群读写命令set/get

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

 5.3、启动流程总结

  • 启动应用 6个redis节点,用cluster的配置文件启动

  • 加入集群 任意节点输入命令

  • 从节点请求复制主节点(主从复制一样)

    • 先全量
    • 再增量

六、Cluster集群整合SpringBoot

6.1、修改配置文件

pom文件 添加连接池

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

application.yml配置文件

    cluster:
      #命令的最多转发次数 6也可以
      max-redirects: 3
      nodes: 192.168.75.147:6379,192.168.75.149:6379,192.168.75.150:6379,192.168.75.151:6379,192.168.75.152:6379,192.168.75.153:6379

 6.2、不在同个网络,所以集群改为公网ip地址才可以访问 (需要的话)

修改 clusterConf/redis.conf 配置文件

#对外的ip
cluster-announce-ip 192.168.75.147   
#对外端口
cluster-announce-port   
#集群桥接端口
cluster-announce-bus-por

动态修改配置

config set cluster-announce-ip 192.168.75.147

六、 Cluster集群故障自动转移

147、149、150 三个节点,是主节点,151,152,153 是从节点,kill掉149(149的从节点是153,可以查看节点信息),看log

147 或 150 (主节点的log)

 153 (被关闭的149的从节点)

 其他从节点的log

 查看集群信息

127.0.0.1:6379> cluster nodes

可以看到6个节点,149 master是fail状态,下线了, 而他的从节点 153 变为了 master

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElendaLee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值