Redis5.X主从哨兵模式搭建 + springboot整合RedisTemplate

一、Redis5.0.7一主二从三哨兵模式搭建

        1.redis下载安装:

               官网下载地址:https://redis.io/download,下载压缩包,我下载的是5.0.7。

               PS:Redis是c语言开发的,安装redis需要c语言的编译环境,如果没有gcc需要在线安装。

yum install gcc-c++

        2.解压压缩包,我是mac本地安装所以直接双击解压,如果是linux需要进入压缩包所在路径下执行:

tar -zxf redis-5.0.7.tar.gz

        3.编译:进入redis源码目录,执行 make 指令               

cd redis-5.0.7
make

        4.安装:make install 或者make install PREFIX=/usr/local/mysoft/redis指定安装目录,PREFIX后面是你自己的安装路径。如果不设置,则默认安装在/usr/local/bin目录下。

make install

或者

make install PREFIX=/usr/local/mysoft/redis

        5.启动: redis-server redis-5.0.7/redis.conf 指定配置文件或者直接在安装目录下执行./redis-server

redis-server redis-5.0.7/redis.conf

或者

./redis-server

启动成功后停掉就行,主要是用来生成一些文件。下面开始搭建主从哨兵模式。

        6.创建三个文件夹:7000、7001、7002。7000作为master节点,其他两个作为slave节点。并将之前解压的文件夹分别复制到三个文件夹里:(为了方便展示,我实在mac里搭的,linux同理)

Redis5.X主从哨兵模式搭建 + springboot整合RedisTemplate_第1张图片

        7.修改配置:

               修改master的redis.conf配置               

vim 7000/redis-5.0.7/redis.conf

               我们主要修改这几个地方

#端口,默认6379,这里我改成7000了
port 7000
#后台运行
daemonize yes
#修改为你的安装目录 redis_端口号 这里主服务器端口我改成7000了,默认6379
pidfile "/Users/local/redis_cluter/7000/redis_7000.pid"
#修改为你的安装目录
logfile "/Users/local/redis_cluter/7000/log.log"
#修改为你的安装目录
dir "/Users/local/redis_cluter/7000"
#默认是yes,主从和集群冲突,改为no
cluster-enabled no

               修改master的sentinel.conf配置

vim 7000/redis-5.0.7/sentinel.conf

               我们主要修改这几个地方

#端口默认26379,主节点我们可以不修改
port 26379
#日志文件路径
logfile "/Users/local/redis_cluter/7000/sentinel.log"
#这里配置是主服务器IP 端口 2个sentinel选举成功后才有效。‘mymaster’是自定义的名称
sentinel monitor mymaster 127.0.0.1 7000 2

接下来修改slave节点的配置

               修改slave节点7001的redis.conf配置

vim 7001/redis-5.0.7/redis.conf

               主要修改这几个地方

#端口,默认6379,这里我改成7001了
port 7001
#后台运行
daemonize yes
#修改为你的安装目录 redis_端口号 这里主服务器端口我改成7001了,默认6379
pidfile "/Users/local/redis_cluter/7001/redis_7001.pid"
#修改为你的安装目录
logfile "/Users/local/redis_cluter/7001/log.log"
#修改为你的安装目录
dir "/Users/local/redis_cluter/7001"
#默认是yes,主从和集群冲突,改为no
cluster-enabled no
#指定master
slaveof 127.0.0.1 7000

                修改slave节点7001的sentinel.conf配置

vim 7001/redis-5.0.7/sentinel.conf

               我们主要修改这几个地方

#端口默认26379,从节点我们需要修改
port 26479
#日志文件路径
logfile "/Users/local/redis_cluter/7001/sentinel.log"
#这里配置是主服务器IP 端口 2个sentinel选举成功后才有效。‘mymaster’是自定义的名称
sentinel monitor mymaster 127.0.0.1 7000 2

               修改slave节点7002的redis.conf配置

vim 7002/redis-5.0.7/redis.conf

               主要修改这几个地方

#端口,默认6379,这里我改成7002了
port 7002
#后台运行
daemonize yes
#修改为你的安装目录 redis_端口号 这里主服务器端口我改成7002了,默认6379
pidfile "/Users/local/redis_cluter/7002/redis_7002.pid"
#修改为你的安装目录
logfile "/Users/local/redis_cluter/7002/log.log"
#修改为你的安装目录
dir "/Users/local/redis_cluter/7002"
#默认是yes,主从和集群冲突,改为no
cluster-enabled no
#指定master
slaveof 127.0.0.1 7000

                修改slave节点7002的sentinel.conf配置

vim 7002/redis-5.0.7/sentinel.conf

               我们主要修改这几个地方

