SpringBoot+Redis哨兵模式的实现

最近学习到了Redis的哨兵模式,光看视频还不行,需要自己动手实现一遍才能加深映像,特此记录。

由于没有真实的服务器可以供我操作,所以在虚拟机上启动了3个redis服务,分别占用7001、7002、7003端口。

Redis下载安装不多赘述,只在这里记录一下配置。

首先在tmp目录下创建3个文件夹:

cd /tmp
mkdir 7001 7002 7003

然后将redis的配置文件redis.conf拷贝到刚刚创建的3个文件夹下

cp redis-6.2.6/redis.conf /tmp/7001
cp redis-6.2.6/redis.conf /tmp/7002
cp redis-6.2.6/redis.conf /tmp/7003

接着修改这3个配置文件

vi redise.conf

找到端口,redis默认端口是6379,这里分别将端口改为7001、7002和7003

然后修改dir,redis持久化文件保存的路径,分别改为对应的路径

接着注释掉bind并且修改protected-mode为no

redis默认不允许远程连接,修改这2项配置允许我们远程连接

最后在配置文件第一行加上 replica-announce-ip  #{ip}

注意:这里#{ip}填自己的ip地址

由于是在虚拟机安装的redis,会有多个ip,这里写明ip防止找不到

3个配置文件都改完后,cd 到对应的目录启动redis

3个服务都启动后,连接7002的redis

redis-cli -p 7002

输入命令,搭建主从集群,让7002成为7001的从节点

REPLICAOF #{ip} 7001

注意:这里#{ip}填自己的ip地址

同理,7003也这样操作一遍,这样就搭建好了以7001为主节点,7002和7003位从节点的主从集群模式。

需要注意的是,以命令形式搭建的主从集群,重启后就失效了,想要持久保持可以在配置文件里配置,这里从简就不贴了。

上述操作完成后,接着在tmp目录下创建3个新文件夹

mkdir s1 s2 s3

cd到s1目录,创建文件sentinel.conf,这个文件也可以从redis的目录中拷贝。

编写文件配置

# sentinel端口
port 27001
#工作路径
dir "/tmp/s1"
# 哨兵监控的master,主从配置一样,在进行主从切换时7001会变成当前的master端口,最后的2为客观判断主节# 点下线的节点个数
sentinel monitor mymaster #{ip} 7001 2
# master或slave多长时间不能使用后标记为s_down状态
sentinel down-after-milliseconds mymaster 5000
#若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),
#则认为本次failover失败
sentinel failover-timeout mymaster 60000

注意:这里#{ip}填自己的ip地址

然后将sentinel.conf文件cp到s2和s3路径下,只用修改port和dir为各自的配置

然后分别在各自路径下启动3个哨兵

redis-sentinel sentinel.conf

由于之前测试了7001关闭服务,哨兵自动切换主节点为7002了,若为第一次启动,日志和截图中的会稍有不同。

哨兵模式搭建好后,接着在Java端集成此模式

pom.xml引入最基本的依赖即可

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
     <exclusions><!-- 去掉springboot默认配置 -->
         <exclusion>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-logging</artifactId>
         </exclusion>
     </exclusions>
</dependency>
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.73</version>
</dependency>

application.xml

spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
        - #{ip}:27001
        - #{ip}:27002
        - #{ip}:27003

注意:这里#{ip}填自己的ip地址

在一个配置类里注入一个bean,实现redis读写分离,配置从redis读数据时优先从从节点读取

package com.wl.demo.config;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import io.lettuce.core.ReadFrom;
import org.springframework.boot.autoconfigure.data.redis.LettuceClientConfigurationBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author wl
 * @date 2022/3/28
 */
@Configuration
public class RedisConfig {

    @Bean
    public LettuceClientConfigurationBuilderCustomizer lettuceClientConfigurationBuilderCustomizer() {
        return builder -> builder.readFrom(ReadFrom.REPLICA_PREFERRED);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);

        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
        FastJsonConfig fastJsonConfig = fastJsonRedisSerializer.getFastJsonConfig();
        SerializerFeature[] serializerFeatures = new SerializerFeature[] {SerializerFeature.WriteDateUseDateFormat, SerializerFeature.WriteMapNullValue};
        fastJsonConfig.setSerializerFeatures(serializerFeatures);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
        redisTemplate.setValueSerializer(fastJsonRedisSerializer);
        redisTemplate.setEnableTransactionSupport(true);

        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }
}

编写一个测试接口

package com.wl.demo.controller;

import com.wl.demo.common.result.HttpResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author wl
 * @date 2022/4/14
 */
@RestController
public class TestController {

    private final StringRedisTemplate stringRedisTemplate;

    @Autowired
    public TestController(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    @GetMapping("/set/{key}/{value}")
    public HttpResult setValue(@PathVariable("key") String key, @PathVariable("value") String value) {
        stringRedisTemplate.opsForValue().set(key, value);
        return HttpResult.success();
    }

    @GetMapping("/get/{key}")
    public HttpResult getValue(@PathVariable("key") String key) {
        return HttpResult.success(stringRedisTemplate.opsForValue().get(key));
    }
}

启动springboot,调用set接口

查看redis

7002主节点有值了,并且它的从节点也同步到了数据

然后调用get接口

数据也成功获取到了

最后测试一下哨兵自动切换主从节点,这里关闭7002的redis

接着查看27002哨兵打印的日志

从日志中可以看到关闭7002的redis后,哨兵自动将主节点切换到了7001的redis

现在启动7002的redis

查看哨兵27001的日志

可以发现由将7002加入到了自己的从节点中

自此,Redis哨兵模式的简单搭建就完成了

到此这篇关于SpringBoot+Redis哨兵模式的实现示例的文章就介绍到这了,更多相关SpringBoot Redis哨兵模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot结合Redis哨兵模式的实现示例

