您的位置:首页 > 运维架构 > Linux

Linux_Varnish_代理缓存_基础概念(1)v1.0

2016-08-16 11:01 411 查看
官方4.X技术文档 http://down.51cto.com/data/2234205 Varnish是什么?
Varnish是一款高性能的开源HTTP加速器,(Web cache).web缓存服务器:
整个web流程,结构图:



图上所有节点均是高可用模型 :做任何事都要有冗余
当客户端访问某网站是,从网络地址(FQDN)通过DNS解析成ip地址时,不同地区的用户可能解析到的IP地址是不同的,所解析到的ip地址不一定就是DNS所对的FQDN,也是对应的营运商给CDN节点,CDN节点中存放着,要访问网站的部分信息,当CDN中没有的信息,再访问真正的服务器
************************
CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
(1)之所以用到CDN机制是因为,由于地理或网络原因 网页加载速度慢会导致大量客户流失 CDN则一般为地区型.相应速度较快
(2)CDN的另一个好处就是,有效的减少 主服务器组的请求压力
(3) 很多架构都是强依赖于CDN来减小主服务器的压力的,如果CDN挂了...那么大量请求涌向主服务器,后果可想而知
*************************
当用户请求真正到达主服务器时.资源被分为 动态资源【(结构化/半结构化数据存储在DB中)(非结构化数据)】、静态资源【可压缩资源(纯文本)、不可压缩资源(图片等)】两种.则可经过前段分发器分发到不同的后端服务器上.
而为了进一步减小服务器压力(服务器的主要压力并非是计算能力,而是速率(磁盘IO 网络IO)),则在分发器后直接加入缓存(代理式缓存.和旁路缓存),缓存是利用hash值作为缓存的名称(键值).所以速度相比差大量的磁盘数据要快的很多, 当缓存中的数据过期或者未命中(在缓存中没有找到数据)时,才会想后端查找数据,(数据是否放在缓存中要看设定)
缓存也可存放在内存中.速度会吊炸天.
****************************
为什么有些网站会有多个FQDN?
当客户端的浏览器(看浏览器是否支持并发处理) 访问资源时.默认情况浏览器会基于FQDN并发建立两个请求.来获取资源.使用多个FQDN.,浏览器看到多个FQDN地址.则可以继续并发请求别的资源,大大提升网页的打开速度(一个网站打开速度过慢就是钱)

****************************Varnish********************************************************
Varnish: (web cache) 代理式缓存:缓存的作用是被命中.若果不命中,性能反而下降,增加了处理步骤,产出必须大于产出.
缓存就是拿空间换时间的
程序的运行的局部性特征:
空间局部性: 某些数据被访问后,离它较进的数据也有可能被访问到(价值在于预读取)
时间局部性: 如果数据被访问到,很快会再次被访问到
数据的热区:局部性的表现:一些数据中,总有一小部分数据是被多次访问的,称为热区.缓存中存储的就是热区数据
缓存不具有可存储性,并具有新鲜度(时间限制,否则原始数据发生改变,缓存就过期了)
命中率:hit(hit+miss) (0.1)
页面命中率:基于页面数量衡量
字节命中率: 基于页面大小进行很来那个
时效性:
缓存清理:
过期清理:
缓存溢出清理:基于LRU(最近最少使用算法)
缓存与否:
私有数据:private cache:私有缓存 比如浏览器(browser) big cookie
公共数据: public cache:私有缓存 比如(reverser proxy,cache)
****************************
如何判断缓存是私有的还是公共的?
HTTP 1.1 基于报文首部 或 cache
****************************缓存的处理步骤***************************************
接收请求-->解析请求(提取请求首部的URL及其他首部)(私有的话直接反代给后端服务器)-->查询缓存-->(命中)/(转给后端服务器)-->新鲜度检测(新鲜return)/(转发给后端服务器)/(过期但原始数据没变,304.直接相应)-->构建响应报文-->发送相应-->log



第一次:
1.客户端基于HTTP 1.1 请求/foo 到foo.org 缓存中没有相关内容;
2. 通过反代把请求交给后端服务器
3.后端服务器发送首部:缓存控制(cache-control)
s-maxage=10 s:公共的 maxage 最大ttl(生存周期)
4.缓存服务器查看到缓存控制后 把内容和url基于hash算法缓存到缓存中
5.返回给客户端
在ttl过期之前:



1.请求
2. ttl到达之前
3.在缓存中查找到结果
4.构建相应报文
****************************
ttl过期



缓存过期,但原始数据没有发生改变.也请求后端服务器并将资源缓存到缓存中开始下一轮ttl轮询

****************************为了防止资源重新获取带来的带宽和资源浪费
不要小看此处的资源浪费.ttl只有10秒钟 缓存的内容如果较大 节约是很大的
****************************
HTTP Vaiidation:校验机制(有效性检查)
验证机制:
LAST Modifide /if-Modified-Since:(基于资源的时间戳来询问后端服务器)
HTTP/1.0 Expires 使用绝对时间Expires:Fri, 20 May 2016 02:03:18 GMT #方式服务器和客户端时间不同步
HTTP/1.1 Cache-Control:相对时常
Cache-Control: maxage=
Cache-Control:no-transform, s-maxage=3600
Etag/if-None_Match:每一个生成一个版本(控制标签 扩展标签)
****************************
第一次请求资源后端服务器附带(HTTP Vaiidation)
有了以上这种机制后,缓存服务器不再重新向后端主机重新申请整个资源,而是申请后端的(资源的时间戳/版本号)来确定资源是否已经变化(如果变化.后端服务器返回资源,否则返回304 Not Modified)



请自行脑部
****************************







****************************
HTTP Headers
Cache-Control:cahe-request-directive= 缓存的请求报文首部
no-cache #客户端请求资源时,不管ttl是否过期,都去后端服务器校验后返回(并不是不缓存,而是必须检查)
|no-store #阻止敏感信息返回给客户端
|max-age #最大缓存时常
|max-stale
|min-fresh
cache-response-directive= 缓存的相应报文首部
public 公有缓存
|private 仅能放在私有缓存(大多数是浏览器之中)
|no-cache
|no-store
|must-revalidate
|max-age
|s-max-age
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Varnish