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

 更新时间:2020年04月22日 14:10:37   作者:小小学生爱读书  
这篇文章主要介绍了SpringBoot结合Redis哨兵模式的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Redis哨兵模式

Redis Sentinel介绍

Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。

Redis Sentinel主要功能

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

  • 监控(Monitoring):Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

Redis Sentinel部署

Redis集群配置

Redis集群启动

复制3个reids.conf配置文件

cp redis.conf /home/redis/redis6379.conf
cp redis.conf /home/redis/redis6380.conf
cp redis.conf /home/redis/redis6381.conf

修改reids.conf配置文件,以6379配置为例

vim redis6379.conf
#启用后台启动
daemonize yes
#pidfile位置
pidfile "/home/redis/6379/redis6379.pid"
#端口
port 6379
#日志文件位置
logfile "/home/redis/6379/log6379.log"
#rdb备份文件名称
dbfilename "dump6379.rdb"
#rdb备份文件路径
dir "/home/redis/rdb/"

修改redis-slave配置文件,修改和master如上配置,6380、6381配置文件,新增如下

slaveof 192.168.126.200 6379

先启动master服务,在启动slave服务

master节点服务
./redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.126.200,port=6380,state=online,offset=975350,lag=1
slave1:ip=192.168.126.200,port=6381,state=online,offset=975350,lag=1
master_repl_offset:975495
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:975494

slave节点服务
./redis-cli -p 6380
# Replication
role:slave
master_host:192.168.126.200
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:989499
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

sentinel集群配置

编写sentinel配置文件,master配置

touch sentinel1.conf

vim sentinel1.conf
#Sentinel节点的端口
port 26379
dir "/home/redis/sentinel"
daemonize yes
logfile "sentinel-26379.log"

#当前Sentinel节点监控 127.0.0.1:6379 这个主节点
#代表判断主节点失败至少需要2个Sentinel节点节点同意
#mymaster是主节点的别名
sentinel monitor mymaster 192.168.126.200 6380 2

#每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒且没有回复,则判定不可达
sentinel down-after-milliseconds mymaster 30000

#当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向>新的主节点发起复制操作的从节点个数为1
sentinel leader-epoch mymaster 1

#故障转移超时时间为180000毫秒
sentinel failover-timeout mymaster 180000

#同理创建修改sentinel2.conf、sentinel3.conf配置文件

启动3台sentinel服务

./redis-sentinel /home/redis/sentinel1.conf
./redis-sentinel /home/redis/sentinel2.conf
./redis-sentinel /home/redis/sentinel3.conf

SpringBoot结合Redis哨兵模式

创建SpringBoot项目,添加依赖

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
</dependency>
<!--redis连接池-->
<dependency>
 <groupId>org.apache.commons</groupId>
 <artifactId>commons-pool2</artifactId>
</dependency>

核心配置文件application.yml

server:
 port: 80

spring:
 redis:
 lettuce:
  pool:
  # 连接池最大连接数(使用负值表示没有限制) 默认为8
  max-active: 8
  # 连接池中的最大空闲连接 默认为8
  max-idle: 8
  # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认为-1
  max-wait: -1ms
  # 连接池中的最小空闲连接 默认为 0
  min-idle: 0
 sentinel:
  # 主节点的别名
  master: mymaster
  # sentinel服务的ip和端口
  nodes: 192.168.126.200:26379,192.168.126.200:26380,192.168.126.200:26381

程序调用

@RestController
@RequestMapping("/redis")
public class RedisController {

 // 使用SpringBoot封装的RestTemplate对象
 @Autowired
 RedisTemplate<String, String> redisTemplate;

 @RequestMapping("/get")
 public String get(String key) {
  String value = redisTemplate.opsForValue().get(key);
  return value;
 }

 @RequestMapping("/set")
 public String set(String key, String value) {
  redisTemplate.opsForValue().set(key, value);
  return "success";
 }
}

模拟故障

手动shutdown redis的master服务后,后台会尝试重连,当超过最大等待时间,无法连接后,sentinel会重新选举出一个新的master,程序获取到新的master节点,提供读写服务

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

相关文章

  • log4j2 项目日志组件的实例代码

    log4j2 项目日志组件的实例代码

    下面小编就为大家分享一篇log4j2 项目日志组件的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Spring零基础入门IOC

    Spring零基础入门IOC

    IoC就是比方说有一个类,我们想要调用类里面的方法(不是静态方法),就要创建该类的对象,使用对象调用方法来实现。但对于Spring来说,Spring创建对象的过程,不是在代码里面实现的,而是交给Spring来进行配置实现的
    2022-08-08
  • Java利用自定义注解、反射实现简单BaseDao实例

    Java利用自定义注解、反射实现简单BaseDao实例

    下面小编就为大家带来一篇Java利用自定义注解、反射实现简单BaseDao实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • IDEA报错:无效的源发行版解决方案

    IDEA报错:无效的源发行版解决方案

    很多小伙伴在刷新maven的时候总会报 Error:java:无效的源发行版,下面这篇文章主要给大家介绍了关于IDEA报错:无效的源发行版的解决方案,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • IntelliJ IDEA将导入的项目转成maven项目

    IntelliJ IDEA将导入的项目转成maven项目

    这篇文章主要介绍了IntelliJ IDEA将导入的项目转成maven项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 提示:Decompiled.class file,bytecode version如何解决

    提示:Decompiled.class file,bytecode version如何解决

    在处理Decompiled.classfile和bytecodeversion问题时,通过修改Maven配置文件,添加阿里云镜像并去掉默认镜像,解决了下载源的问题,同时,检查并修改了依赖版本,确保了问题的解决
    2024-12-12
  • Java HashTable的原理与实现

    Java HashTable的原理与实现

    Java中的HashTable是一种线程安全的哈希表实现,它可以高效地存储和快速查找数据,本文将介绍Java中的HashTable的实现原理、常用方法和测试用例,需要的小伙伴可以参考一下
    2023-09-09
  • springBoot整合RocketMQ及坑的示例代码

    springBoot整合RocketMQ及坑的示例代码

    这篇文章主要介绍了springBoot整合RocketMQ及坑的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 基于java中反射的总结分析

    基于java中反射的总结分析

    所谓反射,就是根据一个已经实例化了的对象来还原类的完整信息
    至少对我而言,我认为它带给我的好处是,让我从下往上的又了解了一遍面向对象

    2013-05-05
  • SpringBoot中RabbitMQ集群的搭建详解

    SpringBoot中RabbitMQ集群的搭建详解

    单个的 RabbitMQ 肯定无法实现高可用,要想高可用,还得上集群。这篇文章主要介绍了SpringBoot中RabbitMQ集群的两种模式的搭建:普通集群搭建和镜像集群搭建,需要的朋友可以参考一下
    2021-12-12

最新评论