Redis 高可用之哨兵模式(二)

上一篇实际操作过程中遇到两个问题

问题一:虽然运行了3个sentinel容器,实际上只有一个sentinel运行

问题出现的原因很简单,三个sentinel用的是同一个挂载配置文件,容器内部的更改直接挂在文件的变化,所以解决方案就是用三分不同的配置文件去配置sentinel容器

问题二:连接sentinel容器,获取的redis 地址是docker虚拟ip,导致外网不能访问

原因:因为docker 网络模式默认为bridge模式,采用host模式即可

docker 具体网络模式的区别可以查看下面的文章

一分钟了解docker网络模式

具体操作

1. 新建redis-demo.conf文件,文件内容如下

logfile "redis.log"
port 6379
dir /data
appendonly yes
appendfilename appendonly.aof

2.复制redis-demo.conf文件 到 redis-01.conf 文件内容如下

logfile "redis.log"
port 6380
dir /data
appendonly yes
appendfilename appendonly.aof
slaveof 172.21.186.236 6379

这里需要注意 172.21.186.236 这个ip是我虚拟机的ip地址,也就是容器宿主的ip地址,需要对应修改(下同)

3.复制redis-01.conf 到redis-02.conf 文件内容如下

logfile "redis.log"
port 6381
dir /data
appendonly yes
appendfilename appendonly.aof
slaveof 172.21.186.236 6379

4.执行容器运行命令

docker run --name redis-6379 -v /data/conf/redis-demo.conf:/data/redis.conf --net=host  -d docker.io/redis redis-server /data/redis.conf

docker run --name redis-6380 -v /data/conf/redis-01.conf:/data/redis.conf --net=host  -d docker.io/redis redis-server /data/redis.conf

docker run --name redis-6381 -v /data/conf/redis-02.conf:/data/redis.conf --net=host  -d docker.io/redis redis-server /data/redis.conf

5.查看redis-6379节点的运行状态

  

 可以看到正常运行,主从配置也很清晰

6.创建sentinel.conf配置文件文件内容

 

logfile "sentinel.log"
port 26379
sentinel monitor mymaster 172.21.186.236 6379 1

 

7.复制sentinel.conf到sentinel-01.conf 内容如下

logfile "sentinel.log"
port 26380
sentinel monitor mymaster 172.21.186.236 6379 1

8.复制sentinel.conf到sentinel-02.conf内容如下

logfile "sentinel.log"
port 26381
sentinel monitor mymaster 172.21.186.236 6379 1

9.运行容器

docker run --net=host --name redis-s-6379 -v /data/conf/sentinel-demo.conf:/data/sentinel.conf  -d docker.io/redis redis-sentinel sentinel.conf
docker run --net=host --name redis-s-6380 -v /data/conf/sentinel-01.conf:/data/sentinel.conf  -d docker.io/redis redis-sentinel sentinel.conf
docker run --net=host --name redis-s-6381 -v /data/conf/sentinel-02.conf:/data/sentinel.conf  -d docker.io/redis redis-sentinel sentinel.conf

10.查看sentinel-s-6379运行状态

 

 到此容器一切就绪,接下来创建一个简单的的spring boot demo 测试

11.创建spring boot 其中只需要选择如图

 

 创建完成吼修改application.yaml文件内容如下

server:
  port: 8083
spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 172.21.186.236:26379,172.21.186.236:26380,172.21.186.236:26381

创建配置类  RedisConfig 内容如下

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    /**
     * 注入 RedisConnectionFactory
     */
    @Autowired
    RedisConnectionFactory redisConnectionFactory;

    /**
     * 实例化 RedisTemplate 对象
     *
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> functionDomainRedisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
        return redisTemplate;
    }

    /**
     * 设置数据存入 redis 的序列化方式
     *
     * @param redisTemplate
     * @param factory
     */
    private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        //只有设置jdk序列化,才能新类对象比如User进行存储
        redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setConnectionFactory(factory);
    }

}

创建HomeController

@RestController
public class HomeController {
    @Autowired
    RedisTemplate<String, Object> redisTemplate;

    @RequestMapping("/")
    public String index(@RequestParam String a) {
        try {
            redisTemplate.opsForValue().set("yin", a);
        } catch (Exception e) {
            System.out.println(e);
            return e.toString();
        }

        return a;
    }
    @RequestMapping("/hello")
    public String hello() {
        return "hello y";
    }
}

项目结构如下

运行后,访问地址:http://localhost:8083/?a=124

 

然后用redis管理工具连接redis具体结果如下:

 

  可以看到已经成功入库

over!!

 

posted @ 2019-06-29 17:00  别说我心狠  阅读(683)  评论(0编辑  收藏  举报