本文最后更新于 2023-12-11,文章内容可能已经过时,请注意内容的辨别。

redis集群

集群模式

作用

集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。

集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。

集群的作用,可以归纳为两点:

1、数据分区:数据分区(或称数据分片)是集群最核心的功能。

集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。

Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出……。

2、高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。

关键字

分区 扩容 故障转移

搭建步骤

1.明确集群需要的实例端口 80 81 82 83 84 85 86 87 88

80-8182主从

83-8485主从

86-8788主从

无效明确,因为我们集群不主动去配置他的主从关系,而是交到我们redis本身去配置他的主从关系

2.删除rdb和aof文件

3.复制出多个redis配置文件更改配置信息,先配置一个,然后再复制

1).daemonize yes

2).修改pid文件名

3).指定端口号

4).修改log文件名字

5).修改dump文件名字

6).cluster-enabled yes 打开集群模式

7).cluster-config-file nodes-6380.conf 设定节点配置文件名

8.)cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。

4.复制出另外8个文件,然后vim进去输入

:%s/6380/6381  //意思就是将文中所有的6379变成6380

5.按照redis文件启动9个服务

./redis-server ../redis-cluster-80.conf
.........

6.合并成集群

./redis-cli --cluster create  xxx:6380 xxx:6381 xxx:6382 xxx:6383 xxx:6384 xxx:6385 xxx:6386 xxx:6387 xxx:6388 --cluster-replicas  2 
//replicas 2 配置集群,一台主机,二台从机,正好三组。如果是云服务器最好不要用外网地址,用127.0.0.1,不然会出现故障转移失败的问题,如果你是本机的虚拟机就是这个操作,云服务器要考虑相关的内存大小和网络通信问题
​
[WARNING] Some slaves are in the same host as their master就对了,他在问你是不是要接受这样的主从分配 然后记住他给你分配的主节点 然后把这些节点端口都开开,在运行如上的命令再  输入yes回车就完事了  一定要输入yes  输入y是不行的
你还要把集群总线给暴露出来 就是你redis主机端口前面再加个1  比如说 6380 前面加个1 就是16380,要把这个端口暴露
總共要開的端口 如下
26380/tcp 6380/tcp 6381/tcp 6382/tcp 26379/tcp 6383/tcp 6384/tcp 6385/tcp 6386/tcp 6387/tcp 6388/tcp 16380/tcp 16381/tcp 16382/tcp
如果出现故障转移失败的现象,注意总线端口是否打开,比如说16380-16388都要开开
26380/tcp 6380/tcp 6381/tcp 6382/tcp 26379/tcp 6383/tcp 6384/tcp 6385/tcp 6386/tcp 6387/tcp 6388/tcp 16380/tcp 16381/tcp 16382/tcp 16383/tcp 16384/tcp 16385/tcp 16386/tcp 16387/tcp 16388/tcp
输出All 16384 slots covered.就行了

7.登录

redis-cli -p
这种方式不推荐使用,既然用了集群就要用集群的方式,用这种方式可能会出现error,(会出现MOVED重定向操作)
redis-cli -c -p
这种事真正集群使用的连接操作,他会切换到相应的主机
​

8.查看集群信息

cluster nodes

分配原则

一个集群至少要有三个主节点。

选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

插槽

我们在之前会看到一个 All 16384 slots covered这个样的一个信息

这个其实就是告诉我们一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个,

集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。

集群中的每个节点负责处理一部分插槽。

举个例子, 如果一个集群可以有主节点, 其中:

节点 A 负责处理 0 号至 5460 号插槽。

节点 B 负责处理 5461 号至 10922 号插槽。

节点 C 负责处理 10923 号至 16383 号插槽。

集群插入值

在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。

redis-cli客户端提供了 –c 参数实现自动重定向。

如 redis-cli -c –p 6379 登入后,再录入、查询键值对可以自动重定向。

故障恢复

主节点下线,过一会你就能看到从机变成了主机了,后面主机回来了,他就变成从机了

Redis集群的不足

多键操作是不被支持的(mset mget 原因就是插槽的问题)

由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。但是随着时间的推移,这个不足将会慢慢褪去

springboot连接redis集群

就改配置文件

spring:
  redis:
    timeout: 30000
    lettuce:
      pool:
        max-active: 256
        max-idle: 64
        max-wait: 30000
        min-idle: 32
    cluster:
      max-redirects: 3  # 获取失败 最大重定向次数
      nodes:
        - xxx:6380
        - xxx:6381
        - xxx:6382
        - xxx:6383
        - xxx3:6384
        - xxx:6385
        - xxx:6386
        - xxx:6387
        - xxx:6388
​
server:
  port: 8080
package s309.redisdemo1;
​
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import s309.redisdemo1.until.RedisUtils;
​
@SpringBootTest
class Redisdemo1ApplicationTests {
​
​
    @Autowired
    private RedisUtils redisUtil;
​
    @Test
    void contextLoads() {
        redisUtil.set("ssfdsf", "addsc");
        System.out.println(redisUtil.get("ssfdsf"));
    }
​
}
​