#端口默认26379,从节点我们需要修改
port 26579
#日志文件路径
logfile "/Users/local/redis_cluter/7002/sentinel.log"
#这里配置是主服务器IP 端口 2个sentinel选举成功后才有效。‘mymaster’是自定义的名称
sentinel monitor mymaster 127.0.0.1 7000 2

到此配置文件就已经简单修改完毕。

        8.启动redis:依次启动各个节点和哨兵

redis-server 7000/redis-5.0.7/redis.conf
redis-server 7001/redis-5.0.7/redis.conf
redis-server 7002/redis-5.0.7/redis.conf
redis-server 7000/redis-5.0.7/sentinel.conf --sentinel
redis-server 7001/redis-5.0.7/sentinel.conf --sentinel
redis-server 7002/redis-5.0.7/sentinel.conf --sentinel

               查看是否启动成功

ps -ef|grep redis

到此一主二从三哨兵模式搭建完成,因为我是一台服务器搭建多个节点,所以需要频繁改动端口,如果是多台服务器,每台部署一个节点就不需要了。另外还可以使用 redis-cli 的 info replication查看节点信息并测试哨兵模式,这里不做赘述了。

二、springboot整合RedisTemplate哨兵模式

        1.依赖jar包:

		
			org.springframework.boot
			spring-boot-starter-data-redis
		
		
			redis.clients
			jedis
		

             

        2.在resources下添加 redis.properties 配置文件


#redis配置开始
# Redis数据库索引(默认为0)
spring.redis6.database=6
# Redis服务器地址 只使用哨兵模式可以不配置
spring.redis.host=127.0.0.1
# Redis服务器连接端口 只使用哨兵模式可以不配置
spring.redis.port=7000
# Redis服务器连接密码(默认为空)
#spring.redis.password=123456
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=10
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=10000
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=2
# 连接超时时间(毫秒)
spring.redis.timeout=20000
#redis配置结束
spring.redis.block-when-exhausted=true

        3.创建 RedisConfig

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.redis.connection.RedisConnectionFactory;
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.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;

import java.util.HashSet;
import java.util.Set;


/**
 * @ClassName RedisConfig
 * @ProjectName Redis 配置类
 * @Description description
 * @Author zhangbuzheng
 * @Version 1.0
 */
@Configuration
@PropertySource("classpath:redis.properties")
@Slf4j
public class RedisConfig {

    @Value("${spring.redis.timeout}")
    private int timeout;

    @Value("${spring.redis.pool.max-idle}")
    private int maxIdle;

    @Value("${spring.redis.pool.min-idle}")
    private int minIdle;

    @Value("${spring.redis.pool.max-wait}")
    private int maxWaitMillis;

    @Value("${spring.redis.jedis.pool.max-active}")
    private int maxActive;

    @Value("${spring.redis6.database}")
    private int database6;


    @Bean("redis6")
    public RedisTemplate getRedisTemplate6() {
        RedisConnectionFactory factory = this.getRedisSentinelConnectionFactory(database6); // 建立Redis的连接
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化类型
        redisTemplate.setValueSerializer(new StringRedisSerializer()); // value的序列化类型
//        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); // value的序列化类型
        return redisTemplate;
    }

    /**
     * @Author: zhangbuzheng
     * @Description: 哨兵模式
     * @param: database
     * @Return: org.springframework.data.redis.connection.RedisConnectionFactory
     */
    public RedisConnectionFactory getRedisSentinelConnectionFactory(int database) { // 是负责建立Factory的连接工厂类
        Set setRedisNode = new HashSet<>();
        setRedisNode.add("127.0.0.1:26379");
        setRedisNode.add("127.0.0.1:26479");
        setRedisNode.add("127.0.0.1:26579");
        RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration("mymaster", setRedisNode);

        JedisPoolConfig poolConfig = new JedisPoolConfig(); // 进行连接池配置
        poolConfig.setMaxTotal(maxActive);
        poolConfig.setMaxIdle(maxIdle);
        poolConfig.setMinIdle(minIdle);
        poolConfig.setMaxWaitMillis(maxWaitMillis);

        JedisConnectionFactory jedisFactory = new JedisConnectionFactory(redisSentinelConfiguration,poolConfig);
//        jedisFactory.setHostName(host);
//        jedisFactory.setPort(port);
//        jedisFactory.setPassword(password);
        jedisFactory.setDatabase(database);
        jedisFactory.setTimeout(timeout);

//        jedisFactory.setPoolConfig(poolConfig);
        jedisFactory.afterPropertiesSet(); // 初始化连接池配置
        return jedisFactory;
    }


}

        4.引入 RedisTemplate 

    @Resource(name = "redis6")
    private RedisTemplate redis6;

 

你可能感兴趣的:(Redis5.X主从哨兵模式搭建 + springboot整合RedisTemplate)