    Redis哨兵模式 Redis Sentinel介绍 Redis Sentinel是Redis高可用的实现方案.Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控.通知.自动故障转移. Redis Sentinel主要功能 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring):Sentinel 会不断地检查你的主服务器和从服务器是否运作正常. 提醒(Notificatio

  • Springboot Redis 哨兵模式的实现示例

    目录 Redis配置 redis.conf配置 sentinel.conf配置 Springboot整合 测试 模拟redis宕机 Redis配置 redis.conf配置 由于服务器资源有限,我这里通过配置不同端口,模拟Redis集群,redis-server占用6379.6380.6381端口,redis-sentinel占用26379.26380.26381端口. 首先准备3份redis配置文件,分别取名redis6379.conf,redis6380.conf,redis6381.con

  • SpringBoot+Redis哨兵模式的实现

    最近学习到了Redis的哨兵模式,光看视频还不行,需要自己动手实现一遍才能加深映像,特此记录. 由于没有真实的服务器可以供我操作,所以在虚拟机上启动了3个redis服务,分别占用7001.7002.7003端口. Redis下载安装不多赘述,只在这里记录一下配置. 首先在tmp目录下创建3个文件夹: cd /tmp mkdir 7001 7002 7003 然后将redis的配置文件redis.conf拷贝到刚刚创建的3个文件夹下 cp redis-6.2.6/redis.conf /tmp/7

  • 浅谈Redis哨兵模式高可用解决方案

    目录 一.序言 1.目标与收获 2.端口规划 二.单机模拟 (一)服务规划 1.Redis实例 2.哨兵服务 (二)服务配置 1.Redis实例 2.哨兵服务 (三)服务管理 1.Redis实例 2.哨兵服务 三.客户端整合 (一)基础整合 1.全局配置文件 2.集成配置 (二)读写分离 一.序言 Redis高可用有两种模式:哨兵模式和集群模式,本文基于哨兵模式搭建一主两从三哨兵Redis高可用服务. 1.目标与收获 一主两从三哨兵Redis服务,基本能够满足中小型项目的高可用要求,使用Supe

  • 浅谈Redis哨兵模式的使用

    概述 主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工 干预,费事费力,还会造成一段时间内服务不可用.这不是一种推荐的方式,更多时候,我们优先考虑 哨兵模式.Redis从2.8开始正式提供了Sentinel(哨兵) 架构来解决这个问题. 谋朝篡位的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库. 哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独 立运行.其原理是哨兵通过发送命令,

  • Docker配置redis哨兵模式的方法(多服务器上)

    前言 之前学习的redis一直是在单一服务器上运行的,而且是直接部署在服务器上.听说用docker会让配置过程更轻松 (并没有)这次就在用Docker的基础上配置Redis一主一从三哨兵.本篇为配置数据节点,即一主一从两个节点. 条件 三台服务器(因为需要至少三个哨兵保证安全性)[可以在阿里云上租几个小时] 服务器1:8.131.78.18 服务器2:8.131.69.106 服务器3:8.131.71.196 端口号7000.17000已在安全组上放行(阿里云) 环境:centos8.0 安装

  • Redis哨兵模式介绍

    哨兵简介 主机"宕机" 将宕机的 master 下线 找一个 slave 作为 master 通知所有的 slave 连接新的 master 启动新的 master 和 slave 全量复制 *N+ 部分复制*N 存在的问题: 谁来确认 master 宕机了 重新找一个新的 master ,怎么找法? 修改配置后,原来的 master 恢复了怎么办? 哨兵 哨兵(sentinal)是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 master 并

  • Redis哨兵模式实现一主二从三哨兵

    目录 一.redis环境: 二.哨兵介绍: 三.安装redis: 四.使用Redis主从复制的作用: 五.配置redis一主二从: 六.配置redis三哨兵: 一.redis环境: 环境:redis6.2.6linux虚拟机一台,contos7: 二.哨兵介绍: 1.一主二从三哨兵理论图: 一主两从三哨兵集群,当master节点宕机时,通过哨兵(sentinel)重新推选出新的master节点,保证集群的可用性. 2.哨兵的主要功能:1.集群监控:负责监控 Redis master 和 slav

  • redis哨兵模式说明与搭建详解

    哨兵模式是redis高可用的一种解决方案. 哨兵必须用三个实例取保证自己的高可用,但是哨兵+主从模式是不能保证消息不丢失的. 为什么用三个来保证呢? 假设现在有两个服务器,第一台有redis主节点M1,和哨兵S1,第二台有redis从节点S2,哨兵S2. 如果M1宕机,S1和S2中只要有1个哨兵认为master宕机就可以还行切换,此时哨兵大多数(我理解的大多数的过半)还在运行,那么S1,S2能通过选举,拿出来一个哨兵进行故障转移. 如果第一个服务器整个宕机,M1,S1都已经死掉了,此时S2发现M

  • Redis Sentinel实现哨兵模式搭建小结

    Redis哨兵模式,用现在流行的话可以说就是一个"哨兵机器人",给"哨兵机器人"进行相应的配置之后,这个"机器人"可以7*24小时工作,它能能够自动帮助你做一些事情,如监控,提醒,自动处理故障等. Redis-sentinel简介 Redis-sentinel是Redis的作者antirez,因为Redis集群的被各大公司使用,每个公司要写自己的集群管理工具,于是antirez花了几个星期写出了Redis-sentinel. Redis 的 Se

随机推荐