架构师训练营第五周总结
这周老师带领我们学习了分布式缓存、消息队列和负载均衡三大板块。
分布式缓存
缓存是存储在计算机上的一个原始数据复制集,当需要多次访问的时候,可以加快读取速度。
衡量缓存是否高效的关键指标是缓存命中率,即得到正确结果和查询次数的比率。缓存键集合的大小,也就是需要缓存的数据量大小,总量越大命中率越低,反之越高;缓存通常使用高速存储来实现,但是高速存储通常价格昂贵,所以存储空间有限,在超过其容量的缓存需求,需要频繁的删除和替换,所以缓存越大,就不用频繁的替换,命中率更高;最后,缓存对象的生命周期越长,被重复查询到的概率就越高,命中率就越大。
常用的缓存有:代理缓存,即客户端访问互联网经过的内部代理服务器,为了加快访问速度会缓存其浏览结果;反向代理缓存,即数据中心对外提供服务时,会在对外的入口处提供缓存,以加快客户端的访问速度;CDN,即内容分发网络,多用于客户端访问静态资源时,在举例客户更近的运营商机房放置缓存服务器来加速访问,当缓存未命中时会回源到数据中心获取。
缓存从读取方式可以分为:通读缓存和旁路缓存。通读缓存即客户端只会读取缓存,看不到数据中心内部的真正数据源,当缓存未命中时,由通读缓存自己去读取数据源然后返回给客户端。前面说的代理缓存、反向代理缓存和CDN缓存都属于通读缓存;旁路缓存即客户端会先查询缓存是否存在,如果不存在则会自己访问数据中心的数据源,然后把获取到的数据保存在缓存之中以便将来使用,常见的KV对象缓存就是旁路缓存。
缓存从进程方式可以分为:本地对象缓存和远程对象缓存。本地对象缓存即缓存保存在应用服务器上,使用本地内存存储;远程对象缓存即将缓存保存在另外一台多多台服务器之上,通过远程调用来访问。
分布式缓存如何定位缓存保存位置
Hash对缓存服务器数量取模
对于Memcached,简单的处理方式就将多台缓存服务器按顺序进行编号:1,2,3,4....,然后根据缓存KEY进行Hash计算得到一个整数,然后对结果取模缓存服务器数量,就可以得知缓存应该保存在哪台服务器上。这种方式实现简单,但是无法应对扩容需求,因为增加缓存服务器之后,会导致取模计算的结果和原来完全对不上,从而导致KEY的位置计算错误而取不到数据。
基于虚拟节点的一致性Hash算法
一致性Hash环结构是构建了一个从0到2的32次方-1范围的一个环,环的首位相连。然后把多台缓存服务器编号的Hash值放到环上,但是为了让缓存服务器更均匀的负担所有缓存,把一台缓存服务器虚拟出150-200个虚拟服务器放置在环上,他们是对应到同一个真实的缓存服务器。最后把对象KEY计算Hash也放到环上,然后顺时针查找最近的虚拟服务器节点,他们就保存在这些节点上。
合理使用缓存
对于频繁修改的数据不适合缓存,因为频繁修改,应用还没来得及读取就已失效或更新,数据读写比在2:1以上才有缓存的意义;没有热点的访问,缓存容量有限,如果系统访问数据没有热点,大部分数据访问不是集中在小部分数据上,缓存就没有意义,因为大部分数据还没被再次访问就已经被淘汰出去了;数据不一致与脏读,缓存在超过生命周期之前可能会和数据库里的数据不一致,直到失效后再次加载到缓存,缓存通常需要业务流程配合,以降低延迟刷新带来的体验问题,对于即时性要求较高的应用,一般也是删除该缓存,而不是去刷新缓存,因为并发情况下会导致缓存不一致。
消息队列
消息队列的模型分为:点对点模型和发布订阅模型。点对点模型中,多个生产者把消息放入同一个消息队列中,多个消息消费者从消息队列中依次取出消息进行消费,一个消息只会被一个消费者消费;发布订阅模型中,消费者可以订阅自己感兴趣的主题,每个订阅都会有对应的队列,生产者生产的消息会发布到多个被订阅的消息队列中,消费者可以各自消费自己订阅的队列互补影响。消息队列最大的好处在于将消费者和生产者完全解耦,双方只依赖于约定的数据-即消息格式。
负载均衡
HTTP重定向负载均衡:客户端首先访问数据中心的负载均衡服务器,负载均衡服务器根据负载算法选择一台应用服务器,然后将HTTP重定向为这台服务器返回客户端响应,客户端收到重定向的响应后向应用服务器发起请求。HTTP重定向要求应用服务器也暴露在公开的外网,造成安全问题。
DNS负载均衡:客户端请求解析指定域名,由DNS服务器可以根据客户请求来源不同返回不同的数据中心的入口服务器IP,然后由客户端向指定IP发送和接受请求,DNS请求本身会在客户端缓存起来,并不是每次请求都会去解析,数据中心的入口服务器大多也是一个区域级的负载均衡。
反向代理负载均衡:工作在七层,即应用层,客户端发起的请求先访问数据中心的反向代理服务器,然后反向代理服务器通过负载算法选择一台内网应用服务器并转发客户端请求至该服务器,应用服务器处理完毕后反向代理服务器又将其相应结果返回给客户端。反向代理服务器因为工作在引用层,且需要经过其转发,性能不佳,只能应用于小型互联网应用。
IP负载均衡:工作在三层,即网络层的负载均衡,通过修改客户端请求包的目标IP地址为内网应用服务器的IP来转发数据包,这个过程类似于路由器的DNAT。应用服务器处理完毕后的响应数据包到达负载均衡后,其响应接收IP被改为客户端的IP,这个过程类似于路由器的SNAT。三层的转发因为不需要关心更内部的协议,工作效率更高,因此性能也更佳,但是因为所有响应的返回都是经过负载均衡,导致负载均衡的出口带宽十分紧张。
数据链路层负载均衡:工作在二层,即数据链路层的负载均衡,为了解决IP负载均衡出口带宽瓶颈的问题,负载均衡服务器将客户端请求的数据包的目标MAC地址修改为相同IP的内网应用服务器的MAC地址从而实现转发。因为没有修改客户端请求的IP,所以应用服务器直接将响应发送给客户端而没有经过负载均衡服务器。因为内网应用服务器和负载均衡使用了相同的虚拟IP,应用服务器并没有直接暴露在公网,所以没有安全问题。
负载均衡算法
轮询:所有负载均衡服务器配置相同,硬件性能一样,所以请求被依次发往每个应用服务器;加权轮询:硬件配置好,性能更强的服务器处理更多的访问请求;随机:请求被随机分配给不同的应用服务器;最少连接:记录每个应用服务器的当前连接数,新的请求会被发送给连接数最少的应用服务器;源地址散列:根据请求来源的IP地址进行Hash计算得到要发送的应用服务器,从而实现会话黏连。
评论