软件架构设计(六)——负载均衡、缓存技术、Redis

目录

一、负载均衡技术

二、缓存技术

(1).主流的缓存技术

(2) Redis与Memcache的异同

(3).Redis缓存雪崩

(4).缓存穿透


一、负载均衡技术

为了解决业务分配不均匀,提出了负载均衡技术,有硬件负载均衡如F5,也有软件负载均衡,如LVS,Nginx,HAproxy。负载均衡算法主要分为静态算法和动态算法。

  • 静态算法就是不关心机器的具体状态,只需要一个配置信息表就可以完成。比如轮转算法、加权轮转算法,源地址哈希散列算法、目标地址哈希散列算法、随机算法。其中加权轮转算法的思想是根据机器配置,配置好的机器可以承担的业务量多一些,配置差的机器承担的业务量可以少一些。
  • 动态算法需要关心机器的运行情况。比如最小连接数法、加权最小连接数算法、加权百分比算法。

负载均衡类型有多种:

  1. 基于特定软件的负载均衡(HTTP重定向):在应用层。当请求到负载均衡服务器时,负载均衡服务器需要将请求分配给具体的服务器。分配的过程中采用HTTP重定向的方式。在现实生活中有时打开某个网站,明明进度条都已经完成了,结果又立刻跳转到另外一个网站。这就是你先访问负载均衡服务器,负载均衡告诉你了具体哪一个应用服务器,你再跳转去访问该应用服务器。这种方式效率较低
  2. 反向代理负载均衡:应用层。当客户端输入一个网址时,先需要进行dns解析,找到对应的ip服务器地址,到达负载均衡服务器,然后负载均衡服务器将请求转发到相应的应用服务器。当应用服务器处理完请求后,将资源返回到负载均衡服务器,然后由负载均衡将资源再回传给客户端。从这个过程可以看出,负载均衡本身不处理业务,只是充当了中介代理的作用,因此叫反向代理。这种方法比HTTP重定向的效率来得高一些,但是负载均衡服务器高一点。
  3. 基于DNS的负载均衡:传输层。就是在用户请求DNS服务器,获取域名对应的IP地址时,DNS服务器直接给出负载均衡后的服务器IP。此方式效率要比HTTP重定向的效率高,减少维护负载均衡服务器成本。但一个应用服务器故障,不能及时通知DNS,而且DNS负载均衡的控制权在域名服务商那里,网站无法做更多的改善和更强大的管理。
  4. 基于NAT的负载均衡:传输层。将外部IP地址映射为多个IP地址,对每次连接请求动态地转换为一个内部节点的地址。这种方法技术较为成熟,一般在网关位置,可以通过硬件实现。比如四层交换机。效率比反向代理要高些。
  5. 混合型负载均衡:(略)

二、缓存技术

        缓存技术可以提高读取效率,可以数据共享,完成有分布式系统有状态服务的信息同步。截至2023年,业内最常用的缓存技术Redis。

(1).主流的缓存技术

  • MemCache: MemCache是一个高性能的分布式的堆存对象缓存系统,用于动态Web应用以减轻数据库负载。MemCache通过在内存里维护一个统一的巨大的 Hash表,它能够用来存储各种各样的数据,包括图像、视频、文件以及数据库检索结果等
  • Redis:Redis是一个开源的,使用ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
  • Squid:Squid 是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独、非模块化的、I/O驱动的进程来处理所有的客户端请求。

(2) Redis与Memcache的异同

  1. Redis和MemCache都是将数据库放在内存中,都是内存数据库。它们都支持 Key-Value 数据类型。同时MemCache还可以用于缓存其他东西。例如图片、视频等。Redis还支持 list、set、hash等数据结构的存储。
  2. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。MemCache挂掉之后,数据就没了,环境异常时不可还原,而Redis可以。
  3. 在Redis中,并不是所有的数据都一直存储在内存中的。这是两者最大的区别。当物理内存用完时,Redis可以将一些很久没用到的value数据交换到磁盘中。
  4. Redis在很多方面支持数据库的特性,可以这样说,它就是一个数据库系统,而MemCache只是一个Key-Value 缓存。

因此,如果有数据持久方面的需求或对数据类型和处理有要求的应该选择Redis,简单的Key-Value存储应该选择MemCache   

(3).Redis缓存雪崩

        在使用缓存时,通常会对缓存设置过期时间,一方面目的是保持缓存与数据库数据的一致性,另一方面是减少缓存占用过多的内存空间。但当缓存中大量热点缓存采用了相同的失效时间,就会导致缓存在某一个时刻同时失效,请求全部转发到数据库,从而导致数据库压力骤增,甚至宕机。 这就是缓存雪崩(Cache Avalanche).同理,如果缓存数据库崩溃也会造成缓存雪崩.
        为了缓解此类问题,可以将Key的过期时间加上随机数,使缓存均匀地失效;或者使热点缓存不失效,可以在后台异步更新缓存;构建缓存高可用集群(针对缓存服务故障情况);当缓存雪崩发生时,服务熔断、限流、降级等措施保障。

 

(4).缓存穿透

        当一个请求发生时,先查询是否在缓存当中,如果缓存中存在,则直接返回。如果缓存中不存在对应的数据,则检索数据库,如果数据库中存在对应的数据,则更新缓存并返回结果。如果数据库中也不存在对应的数据,则返回空或错误。

        假如一个请求所需要的数据本身在数据库中不存在,那么这类请求无法命中缓存,都会不断地往数据库中查询,这就是缓存穿透。 解决缓存穿透,可以将空结果设置成一个默认值,这样缓存就可以存"空"值了。或者设置布隆过滤器,将可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从避免了对底层存储系统的查询压力。

猜你喜欢

转载自blog.csdn.net/superSmart_Dong/article/details/129074618