Sentinel哨兵
redis在主从复制:主节点挂掉后不会自动恢复一个主节点,需要手工干预切换一个从库到主库。 服务暂且不可用、手工修改一大堆配置也可能出错、可用性低。 Sentinel哨兵高可用解决方案,通过监控主从服务器,主库挂了会自动根据从节点的反馈选举进行从库到主库的切换,在也不用担心晚上睡觉的时候线上处理问题了。 复制代码
下面的环境搭建实在win的wsl中进行的
测试配置如下
网络异常,图片无法展示
|
网络异常,图片无法展示
|
redis.conf配置文件修改
主节点
无需配置 复制代码
从节点
#主节点密码 masterauth 123654 #主节点地址 slaveof 127.0.0.1 6379 复制代码
sentinel哨兵(注意需要单独安装)
安装
需要作为插件需要安装 sudo apt install redis-sentinel 复制代码
配置
port 26379 # 1标识需要从节点反馈的数量评估主节点是否挂掉了 Sentinel monitor mymaster 127.0.0.1 6379 1 #以守护进程模式启动 daemonize yes #10秒ping不通主节点的信息,主观认为master宕机 sentinel down-after-milliseconds mymaster 10000 #故障转移后重新主从复制,1表示串行,>1并行 sentinel parallel-syncs mymaster 1 #故障转移开始,三分钟内没有完成,则认为转移失败 sentinel failover-timeout mymaster 180000 sentinel auth-pass mymaster 123654 复制代码
效果
用的可视化工具 Another Redis Desktop Manager 为redis可视化工具
正常节点
网络异常,图片无法展示
|
通过在哨兵的服务器执行命令后,主从节点都可以看到的 复制代码
干掉主节点
info replication 6381变为主节点了 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
配置文件也发生了变化
网络异常,图片无法展示
|
springboot2中的一些变化
需要改一些配置项
#-----------------redis-------------------------- # REDIS (RedisProperties) # Redis数据库索引(默认为0) #spring.redis.database=0 # Redis服务器地址 #spring.redis.host=127.0.0.1 # Redis服务器连接端口 #spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password=123654 # 连接池最大连接数(使用负值表示没有限制) spring.redis.jedis.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.jedis.pool.max-wait=-1 # 连接池中的最大空闲连接 spring.redis.jedis.pool.max-idle=8 # 连接池中的最小空闲连接 spring.redis.jedis.pool.min-idle=0 # 连接超时时间(毫秒) spring.redis.timeout=10000 #------------哨兵配置添加,上面的端口地址不需要了----------------------------- spring.redis.sentinel.master=mymaster #这里应该有多个地址的 spring.redis.sentinel.nodes=127.0.0.1:26379 spring.redis.password=123654 #-----------------redis end------------------------ 复制代码
代码是不用动的
@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplateString(RedisConnectionFactory redisConnectionFactory) { // 配置redisTemplate RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); redisTemplate.setConnectionFactory(redisConnectionFactory); RedisSerializer stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer); // key序列化 redisTemplate.setValueSerializer(stringSerializer); // value序列化 redisTemplate.setHashKeySerializer(stringSerializer); // Hash key序列化 redisTemplate.setHashValueSerializer(stringSerializer); // Hash value序列化 redisTemplate.afterPropertiesSet(); redisTemplate.setEnableTransactionSupport(true); return redisTemplate; } }