> 文档中心 > Redis6.X高可用之Cluster集群和分片

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

目录

一、先介绍下Redis集群模式

 二、Redis6.X节点高可用之Cluster数据分片和虚拟哈希槽介绍

 三、Redis6.X节点高可用之Cluster集群环境准备

四、Redis6.X节点高可用之Cluster集群读写命令

 五、Cluster集群整合SpringBoot2.X

六、Cluster集群故障自动转移


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

一、先介绍下Redis集群模式

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

 二、Redis6.X节点高可用之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算法,是一种校验算法

 

 

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

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

 三、Redis6.X节点高可用之Cluster集群环境准备

说明:

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

 注意点:把之前的rdb、aof文件删除,停掉主从 、哨兵

第一步:进入目录下,然后创建新文件 

配置样例解释;

bind 0.0.0.0
port 6381
daemonize yes
requirepass "123456"
logfile "/usr/local/redis/log/redis1.log"
dbfilename "wnn.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.xx.xx

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

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

具体redis1.conf如下:

bind 0.0.0.0
port 6381
daemonize yes
requirepass "123456"
logfile "/usr/local/redis/log/redis1.log"
dbfilename "wnn1.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly1.aof"
masterauth "123456"
​cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 20000
cluster-announce-ip 112.74.xx.xx
cluster-announce-port 6381
cluster-announce-bus-port 16381

redis2.conf如下

bind 0.0.0.0
port 6382
daemonize yes
requirepass "123456"
logfile "/usr/local/redis/log/redis2.log"
dbfilename "wnn2.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly2.aof"
masterauth "123456"
​cluster-enabled yes
cluster-config-file nodes-6382.conf
cluster-node-timeout 20000
cluster-announce-ip 112.74.xx.xx
cluster-announce-port 6382
cluster-announce-bus-port 16382 

剩下的redis3-6.conf以此类推 

第二步:集群启动

 cd /usr/local/redis/bin

./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 112.74.97.xxxx:6381 112.74.97.xxx:6382 112.74.97.xxx:6383 112.74.97.xxx:6384 112.74.97.xxx:6385 112.74.97.xxx:6386 --cluster-replicas 1

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

./redis-cli -a 123456 --cluster check 112.74.97.xxx:6381

 到这集群就搭建完毕啦~Redis6的集群搭建比之前4的时候搭建速度快多了,一行命令就结束了

四、Redis6.X节点高可用之Cluster集群读写命令

集群方式连接上客户端 cd /usr/local/redis/bin

./redis-cli -c -a 123456 -p 6381

然后测试集群读写命令set/get

key哈希运算计算槽位置
槽在当前节点的话直接插入/读取,否则自动转向到对应的节点

 流程解析:

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

 五、Cluster集群整合SpringBoot2.X

连接池的添加:

       org.apache.commons      commons-pool2    

配置文件(注释Sentinel相关配置):

 cluster:
    #命名的最多转发次数
      max-redirects: 3
      nodes:     112.74.97.xxx:6381,112.74.97.xxx:6382,112.74.97.xxx:6383,112.74.97.xxx:6384,112.74.97.xxx:6385,112.74.97.xxx:6386

 这样配置好后重启项目,就跟单节点的时候使用方式一样啦

六、Cluster集群故障自动转移

   转移的流程:
     kill掉主节点
    从节点成为新的master节点

主节点6381下线

 从节点 6384上线

 原先6381.2.3是主,6384.5.6是从

现在 6381shutdown下线了。 6382.3.4是主。6385.6是从节点。从节点6384成了新的master节点

 高可用架构总结:

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

Redis相关高频面试题以及高可用的文章:

这样做几步才可以最大化的保证Redis6.X高可用(主从、哨兵)_这是王姑娘的微博的博客-CSDN博客

分布式缓存Redis击穿、雪崩、穿透面试题+SpringCache解决方案_这是王姑娘的微博的博客-CSDN博客

分布式缓存Redis6.x持久化配置实战-AOF和RDB_这是王姑娘的微博的博客-CSDN博客 

 Redis6.X服务端config和key淘汰算法_这是王姑娘的微博的博客-CSDN博客