写点什么

第五周总结

用户头像
_
关注
发布于: 2020 年 10 月 23 日

分布式缓存架构:架构原理和使用中的注意事项

缓存是介于数据访问者和数据源之间的告诉存储,需要多次读取数据的时候,用户加快访问速度

缓存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地址

实现上是最多的



很少使用



用户头像

_

关注

还未添加个人签名 2018.09.17 加入

还未添加个人简介

评论

发布
暂无评论
第五周总结