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

 更新时间:2022年03月01日 10:03:42   作者:Java知识图谱  
Redis高可用有两种模式:哨兵模式和集群模式,本文基于哨兵模式搭建一主两从三哨兵Redis高可用服务,感兴趣的可以了解一下

一、序言

Redis高可用有两种模式:哨兵模式集群模式,本文基于哨兵模式搭建一主两从三哨兵Redis高可用服务。

1、目标与收获

一主两从三哨兵Redis服务,基本能够满足中小型项目的高可用要求,使用Supervisor监控并管理Redis实例。通过本文将完成如下目标:

  • 哨兵模式服务规划与搭建

哨兵模式服务相比于单机版服务更加可靠,适合读写分离、数据量不是很大、要求可靠稳定性的场景。

  • 客户端整合与读写分离

通过Spring框架对哨兵模式进行连接,完成生产环境的常见操作。

2、端口规划

端口规划是完成本方案的第一步。

二、单机模拟

单机模拟是指在单台物理机或者虚拟机上模拟操作,最大化还原本方案中间过程,适用于学习或者开发阶段使用。

为了简化操作,Redis服务做如下约定:数据不持久化到磁盘;服务实例以前台进程方式运行;节点的配置文件以默认配置文件为模版;无密码验证。

(一)服务规划

1、Redis实例

服务在第一次启动时明确知道第几个节点是master节点,当服务在长期运行并发生主从切换时,无法显示知道第几个节点是master节点,需要通过命令行间接查询。

节点主机端口角色额外配置
node01127.0.0.16380第一次启动时作为master服务 
node02127.0.0.16381第一次启动时作为slave服务replicaof 127.0.0.1 6380
node03127.0.0.16382第一次启动时作为slave服务replicaof 127.0.0.1 6380

额外配置指第一次启动Redis服务实例时,节点配置文件中新增配置。

2、哨兵服务

哨兵服务节点之间没有主从的区别,所有节点处于平等地位。当主服务异常时,哨兵服务之间会唤醒投票策略,从Redis实例从节点选择主服务的候选人。

节点主机端口额外配置
node01127.0.0.126380sentinel monitor mymaster 127.0.0.1 6380 2
node02127.0.0.126381sentinel monitor mymaster 127.0.0.1 6380 2
node03127.0.0.126382sentinel monitor mymaster 127.0.0.1 6380 2

(二)服务配置

1、Redis实例

节点的初始配置文件以默认配置文件为模版。

node01、node02初始化配置文件之后,显示指明节点间的主从关系,增加如下配置:

replicaof 127.0.0.1 6380

2、哨兵服务

节点的初始配置文件以默认配置文件为模版。

node01、node02、node03初始化配置文件后,增加如下配置:

sentinel monitor mymaster 127.0.0.1 6381 2

(三)服务管理

测试或者学习时,建议采用前台进程管理服务,便于模拟单点故障、查看日志观察主从切换。

生产条件下建议使用Supervisor管理服务,不仅易于管理而且能够实现服务异常终止后自动重启。高可用场景下使用的是三台物理机。

1、Redis实例

/usr/local/redis/bin/redis-server /usr/local/redis/conf/ms/redis80.conf --port 6380 --save '' --daemonize no 
/usr/local/redis/bin/redis-server /usr/local/redis/conf/ms/redis81.conf --port 6381 --save '' --daemonize no
/usr/local/redis/bin/redis-server /usr/local/redis/conf/ms/redis82.conf --port 6382 --save '' --daemonize no

2、哨兵服务

/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/ms/sentinel280.conf --port 26380 --daemonize no
/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/ms/sentinel281.conf --port 26381 --daemonize no
/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/ms/sentinel282.conf --port 26382 --daemonize no

三、客户端整合

客户端实现是指基于SpringBoot的整合分为两步实现:一是完成作为基础的整合;二是结合生产需要补充新特性。

(一)基础整合

基础整合的内容是以Java客户端连接高可用哨兵模式Redis服务,实现单节点故障服务正常运行的要求。

1、全局配置文件

