一 哨兵模式
1.1 Redis哨兵-介绍:
Redis主从复制的作用有数据热备、负载均衡、故障恢复等:但主从复制存在的一个问题是故障恢复无法自动化。接下来要介绍的哨兵模式,它基于Redis主从复制,主要作用便是解决主节点故障恢复的自动化问题,进一步提高系统的高可用性。 Redis的Sentinel系统用于管理多个Redis服务器(instance),该系统执行以下三个任务
1.监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常。
2.提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel可以通过API 向管理员或者其他应用程序发送通知。
3.自动故障迁移(Automaticfailover):当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器并让失效主服务器的其他从服务器改为复制新的主服务器:当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。
1.2 哨兵的配置
1.配置文件
sentinel monitor master6379 127.0.0.1 6379 1 # 监视的主机6379
2.启动哨兵的配置文件
sudo redis-server /etc/redis/sentinel.conf
3.将主机6379挂掉(shutdown)
4.哨兵就会进行投票,选出新的主机
哨兵模式可以解决的问题:当主机挂掉之后,从机依然是从机,群龙无首的现象。
二 Redis-常见问题
缓存机制的应用,能够极大的提升程序的性能和效率,但是也会遇到一些问题。
一些典型的问题如下:
2.1 缓存雪崩
一般热点数据都会去做缓存,一般缓存都是定时任务去刷新,定时刷新就有一个问题:
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样缓存在失效的时候,原本访问缓存就能得到的数据,现在失效了,只能到数据库中访问。这样就会给后端系统比如(DB)带来很大压力。
总结:缓存中大量的数据在同一时间失效,此时相当于没有缓存,所有对数据的请求直接走到数据库,会带来很大压力。
例如:大量的key值过期,导致客户端的访问必须到MySQL数据库中,增加数据库的负担
解决方案:1.分散失效时间,让数据不在同一时间失效。2.可以不设置过期时间(不是很适用)
2.2 缓存击穿
缓存击穿跟缓存雪崩类似,但是又不一样。
缓存雪崩是大量的缓存失效,对这些数据的访问量全部都转移到数据库上了。而缓存击穿是一个key可能会在某些时间点被超并发地访问,属于“热点”数据,在不停的扛着大并发的访问量。当这个热点数据在缓存中过期而失效的时候,大量的并发访问就会穿破缓存,转移到数据库上面,就像在缓存上开了一个洞,所以叫击穿。
总结:当热点数据key从缓存内失效时,大量访问同时请求这个数据,就会将查询下沉到数据库层,此时数据库的负载压力会骤增,我们称这种现象为“缓存击穿”。
缓存击穿解决方法:
1.延长热点key的过期时间或者设置永不过期,如排行榜,首页等;
2.利用互斥锁保证同一时刻只有一个客户端可以查询底层数据库的这个数据,一旦查到数据就缓存至Redis内,避免其大量请求同时穿过Redis访问底层数据库。
2.3 缓存穿透
目录
假如用户要访问的数据并不存在(缓存和数据库中都没有),这样每次先到缓存中查找,再到数据库中查找,由于数据并不存在,也就无法将该数据写入到缓存中,那么每次对该数据的查询都会去查询一次数据库。如果用户频繁请求这样的数据,比如用一个不存在的用户id读取用户信息,不论缓存还是数据库都没有,会导致数据库压力过大,若黑客利用此漏洞进行攻击可能压垮数据库。
总结:要查询的数据不存在,缓存无法命中所以需要查询完整数据库,但是数据是不存在的,此时数据库肯定会返回空,也就不会记录的缓存中,这样每次对该数据的查询都会穿过缓存去查询一次数据库。
缓存击穿和缓存穿透从名词上可能很难区分开来,它们的区别是:穿透表示底层数据库没有数据且缓存内也没有数据,击穿表示底层数据库有数据而缓存内没有数据。
解决方案:map<key, null> 存入缓存
1.可以设置一个key以及对应的value为空,并且存放在缓存中,这样当进行查找的时候,如果value为空,就不会再继续在底层数据库上进行查找。