1.集群的概念
1.1. 什么是集群
同一个业务,部署在多个服务器上(不同的服务器运行同样的代码,做同一件事情)。
1.2. 为什么要集群
- 防止单点故障
- 处理高并发-太多请求一台服务器搞不定
- 处理大量数据(扩容问题)-太多内存数据一台服务器搞不定
- 提高效率
1.3. 集群的特性和能力
集群提供了以下两个关键特性:
- 可扩展性--集群的性能不限于单一的服务实体,新的服务实体可以动态地加入到集群,从而增强集群的性能。动态添加服务器
- 高可用性--集群通过服务实体冗余使客户端免于轻易遇到out of service的警告。在集群中,同样的服务可以由多个服务实体提供。如果一个服务实体失败了,另一个服务实体会接管失败的服务实体。集群提供的从一个出错的服务实体恢复到另一个服务实体的功能增强了应用的可用性
当访问的服务器挂了时,集群要有能力找可以正常使用额服务器继续提供服务器。
为了具有可扩展性和高可用性特点,集群的必须具备以下两大能力:
负载均衡--负载均衡能把任务比较均衡地分布到集群环境下的计算和网络资源。
错误恢复--由于某种原因,执行某个任务的资源出现故障,另一服务实体中执行同一任务的资源接着完成任务。这种由于一个实体中的资源不能工作,另一个实体中的资源透明的继续完成任务的过程叫错误恢复。
1.4. 分布式和集群相同点和不同点?
相同点:
都是处理高并发,而且都需要多台服务器协同.一般在一个系统中同时存在分布式和集群.
不同点:
分布式中不同服务器处理是不同业务.而集群处理时同一业务.
分布式图:
集群图:
2.Redis集群方案选择
2.1. 主从复制
解析图:
优点:
解决了高并发问题
缺点:
- 内存占用大 --主从里面放的相同的内容
- 如果redis主服务挂了,从服务器不会主动升为主,而如果实在要做,就需要添加 额外的组件 比如keepalvie(主从的自动切换)
- redis扩容 也比较麻烦
2.2.哨兵模式
Redis 2.8中提供了哨兵工具来 实现自动化的系统监控和故障恢复功能。
解析图:
优点:
- 解决了高并发问题
- 解决了主备切换问题
缺点:
扩容 ,内存也没有解决
2.3.Redis-Cluster
redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说每台redis节点上存储不同的内容。
Redis-Cluster采用无中心结构
设计一个概念:分布存储机制- 槽 (就是一个容器,用来的存数据)
解析图:
缓存穿透
- 攻击者用软件频繁的去查询一个不存在的数据,?id=-1的数据,Redis也不存在,Mysql也不存在,但是每一次这个请求都会请求到Mysql,导致Mysql的压力很大
== 解决方案==
- 增加请求校验:如参数不合法直接返回错误信息。
- 频繁请求拦截:如ip地址在1s中发了多次请求,设置黑名单。
- 根据业务逻辑思考:是否可以加上身份校验,或者图片验证码校验
- 不存在的数据存储一个 key-null在Redis,并设置过期时间
缓存击穿
- 缓存击穿(同一个数据)就是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读取缓存没读到数据,有同时去数据库中读取数据,引起数据库压力瞬间增大,造成过大压力。
== 解决方案==
- (key) 将缓存设置为永久缓存
- 代码块加上互斥锁:当一个请求进去,会穿过Redis查询Mysql中的数据,然后会把数据放一份到Redis,后面的请求就可以从Redis中获取数据了
雪崩
-
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案:
-
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
-
如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
-
设置热点数据永远不过期。