1、创建两个文件夹redis和sentinel文件夹用于存放docker-compose.yml文件
2、redis下的docker-compose.yml
3、sentinel下的docker-compose.yml文件以及sentinel.conf配置文件
4、spring boot整合redis哨兵
依赖
配置
如果使用的虚拟机中的docker ip地址 先配置路由表,这样宿主机才能访问docker容器中的哨兵
route add -p 容器的网络地址 mask 子网掩码 虚拟机ip地址 切记一定要关闭虚拟机的防火墙
配置bean
5、哨兵工作方式
1、特点:
- 每个哨兵进程会每秒一次向集群中的所有redis发送ping命令
- 如果距离最近的一次ping命令的时间超过了 down-after-milliseconds设置的时间,那么当前哨兵就会将起标记为主观下线(SDOWN)
- 如果Master被标记为了主观下线,那么其余的哨兵会以每秒一次的频率确认Master是否进入了主观下线状态
- 如果有足够的哨兵(配置文件中配置)进程在指定的范围内确认Master进入主观下线,则Master就会被改为客观下线(ODWON)
- 如果没有的哨兵同意Master主服务器下线,master的客观下线状态就会被移除
2、故障转移(Raft算法):
- 先选择优先级最高的(slave-priority)
- 复制偏移量大的从节点(数据最新的)
- runid最小的
3、缺点:
- redis较难支持在线扩容,如果集群容量达到上限时在线扩容会变的很复杂
- 每个节点存入的数据都是相同的,容器造成资源的浪费
- 容易导致数据的丢失
- redis配置文件中
- min-slaves-to-write 1
- min-slaves-max-lag 10 表示至少要有1个salve节点与master数据同步超过10秒,就拒绝其它的请求
- 脑裂 (网络分区变化时,master和slave出现无法通信时,sentinel会选择新的master,那么此时client一直在向之前的master发送数据,将原master进行恢复成新master的slave时,就会丢失后来发送的数据)
6、Redis-Cluster集群
1、特点:
- 节点连接是使用二进制连接的
- 节点fail是超过半数的节点检测时才会失效
- 客户端只需要连接集群中任何一个节点即可
2、工作方式
每个节点上都有slot槽的概念,取值范围是0-16383,还有一个就是cluster用于集群管理的插件。当存取的key值到达时 redis会根据crc16进行计算,然后把计算的结果对16384取余数,这样就每个key就会有对应的编号在0-16383之间的哈希槽,通过这个值跳转到对应的节点中。
redis-cluster引入了主从模式,一个主节点对应多个从节点,当超过半数的从节点ping主节点超时时,就会认为主节点宕机了。
3、缺点:
- 数据通过异步复制,不保证数据的强一致性
- 不支持多数据库空间,集群模式下只能使用1个数据库空间 0
7、redis常见问题
1、缓存雪崩
描述:在同一时间段,缓存集中过期。所有的请求都去查询数据库
解决方案:
解锁或者队列的方式防止大量线程对数据库的一次性独写
协调redis的过期时间,随机时间
做二级缓存,一级缓存为短期,二级缓存为长期
依赖隔离组件为后端限流并且降级
2、缓存穿透
描述:在redis中没有查询到并且数据库中也没有查询到,下一次进来还是会到redis中查询,就没有查询的意义了
解决方案:
布隆过滤器
将空对象记录在缓存中
3、缓存击穿
描述:查询的某个key恰好失效,刚好又有大量的并发过来,造成DB压力
解决方案:
通过加锁或者队列防止大量请求透过redis到DB中
对于热点key可以无限调长
也可以做二级缓存
4、缓存降级
描述:访问量剧增、服务出现问题,非核心的服务影响到核心流程的性能,但是仍需要服务还是可用
5、缓存预热
描述:先将数据直接加载到redis中,防止用户在请求时先查数据库
解决方案:
定时刷新缓存
6、缓存更新
描述:维护大量缓存,自定义缓存淘汰的策略
解决方案:定时清理过期的缓存,先判断缓存是否过期,如果过期就去数据库获取新的数据然后再更新
到此这篇关于docker搭建redis哨兵集群并且整合springboot的实现的文章就介绍到这了,更多相关docker搭建redis哨兵集群内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!