第五周总结
分布式缓存架构:架构原理和使用中的注意事项
缓存是介于数据访问者和数据源之间的告诉存储,需要多次读取数据的时候,用户加快访问速度
缓存cache和缓冲buffer的区别是什么?
缓存是多次读取数据,重复数据高速读取;而buffer是高速设备和低速设备之间调节速度
缓存类型有一下种类:
cpu,操作系统,数据库,jvm编译,cdn,代理和反向代理,前端,应用程序,分布式对象
各类介质数据访问是有延迟的,本地内存的访问是最快的,也就是缓存一般都放内存的原因。
缓存数据存储一般使用hash表的方式进行存储
缓存的关键指标:
缓存命中率
缓存是否有效依赖于能多少次重用同一个缓存相应业务请求,这个度量指标被称为缓存命中率
如果查询一个缓存,十次查询九次能够得到正确结果,那么它的命中率是90%
影响缓存命中率的几个因素
缓存键集合的大小:生成键数量越多,重用的机会越小;键越少,缓存的效率越高
缓存对象的生存时间
Time to live,比如商品,每次修改的时候需要更新缓存,对象缓存时间越长,缓存对象被重用的可能性越高
分布式缓存架构:常见缓存的实现形式
代理缓存
代理服务器缓存内容
反向代理缓存
代理数据中心的一个服务器
多层反向代理缓存
可以基于http url协议的
内容分发网络 cdn
静态的url
域名服务商提供的托管服务
Cdn同时配置静态文件和动态内容
Aws提供的cdn服务
所有的请求都通过cdn,只有动态的内容cdn直接请求服务器
通读缓存 read-through
代理缓存,反向代理缓存,cdn缓存都是通读缓存
通读缓存给客户端返回缓存资源,并在请求未命中缓存时候获取实际数据
客户端连接的是通读缓存而不是生成相应的原始服务器
旁路缓存 cache-aside
对象缓存是一种旁路缓存,旁路缓存通常是一个独立的 键值对(kv)存储
应用代码通常会询问对象缓存需要的对象是否存在,如果存在,它会获取并使用缓存的对象,如果不存在或者已过期,应用会连接主数据员来组装对象,并将其保存回对象缓存中以便将来使用
旁路缓存连接最终数据源,通读缓存不会连接最终数据源;客户从服务端获取数据后,自己写入旁路缓存
浏览器对象缓存(旁路缓存)
本地对象缓存
对象直接缓存在应用程序内存中
对象存储在共享内存,同一台机器的多个进程可以访问它们
缓存服务器作为独立应用和应用程序部署在同一个服务器上
本地对象缓存构建分布式集群
远程分布式对象缓存
缓存可以部署集群,并可以动态伸缩
memcashed分布式对象缓存
根据key计算ip地址去访问
Memcached分布式缓存访问模型
增加了一台服务器,对4取模,涉及到老数据规则不同,数据所在的服务器变动
类似的缓存以及数据库如何处理??
使用什么样的路由算法呢?
分布式缓存架构:一致性hash算法
一致性hash和余数hash不一样,建立一个一致性hash环,2的32次减1,首尾相连组成的,正整数的范围,即hashcode的范围
顺时针查找理它最近的一个服务器
可以解决余数hash带来的大量hash值不能使用的问题
还是会涉及到数据不一定是访问原来的缓存服务器中的缓存
一致性hash节点扩容
有问题:
Node在hash环上的分部,根据hash值来计算,node分部不一致,hash的访问负载不均衡的问题
增加节点时候的问题:
增加了node3,只是让node1的负载压力分摊
负载压力不均衡,负载的分摊不均衡
基于虚拟节点的一致性hash算法
每个服务器虚拟成若干个虚拟节点,node3有150个虚拟节点分部在节点上,这样,新增加的节点会影响所有的服务器
技术栈各个层次的缓存
缓存为什么能显著提升性能
缓存数据通常来自内存,比磁盘上的数据有更快的访问速度
缓存存储数据的最终结果形态,不需要中间计算,减少cpu资源的消耗
缓存降低数据库,磁盘,网络的敷在压力,使这些i/o设备获得更好的响应特性
缓存是系统性能优化的大杀器
技术简单
性能提升显著
应用场景多
【缓存是多次读取的优化手段,数据不可以写入缓存,因为不可靠】
合理使用缓存
不适合使用的:
1、频繁修改的数据,一般来说,读写比例在2:1以上才有意义,类似朋友圈,微博,热门商品
2、没有热点的访问的数据,20%的存储提供80%的访问才是可以的,类似多朋友的朋友圈,微博大v的微博,热门商品
Lru 最近最久没有被访问
3、数据不一致和脏读
设置失效时间,一旦超过失效时间,就从数据库重新加载。需要容忍一定时间的数据不一致。最好是需要数据更新时候通知缓存失效,删除缓存数据。
计算机科学中有3件事情最困难:缓存失效,命名事物,计数错误
4、缓存雪崩
缓存服务崩溃的时候,给数据库增加压力宕机,导致应用服务器崩溃,导致所有服务不可用,且不能简单重启缓存服务器和数据库服务器俩恢复网站的访问
5、缓存预热
缓存中存放的是热点数据,热点数据是缓存系统利用lru(最近最久未用)算法对不断访问的数据筛选淘汰处理啊的,这个过程需要花费较长的时间,在这段时间,系统性能和数据库负载都不太好,最好在缓存系统启动的时候把热点数据加载好,这个缓存预加载手段兼做缓存预热。对于一些元数据如城市地名,类目信息,可以启动是加载数据库中的全部数据到缓存中进行预热
6、缓存穿透
如果不巧当的业务,或者恶意攻击持续高并发的请求某个不存在的数据,因为缓存没有保存该数据,所有的请求都会落到数据库上,会对数据库造成很大的压力,甚至崩溃。一个简单的对策是将不存在的数据页缓存起来,其value是null,并设定一个较短的失效时间
7、redis vs memcached
Redis支持复杂的数据结构,支持多路复用异步i/o高性能,支持主从复制高可用,原生集群与share nothing集群模式【通过客户端就可以】
算法类似于一致性hash
消息队列:如何避免系统故障传递?
同步调用vs异步调用
消息队列构建异步调用架构
点对点模型
发布订阅模型
消息队列的好处
失败隔离和自我修复
因为发布者不直接依赖消费者,所以消息系统可以将消费者系统错误与生产者系统组件隔离
生产者和消费者互相不受对方失败影响
这意味着任何时刻,我们都可以对后端服务器执行维护和发布操作,我们可以重启,添加,删除服务器而不影响生产者的可用性,简化了部署和服务器管理的难度
事件驱动架构eda
负载均衡架构:如何用十行代码写一个负载均衡服务器?
负载均衡架构
http重定向负载均衡,不安全,知道内部服务器ip;性能比较低
只暴露负载均衡服务器,比较安全
可以使用2层负载均衡,dns+负载均衡服务器
效率比较低,性能比较差,tcp转http请求
基于底层的数据包进行请求转发,修改IP地址
修改的链路层的mac地址
实现上是最多的
很少使用
评论