Redis 高可用之哨兵模式(二)
上一篇实际操作过程中遇到两个问题
问题一:虽然运行了3个sentinel容器,实际上只有一个sentinel运行
问题出现的原因很简单,三个sentinel用的是同一个挂载配置文件,容器内部的更改直接挂在文件的变化,所以解决方案就是用三分不同的配置文件去配置sentinel容器
问题二:连接sentinel容器,获取的redis 地址是docker虚拟ip,导致外网不能访问
原因:因为docker 网络模式默认为bridge模式,采用host模式即可
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!!