博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis 高可用主从+哨兵模式配置以及整合springboot使用
阅读量:4026 次
发布时间:2019-05-24

本文共 5748 字,大约阅读时间需要 19 分钟。

首先准备三台redis服务。高可用基本上都是选用大于3台服务

先设置主从关系:

先选用一个节点为主节点。我这里用6380作为主。在其他两个服务redis.conf中增加slaveof 127.0.0.1:6380

因为是要做哨兵模式。所以每个节点都要设置可以写。在三个服务中redis.conf更改 slave-read-only为no。

并且找到masterauth XXXXX 修改。这个密码主节点的密码。最好对于这三个redis服务密码都设置一样。

这样主从就搞好了。接下来做哨兵

在三个redis服务中增加这个文件

sentinel.conf这样配置 每个文件的端口需要自行更改

====================================================================

port 26370 #

bind 0.0.0.0
# 禁止保护模式
protected-mode no
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel myid 4bb87fdc9adb28a64463d734ef7afee092fad9bb
# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
# sentinel auth-pass <master-name> <password>
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 7000
# Generated by CONFIG REWRITE
sentinel failover-timeout mymaster 15000
sentinel auth-pass mymaster root123456abc
sentinel known-slave mymaster 127.0.0.1 6379
sentinel known-slave mymaster 127.0.0.1 6370

daemonize yes  #守护进程

 

=======================================================================================

配置好后。如果启动。关掉其中主服务。有的不会自动切换。在redis.conf和sentinel.con 修改bind 0.0.0.0 和protected-mode no

然后就是把服务启动。

redis服务启动命令 :redis-server.exe redis.windows.conf

哨兵启动命令:redis-server.exe sentinel.conf --sentinel

关掉redis主服务。就会看到哨兵会自动切换。但是切换会有点几秒的延迟。 

 

接下来就是springboot整合了在yml中增加redis配置

第一步:

spring:

  redis:
    host: localhost # Redis服务器地址
    database: 0 # Redis数据库索引(默认为0)
    port: 6379 # Redis服务器连接端口
    password: root123456abc # Redis服务器连接密码(默认为空)
    jedis:
      pool:
        max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
        max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-idle: 8 # 连接池中的最大空闲连接
        min-idle: 0 # 连接池中的最小空闲连接
    timeout: 10000
    sentinel:
      master: mymaster
      nodes: localhost:26379,localhost:26380,localhost:26370

 

第二步增加此类

 

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.connection.RedisNode;import org.springframework.data.redis.connection.RedisSentinelConfiguration;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.serializer.StringRedisSerializer;import redis.clients.jedis.JedisPoolConfig;import java.net.UnknownHostException;@Configurationpublic class RedisSentinelConfig extends CachingConfigurerSupport {    @Value("${spring.redis.host}")    private String host;    @Value("${spring.redis.port}")    private int port;    @Value("${spring.redis.timeout}")    private int timeout;    @Value("${spring.redis.database}")    private int database;    @Value("${spring.redis.password}")    private String password;    @Value("${spring.redis.sentinel.nodes}")    private String redisNodes;    @Value("${spring.redis.sentinel.master}")    private String master;    //redis哨兵配置    @Bean    public RedisSentinelConfiguration redisSentinelConfiguration(){        RedisSentinelConfiguration configuration = new RedisSentinelConfiguration();        String[] host = redisNodes.split(",");        for(String redisHost : host){            String[] item = redisHost.split(":");            String ip = item[0];            String port = item[1];            configuration.addSentinel(new RedisNode(ip, Integer.parseInt(port)));        }        configuration.setMaster(master);        configuration.setPassword("root123456abc");        return configuration;    }    @Bean    @ConfigurationProperties(prefix = "redis.jedis")    public JedisPoolConfig jedisPoolConfig1(){        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();        jedisPoolConfig.setTestOnBorrow(true);        return jedisPoolConfig;    }    //连接redis的工厂类    @Autowired    private JedisPoolConfig jedisPoolConfig;    @Autowired    private RedisSentinelConfiguration redisSentinelConfiguration;    @Bean    public JedisConnectionFactory jedisConnectionFactory() {        JedisConnectionFactory jedisConnectionFactory =                new JedisConnectionFactory(redisSentinelConfiguration, jedisPoolConfig);        return jedisConnectionFactory;    }    //配置RedisTemplate,设置添加序列化器,key 使用string序列化器,value 使用Json序列化器,还有一种简答的设置方式,改变defaultSerializer对象的实现。    @Autowired    private JedisConnectionFactory jedisConnectionFactory;    @Bean    public RedisTemplate
redisTemplate() { //StringRedisTemplate的构造方法中默认设置了stringSerializer RedisTemplate
template = new RedisTemplate<>(); //设置开启事务 template.setEnableTransactionSupport(true); //set key serializer StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); template.setKeySerializer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template.setConnectionFactory(jedisConnectionFactory()); template.afterPropertiesSet(); return template; } @Bean @ConditionalOnMissingBean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { StringRedisTemplate template = new StringRedisTemplate(); template.setEnableTransactionSupport(true); template.setConnectionFactory(redisConnectionFactory); return template; }}

这样就大功告成了。实现了高可用。

转载地址:http://elvbi.baihongyu.com/

你可能感兴趣的文章
JavaScript的一些基础-数据类型
查看>>
JavaScript基础知识(2)
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>
关于activity保存页面状态的两个方法
查看>>
android中对于非属性动画的整理
查看>>
一个简单的TabLayout的使用
查看>>
关于let{a}=B出现的解构赋值
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>
android给文字加边框(修改不能居中的问题)
查看>>
coursesa课程 Python 3 programming course_2_assessment_1
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
coursesa课程 Python 3 programming Dictionary methods 字典的方法
查看>>
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>
coursesa课程 Python 3 programming Tuple Assignment with Unpacking
查看>>
coursesa课程 Python 3 programming The while Statement
查看>>
course_2_assessment_6
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>