缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题。提供高性能的数据快速访问。
本文是缓存在分布式应用第一篇文章,介绍缓存的原理,缓存的分类,缓存的设计,CDN缓存(原理,架构参考和技术实践),反向代理缓存(原理,Squid架构实践和常用代理缓存之间的比较)。本文主要是自己的学习总结和网络文章摘录,供学习之用。
本次分享大纲
- 缓存概述
- CDN缓存
- 反向代理缓存
- 分布式缓存
- 本地缓存
- 缓存架构示例
- 参考资料
- 分享总结
一、缓存概述
缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题。提供高性能的数据快速访问。
1.1缓存的原理
(1) 将数据写入/读取速度更快的存储(设备);
(2) 将数据缓存到离应用最近的位置;
(3) 将数据缓存到离用户最近的位置。
1.2缓存分类
在分布式系统中,缓存的应用非常广泛,从部署角度有以下几个方面的缓存应用。
(1) CDN缓存;
(2) 反向代理缓存;
(3) 分布式Cache;
(4) 本地应用缓存;
1.3缓存媒介
常用中间件:Varnish,Ngnix,Squid,Memcache,Redis,Ehcache等;
缓存的内容:文件,数据,对象;
缓存的介质:CPU,内存(本地,分布式),磁盘(本地,分布式)
1.3缓存设计
缓存设计需要解决以下几个问题:
(1) 缓存什么?
哪些数据需要缓存:1.热点数据;2.静态资源;
(2) 缓存的位置?
CDN,反向代理,分布式缓存服务器,本机(内存,硬盘)
(3) 如何缓存的问题?
- 过期策略
1.固定时间:比如指定缓存的时间是30分钟;
2.相对时间:比如最近10分钟内没有访问的数据;
- 同步机制
- 实时写入;(推)
- 异步刷新;(推拉)
二、CDN缓存
CDN主要解决将数据缓存到离用户最近的位置,一般缓存静态资源文件(页面,脚本,图片,视频,文件等)。国内网络异常复杂,跨运营商的网络访问会很慢。为了解决跨运营商或各地用户访问问题,可以在重要的城市,部署CDN应用。使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
2.1CND原理
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求 springmvc+mybatis+spring 整合 下载地址 。
(1) 未部署CDN应用前
网络请求路径:
请求:本机网络(局域网)——》运营商网络——》应用服务器机房
响应:应用服务器机房——》运营商网络——》本机网络(局域网)
在不考虑复杂网络的情况下,从请求到响应需要经过3个节点,6个步骤完成一次用户访问操作。
(2) 部署CDN应用后
网络路径:
请求:本机网络(局域网)——》运营商网络
响应:运营商网络——》本机网络(局域网)
在不考虑复杂网络的情况下,从请求到响应需要经过2个节点,2个步骤完成一次用户访问操作。
与不部署CDN服务相比,减少了1个节点,4个步骤的访问。极大的提高的系统的响应速度。
2.2 CDN优缺点
(1)优点(摘自百度百科)
1、本地Cache加速:提升访问速度,尤其含有大量图片和静态页面站点;
2、镜像服务:消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量;
3、远程加速:远程访问用户根据DNS负载均衡技术智能自动选择Cache服务器,选择最快的Cache服务器,加快远程访问的速度;
4、带宽优化:自动生成服务器的远程Mirror(镜像)cache服务器,远程用户访问时从cache服务器上读取数据,减少远程访问的带宽、分担网络流量、减轻原站点WEB服务器负载等功能。
5、集群抗攻击:广泛分布的CDN节点加上节点之间的智能冗余机制,可以有效地预防黑客入侵以及降低各种D.D.o.S攻击对网站的影响,同时保证较好的服务质量 。
(2)缺点
1.动态资源缓存,需要注意实时性;
解决:主要缓存静态资源,动态资源建立多级缓存或准实时同步;
2.如何保证数据的一致性和实时性需要权衡考虑;
解决:
- 设置缓存失效时间(1个小时,最终一致性);
- 数据版本号;
2.3CND架构参考
摘自《云宙视频CDN系统》
2.4 CND技术实践
目前,中小型互联网公司,综合成本考虑,一般租用第三方CDN服务,大型互联网公司,采用自建或第三方结合的方式。比如淘宝刚开始使用第三方的,当流量很大后,第三方公司无法支撑其CDN流量,淘宝最后采用自建CDN的方式实现。
淘宝CDN,如下图(来自网络):
三、反向代理缓存
反向代理是指在网站服务器机房部署代理服务器,实现负载均衡,数据缓存,安全控制等功能。
3.1缓存原理
反向代理位于应用服务器机房,处理所有对WEB服务器的请求。如果用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户springmvc+mybatis+spring 整合 下载地址 。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。通过降低向WEB服务器的请求数,从而降低了WEB服务器的负载。
反向代理一般缓存静态资源,动态资源转发到应用服务器处理。常用的缓存应用服务器有Varnish,Ngnix,Squid。
3.2 Squid示例
Squid 反向代理一般只缓存静态资源,动态程序默认不缓存。根据从 WEB 服务器返回的 HTTP 头标记来缓冲静态页面。有四个最重要 HTTP 头标记:
Last-Modified: 告诉反向代理页面什么时间被修改
Expires: 告诉反向代理页面什么时间应该从缓冲区中删除
Cache-Control: 告诉反向代理页面是否应该被缓冲
Pragma: 用来包含实现特定的指令,最常用的是 Pragma:no-cache
Squid 反向代理加速网站实例
(1) 通过DNS的轮询技术,将客户端的请求分发给其中一台 Squid 反向代理服务器处理;
(2) 如果这台 Squid 缓存了用户的请求资源,则将请求的资源直接返回给用户;
(3) 否则这台 Squid 将没有缓存的请求根据配置的规则发送给邻居 Squid 和后台的 WEB 服务器处理;
(4) 这样既减轻后台 WEB 服务器的负载,又提高整个网站的性能和安全性。
3.2 代理缓存比较
常用的代理缓存有Varnish,Squid,Ngnix,简单比较如下:
(1) varnish和squid是专业的cache服务,nginx需要第三方模块支持;
(2) Varnish采用内存型缓存,避免了频繁在内存、磁盘中交换文件,性能比Squid高;
(3) Varnish由于是内存cache,所以对小文件如css,js,小图片啥的支持很棒,后端的持久化缓存可以采用的是Squid或ATS;
(4) Squid功能全而大,适合于各种静态的文件缓存,一般会在前端挂一个HAProxy或nginx做负载均衡跑多个实例;
(5) Nginx采用第三方模块ncache做的缓冲,性能基本达到varnish,一般作为反向代理使用,可以实现简单的缓存。