Redis哨兵模式高可用的示例分析

    一、序言

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

    1、目标与收获

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

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

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

    • 客户端整合与读写分离

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

    2、端口规划

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

    Redis哨兵模式高可用的示例分析

    二、单机模拟

    单机模拟是在一台物理机或虚拟机上模拟操作,以尽可能还原本方案中间过程,通常用于学习或开发阶段。

    为了简化操作,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哨兵模式高可用的示例分析的详细内容,更多请关注其它相关文章!