Redis集群
Redis主从复制(读写分离)
主从复制概念
就是建议一台Redis服务器上的数据复制到其他Redis服务器上,使两者数据达到一致,再将第一台服务器作为主服务器(master/主节点),主服务器只负责写操作,将其他的Redis服务器作为从服务器(slave/从节点)
数据的复制是单向的,也就是说只能从主节点到从节点,主节点负责写操作,从节点负责读操作,以此来减轻服务器的压力
优点
- 可以避免Redis单点故障,导致服务器崩溃,当主节点宕机时,可以从从节点代替,从而实现快速的故障回复
- 构建高可用的读写分离架构,来满足读多写少的应用场景
主从架构图
- 主Redis中的数据有两个副本(replication)即从Redis1和从Redis2,即一台Redis服务器宕机了,其他两台Redis服务器也可以继续继续服务
- 主Redis中数据和从Redis服务器上的数据保持同步,当主Redis写入数据时通过主从复制机制会复制到两个从Redis服务器上
- 只有一个主Redis服务器,可以由多个从Redis服务器
- 主从复制不会阻塞master,在同步数据时,master可以继续处理client请求
Redis哨兵模式
哨兵模式本质就是一个容灾方案
Redis的哨兵系统就是用于管理多个Redis服务器(instance),该系统执行以下三个任务:
- 监控(Monitoring):哨兵会不断低检查你的主服务器和从服务器是否运行正常
- 提醒(Notification):当被监控的某个Redis服务器出现问题时,哨兵可以铜锅API向管理员或者其他应用程序发送通知
- 自动故障迁移(Automatic failover):当一个服务器不能正常工作时,哨兵会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效服务器的其他从服务器改为复制新的主服务器;当客户端视图接连失效的主服务器时,集群也会像客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器
哨兵:实则就是一个在特殊模式下的Redis服务器,里面存储的是自己本身的信息,主服务器的信息,从服务器的信息。
用一个或多个哨兵监视服务器(进行写操作的服务器)是否在正常执行任务,一旦哨兵发现主服务器不可用时,就会找到一台合适的从服务器成为主服务器。
单哨兵架构
由一个哨兵来检测主从服务器的运行状态,如果主服务器发生故障,哨兵会从从服务器中挑选出来一个合适的从服务器称为主服务器,也可以成为一言堂
多哨兵架构
而多哨兵架构服务器,就是由多个哨兵来共监测主从服务器的运行状态,如果主服务器发生故障而导致不能运行,这时哨兵会通过投票方式来从从服务器中挑选出一个合适的从服务器作为主服务器,也可以成为民族选举
Redis常见问题
虽然Redis的使用可以很大的提高程序的性能和效率,但缓存的存在是无法避免数据一致性问题的,因此,对数据一致性要求很高时,就不能使用缓存。
常见的问题:缓存穿透、缓存击穿和缓存雪崩
缓存穿透
用户想查询一个数据,发现redis缓存没有命中(缓存中没有),就会去持久层数据库查询,数据库也不存在该信息,当请求出现频率过高时,对数据库造成很大的压力,这种情况称为缓存穿透。
解决方案
- 缓存空对象,设置空值,从而减轻服务器的压力
a. 如果存储的空值过多就需要更多的空间进行存储
b. 对空值设置过期时间从而解决空间,因存在时间差无法保证数据一致性- 布隆过滤器(底层是一个过滤器,对请求进行校验,降低对服务器的压力)
缓存击穿
大量的请求同时在对某个key进行访问,某一时刻,key过期,所有的请求直接访问了数据库,将数据回写到缓存中,会导致数据库在某一瞬间压力过大,这种情况称为缓存击穿。
解决方案
- 设置热点数据不过期(不过期的数据过多时会造成空间不够的问题)
- 加互斥锁:使用分布式锁,给每一个key单独加锁,保证只有线程去请求后台的服务
缓存雪崩
某一个时间段,缓存集中过期【缓存的雪崩很有可能导致某个服务器直接宕机,后果不可预知】
解决方案
- Redis高可用:搭建Redis集群,当某一个服务器挂掉之后,其他的还可以工作
- 限流降级:控制访问量,其他的进行排队等待
- 数据预热:在部署之前,预先访问一遍,对热点数据提前缓存,设置不同的过期时间,让失效时间分布点尽量均匀