• Springboot 整合 Redis Cluster 集群实战详解


    前言

    Redis Sentinel安装与部署,实现redis的高可用实现了redis的高可用,针对的主要是master宕机的情况,我们发现所有节点的数据都是一样的,那么一旦数据量过大,redis也会效率下降的问题。redis3.0版本正式推出后,有效地解决了Redis分布式方面的需求,当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构方法达到负载均衡的目的。

    准备工作

    1、官网下载 Redis:http://www.redis.cn/download.html
    2、准备 Linux 环境:Centos 7
    3、Linux 服务器的 IP:可以通过 ifconfig 查询(此处很重要,避免踩坑
    4、建议 Redis CLuster 结构目录如下

    - redis-cluster
    	# redis 安装目录
    	- redis 
    	# redis 节点配置文件
    	- conf
    	# redis log日志文件
    	- logs
    	# redis 持久化文件、集群配置文件
    	- data
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Redis 集群环境搭建

    注意:集群操作可以使用 ./redis-cli --cluster help 指令查看集群命令的使用说明

    1、节点准备

    Redis 集群的节点,通常是三个 master 以上节点,每个 master 节点至少有一个 slave 节点。

    由于本文采用同一台服务器完成集群的演示,所以节点如下(注意 ip 地址为自己服务器地址,端口自行定义

    192.168.211.158:6382 
    192.168.211.158:6383
    192.168.211.158:6384 
    192.168.211.158:6385
    192.168.211.158:6386
    192.168.211.158:6387
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、节点(192.168.211.158:6382 )配置文件:redis-6382.conf,一共 6 个节点,注意:其余节点只是端口号不同

    # 节点端口
    port 6382
    # 注释绑定127.0.0.1
    # bind 127.0.0.1
    # 关闭保护模式
    protected-mode no
    requirepass "myredis"
    # 设置 redis 后台运行
    daemonize yes
    # 设置 redis 运行的日志文件,自定义
    logfile "/redis-cluster/logs/6382.log"
    # 设置 redis 持久化文件名称,名称自定义,后缀为:.rdb
    dbfilename "dump-6382.rdb"
    # 持久化目录,这个目录保存的是:dbfilename、cluster-config-file 对应的文件
    dir "/redis-cluster/data"
    
    # master 节点登录密码
    masterauth "myredis"
    # 开启集群
    cluster-enabled yes
    cluster-node-timeout 15000
    # 集群配置文件,自行生成,名称自定义
    cluster-config-file "nodes-6382.conf"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3、启动如上配置的全部节点

    ./redis/src/redis-server conf/redis-6382.conf 
    ./redis/src/redis-server conf/redis-6383.conf 
    ./redis/src/redis-server conf/redis-6384.conf 
    ./redis/src/redis-server conf/redis-6385.conf 
    ./redis/src/redis-server conf/redis-6386.conf 
    ./redis/src/redis-server conf/redis-6387.conf 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4、检查检点是否全部启动成功:ps -ef|grep redis
    在这里插入图片描述

    5、创建 Redis Cluster 集群

    # --cluster-replicas 1 表示创建自动创建并给每个 master 节点分配一个 slave 节点
    # -a myredis 表示验证密码
    ./redis/src/redis-cli --cluster create 192.168.211.158:6382 192.168.211.158:6383 192.168.211.158:6384 192.168.211.158:6385 192.168.211.158:6386 192.168.211.158:6387 --cluster-replicas 1 -a myredis
    
    • 1
    • 2
    • 3

    6、检测集群节点是否成功:./redis/src/redis-cli --cluster check 192.168.211.158:6382 -a myredis

    在这里插入图片描述
     [OK] All 16384 slots covered.表示集群所有的槽都已分配到节点。其中 key 是均匀分布在各个槽范围的。
     在这里插入图片描述
    7、Redis 集群的操作

    # -c 表示集群支持,支持自动重定向
    ./redis/src/redis-cli -h 192.168.211.158 -p 6382 -a myredis -c
    
    • 1
    • 2

    Redis 集群故障转移(主从复制)

    通过关闭某个集群节点的 master 节点,slave 节点会切换成 master 代替故障节点完成其工作。

    Redis 集群扩展与收缩节点

    集群一共有 16384 slots(槽)数量。

    Redis 集群扩展节点(添加节点)

    1、新建 192.168.211.158:6388、192.168.211.158:6389 两个节点的配置文件,分别为:redis-6388.conf、redis-6389.conf,配置同上。

    # 节点端口
    port 6388
    # 注释绑定127.0.0.1
    # bind 127.0.0.1
    # 关闭保护模式
    protected-mode no
    requirepass "myredis"
    # 设置 redis 后台运行
    daemonize yes
    # 设置 redis 运行的日志文件,自定义
    logfile "/redis-cluster/logs/6388.log"
    # 设置 redis 持久化文件名称,名称自定义,后缀为:.rdb
    dbfilename "dump-6388.rdb"
    # 持久化目录,这个目录保存的是:dbfilename、cluster-config-file 对应的文件
    dir "/redis-cluster/data"
    
    # master 节点登录密码
    masterauth "myredis"
    # 开启集群
    cluster-enabled yes
    cluster-node-timeout 15000
    # 集群配置文件,自行生成,名称自定义
    cluster-config-file "nodes-6388.conf"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2、启动两个节点

    ./redis/src/redis-server conf/redis-6388.conf 
    ./redis/src/redis-server conf/redis-6389.conf
    
    • 1
    • 2

    3、添加节点

    ./redis/src/redis-cli --cluster add-node 192.168.211.158:6388 192.168.211.158:6382 -a myredis
    
    • 1

    在这里插入图片描述
    4、将 6389 添加成 6388 的从节点
    (1)查询节点 6388 的节点 id(node-id)M:abc8c97b1afb9982decace890c97653d00d10871

    ./redis/src/redis-cli  --cluster check 192.168.211.158:6388 -a myredis
    
    • 1

    (2)将 6389 添加成 6388 的从节点

    ./redis/src/redis-cli --cluster add-node --cluster-master-id abc8c97b1afb9982decace890c97653d00d10871 --cluster-slave 192.168.211.158:6389 192.168.211.158:6382 -a myredis
    
    • 1

    5、给 192.168.211.158:6388 分槽,大小为:4096

    ./redis/src/redis-cli --cluster reshard 192.168.211.158:6382 -a myredis
    
    • 1

    (1)将大小为 4096 的槽分配给指定节点:6388(master
    (2)使用 all 指令结尾,将各个槽的空间分配一部分到节点 6388。也可以使用指定的其他 master 节点id,分配大小为 4096 槽给 6388 。
    在这里插入图片描述

    Redis 集群收缩节点(移除节点)

    1、首先要将被移除节点的槽分配出去,保证该槽大小为 0。还是使用指令。

    ./redis/src/redis-cli --cluster reshard 192.168.211.158:6382 -a myredis
    
    • 1

    2、移除节点

    ./redis/src/redis-cli  --cluster del-node 192.168.211.158:6388 abc8c97b1afb9982decace890c97653d00d10871
    
    • 1

    Springboot 整合 Redis 集群

    1、集群配置如上,已经配置好
    2、引入 pom 依赖

    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-redisartifactId>
    dependency>
    <dependency>
        <groupId>redis.clientsgroupId>
        <artifactId>jedisartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3、yml 配置文件

    server:
      port: 86379
    
    spring:
      redis:
        cluster:
          # 集群节点
          nodes: 192.168.211.158:6382,192.168.211.158:6383,192.168.211.158:6384,192.168.211.158:6385,192.168.211.158:6386,192.168.211.158:6387
          # 最大重定向次数
          max-redirects: 5
        # 密码
        password: myredis
        lettuce:
          pool:
            min-idle: 0
            max-active: 8
            max-wait: -1
            max-idle: 8
            enabled: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4、RedisConfig配置文件

    @Configuration
    @EnableCaching
    @Slf4j
    public class RedisConfig extends CachingConfigurerSupport {
    
        @Bean
        @SuppressWarnings(value = {"unchecked", "rawtypes"})
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
            RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(connectionFactory);
            Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
            ObjectMapper mapper = new ObjectMapper();
            mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
            serializer.setObjectMapper(mapper);
    
            // 使用StringRedisSerializer来序列化和反序列化redis的key值
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setValueSerializer(serializer);
    
            // Hash的key也采用StringRedisSerializer的序列化方式
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(serializer);
            
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    5、RedisService 自定义
    6、测试

    @SpringBootTest(classes = RedisServiceApplication.class)
    public class Test_redis {
    
        @Autowired
        private RedisService redisService;
    
        @Test
        public void test(){
            redisService.setCacheObject("testkey","Hello world");
            Object value = redisService.getCacheObject("testkey");
            System.out.println("value = " + value);
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    JAVA-IO流
    工程数学笔记 | 傅里叶级数/变换的本质理解
    Java8和Java9新特性
    Vue中组件化编码使用(实战练习一)
    Linux命令(93)之su
    SSH配置免密登录
    QT+OSG/osgEarth编译之二十六:FontConfig+Qt编译(一套代码、一套框架,跨平台编译,版本:FontConfig-5.1.0)
    Mybatis 中 ResultHandler 的用法(获取大结果集,实现结果流式输出)
    Java中静态域和静态方法的一些梳理
    react面试题总结
  • 原文地址:https://blog.csdn.net/qq_36763419/article/details/126055960