全局配置文件添加的配置信息有:master参数为哨兵服务名,此处为默认值;nodes参数为哨兵服务列表(不是Redis实例服务列表);database参数为数据库。

spring:
  redis:
    database: 0
    sentinel:
      nodes: 192.168.181.171:26380,192.168.181.171:26381,192.168.181.171:26382
      master: mymaster

2、集成配置

集成进SpringBoot体系,最核心的是创建LettuceConnectionFactory连接工厂,通过Redis连接工厂,能够顺利继承进Spring体系下其他框架。

@Configuration
public class RedisSentinelConfig {
    @Autowired
    private RedisProperties redisProperties;
    
    @Bean
    public RedisConnectionFactory lettuceConnectionFactory() {
        RedisProperties.Sentinel sentinel = redisProperties.getSentinel();
        HashSet<String> nodes = new HashSet<>(sentinel.getNodes());
        String master = sentinel.getMaster();
        RedisSentinelConfiguration config = new RedisSentinelConfiguration(master, nodes);
        config.setDatabase(redisProperties.getDatabase());
        return new LettuceConnectionFactory(config);
    }
}

(二)读写分离

基础整合仅仅是实现了高可用Redis服务的流程,生产环境下仍需要增加其他配置:修改自定义连接数据库序号;授权连接;连接池配置;读写分离。

在高可用前提下,衍生出读写分离的特性,主库完成写请求;从库完成读请求(从库不允许写)。

@Bean
public LettuceClientConfigurationBuilderCustomizer lettuceClientCustomizer() {
    // 配置读写分离
    return builder -> builder.readFrom(ReadFrom.REPLICA);
}

 到此这篇关于浅谈Redis哨兵模式高可用解决方案的文章就介绍到这了,更多相关Redis哨兵模式高可用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot 开启Redis缓存及使用方法

    SpringBoot 开启Redis缓存及使用方法

    用redis做缓存,是因为redis有着很优秀的读写能力,在集群下可以保证数据的高可用,那么今天通过本文给大家讲解下SpringBoot使用Redis的缓存的方法,感兴趣的朋友一起看看吧
    2021-08-08
  • 基于Redis结合SpringBoot的秒杀案例详解

    基于Redis结合SpringBoot的秒杀案例详解

    这篇文章主要介绍了Redis结合SpringBoot的秒杀案例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Redis执行Lua脚本的好处与示例代码

    Redis执行Lua脚本的好处与示例代码

    Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。下面这篇文章主要给大家介绍了关于Redis执行Lua脚本的好处与示例代码,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-10-10
  • Redis不同数据类型的命令语句详解

    Redis不同数据类型的命令语句详解

    这篇文章主要介绍了Redis不同数据类型的命令语句,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • redis缓存预热的实现示例

    redis缓存预热的实现示例

    本文主要介绍了Java中实现缓存预热的多种策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • 浅谈Redis高并发缓存架构性能优化实战

    浅谈Redis高并发缓存架构性能优化实战

    本文主要介绍了浅谈Redis高并发缓存架构性能优化实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 浅谈一下Redis的数据结构

    浅谈一下Redis的数据结构

    这篇文章主要介绍了浅谈一下Redis的数据结构,简单字符串结构被用于存储redis的key对象和String类型的value对象,其中的free和len字段可以轻松的使得在该字符串被修改时判断是否需要扩容,需要的朋友可以参考下
    2023-08-08
  • Redis中的延迟双删

    Redis中的延迟双删

    这篇文章主要介绍了Redis中的延迟双删问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 手把手教你用Redis 实现点赞功能并且与数据库同步

    手把手教你用Redis 实现点赞功能并且与数据库同步

    本文主要介绍了Redis 实现点赞功能并且与数据库同步,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Redis教程(十一):虚拟内存介绍

    Redis教程(十一):虚拟内存介绍

    这篇文章主要介绍了Redis教程(十一):虚拟内存介绍,本文讲解了虚拟内存简介、应用场景和配置方法等内容,需要的朋友可以参考下
    2015-04-04

最新评论