写点什么

第 5 周 这东西也有标准化答案???

用户头像
Pyr0man1ac
关注
发布于: 2020 年 11 月 01 日

分布式缓存架构

什么是缓存 Cache

  • 存储在计算机上的一个原始数据复制集,以便于访问;

  • 介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取的时候,用于加快读取的速度;

无处不在的缓存

  • CPU 缓存

  • 操作系统缓存

  • 数据库缓存

  • JVM 编译缓存


  • CDN 缓存

  • 代理与反向代理缓存

  • 前端缓存

  • 应用程序缓存

  • 分布式对象缓存

缓存的关键指标——缓存命中率

  • 缓存是否有效依赖于能多少次重用同一个缓存响应业务请求,这个度量指标被称作缓存命中率;

  • 如果查询一个缓存,十次查询九次能够得到正确结果,那么它的命中率是 90%;

影响缓存命中率的主要指标

  • 缓存键集合大小

  • 缓存可使用内存空间

  • 缓存对象生存时间

通读缓存(read-through)

  • 代理缓存,反向代理缓存,CDN 缓存都是通读缓存;

  • 通读缓存给客户端返回缓存资源,并在请求未命中缓存时获取实际数据;

  • 客户端连接的是通读缓存而不是生成响应的原始服务器;


旁路缓存(cache-aside)

  • 对象缓存是一种旁路缓存,旁路缓存通常是一个独立的键值对(key-value)存储;

  • 应用代码通常会询问对象缓存需要的对象是否存在,如果存在,它会获取并使用缓存 的对象,如果不存在或已过期, 应用会连接主数据源来组装对象,并将其保存回对象 缓存中以便将来使用;


分布式对象缓存的一致性 hash 算法



各种介质数据访问延迟


缓存为什么能显著提升性能

  • 缓存数据通常来自内存,比磁盘上的数据有更快的访问速度;

  • 缓存存储数据的最终结果形态,不需要中间计算,减少 CPU 资源的消耗;

  • 缓存降低数据库、磁盘、网络的负载压力,使这些 I/O 设备获得更好的响应特性;

缓存是系统性能优化的大杀器

  • 技术简单

  • 性能提升显著

  • 应用场景多

合理使用缓存

使用缓存对提高系统性能有很多好处,但是不合理的使用缓存可能非但不能提高系统的 性能,还会成为系统的累赘,甚至风险。实践中,缓存滥用的情景屡见不鲜——过分依 赖缓存、不合适的数据访问特性等

频繁修改的数据

这种数据如果缓存起来,由于频繁修改,应用还来不及读取就已失效 或更新,徒增系统负担。一般说来,数据的读写比在 2:1 以上,缓存才有意义

没有热点的访问

缓存使用内存作为存储,内存资源宝贵而有限,不能将所有数据都缓 存起来,如果应用系统访问数据没有热点,不遵循二八定律,即大部分数据访问不是集 中在小部分数据上,那么缓存就没有意义,因为大部分数据还没有被再次访问就已经被 挤出缓存了

数据不一致与脏读

一般会对缓存的数据设置失效时间,一旦超过失效时间,就要从数 据库中重新加载。因此应用要容忍一定时间的数据不一致,如卖家已经编辑了商品属性, 但是需要过一段时间才能被买家看到。在互联网应用中,这种延迟通常是可以接受的, 但是具体应用仍需慎重对待。还有一种策略是数据更新时立即更新缓存,不过也会带来 更多系统开销和事务一致性的问题。因此数据更新时通知缓存失效,删除该缓存数据, 是一种更加稳妥的做法

缓存雪崩

缓存是为了提高数据读取性能的,缓存数据丢失或者缓存不可用不会影响到 应用程序的处——它可以从数据库直接获取数据。但是随着业务的发展,缓存会承担大 部分的数据访问压力,数据库已经习惯了有缓存的日子,所以当缓存服务崩溃的时候, 数据库会因为完全不能承受如此大的压力而宕机,进而导致整个网站不可用。这种情况, 被称作缓存雪崩,发生这种故障,甚至不能简单的重启缓存服务器和数据库服务器来恢 复网站访问

缓存预热

缓存中存放的是热点数据,热点数据又是缓存系统利用 LRU(最近最久未用) 算法对不断访问的数据筛选淘汰出来的,这个过程需要花费较长的时间,在这段时间, 系统的性能和数据库负载都不太好,那么最好在缓存系统启动的时候就把热点数据加载 好,这个缓存预加载手段叫做缓存预热(warm up)。对于一些元数据如城市地名列表、 类目信息,可以启动时加载数据库中全部数据到缓存进行预热

缓存穿透

如果不恰当的业务、或者恶意攻击持续高并发的请求某个不存在的数据,因 为缓存没有保存该数据,所有的请求都会落到数据库上,会对数据库造成很大的压力, 甚至崩溃。一个简单的对策是将不存在的数据也缓存起来(其 value 值为 null),并设 定一个较短的失效时间。


消息队列与异步架构

  • 消息生产者

  • 消息队列

  • 消息消费者

消息队列构建异步调用架构

点对点模型


发布订阅模型

消息队列的好处

  • 实现异步处理,提升处理性能

  • 更好的伸缩性

  • 削峰填谷

  • 失败隔离和自我修复

  • 解耦

事件驱动架构 EDA



负载均衡架构

  • HTTP 重定向负载均衡

  • DNS 负载均衡

  • 反向代理负载均衡

  • IP 负载均衡

  • 数据链路层负载均衡

负载均衡算法

  • 轮询:所有请求被依次分发到每个应用服务器上,适合于所有服务器硬件都相同的场景

  • 加权轮询:根据应用服务器硬件性能的情况,在轮询的基础上,按照配置的权重将请 求分发到每个服务器,高性能的服务器分配更多请求

  • 随机:请求被随机分配到各个应用服务器,在许多场合下,这种方案都很简单实用,因为好的随机数本身就很均衡。如果应用服务器硬件配置不同,也可以很容易的使用 加权随机算法

  • 最少连接:记录每个应用服务器正在处理的连接数(请求数),将新到的请求分发到最少连接的服务器上,应该说,这是最符合负载均衡定义的算法

  • 源地址散列:根据请求来源的 IP 地址进行 Hash 计算,得到应用服务器,该算法可以保证同一个来源的请求总在同一个服务器上处理,实现会话粘滞

应用服务器集群的 Session 管理

  • Session 复制

  • Session 绑定

  • 利用 Cookie 记录 Session

  • Session 服务器


发布于: 2020 年 11 月 01 日阅读数: 31
用户头像

Pyr0man1ac

关注

还未添加个人签名 2019.06.24 加入

还未添加个人简介

评论

发布
暂无评论
第 5 周 这东西也有标准化答案???