前段时间看到,有人在读过《大型网站技术架构》一书后做的思维导图,感觉很有意思,这本书把怎样做好一个大型网站的技术架构设计,整理得比较全面,值得学习一下。
以前我们都会专注于自己的那一块领域,很少从一个全局的角度看系统的技术架构设计,其实有这样的全局意识我觉得很有必要。从他整理的八张思维导图中可以得知,一个大型网站的技术架构所应承载的能力和设计,是不容轻视的。
在设计之前,提到了大型网站的架构演化历程、架构设计的模式和网站架构设计的核心要素,然后纵向挖掘网站设计的高性能架构、高可用架构、伸缩性架构、可扩展架构和安全性架构,这里我挑一个大型网站的高性能架构来一起聊一聊。
先偷一张思维导图:
图里基本上介绍了网站的高性能架构,应该具备的设计有哪些,其中前端的cdn加速、反向代理,服务端的分布式缓存、集群和异步消息队列是我们经常用到的,下面就先聊一下cdn加速和反向代理。
CDN的全称是Content Delivery Network,即内容分发网络。它是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
简而言之:CDN就是为了网络内容访问速度”更快“而生的。
举个例子,用户在北京家里访问美国纽约的一个网站,从北京到纽约大概1万多公里,假设网络传输速度接近光速,按照光速30万km/s 的传输速度,一束光从北京到纽约也至少需要 30ms 时间,一个往返就需要 60ms,加上传输损耗,传输设备延时引入等,可能上百毫秒就来了。
访问一个100K的甚至更小的图片你都要100毫秒,那如果是一个大型的购物网站呢,积少成多延时会成倍的增加,还有可能访问失败,这对用户体验来说是很差的。
CDN的出现,正是为了解决这个问题。我们将这张图片分发并缓存在中国的CDN节点之上,中国用户就无需从纽约获取数据,直接从就近的北京本地CDN节点获取到图片,这大大节省了传输时间,提升访问效率。CDN的节点通常会遍布全球,源站的文件会被被缓存到世界各地,这样全球用户都可以实现快速访问。
就跟我们网购后,商家直接快递给你送到丰巢自取柜,而不需要你去商家厂地拿商品一个道理。
下面来说一下cdn的工作原理,首先介绍一下定义:
Origin Server源站:网站真正的服务器。
User:访问者,也就是要访问网站的网民。
Last Mile:最后一公里,指的是也网民到离他最近的 CDN 服务器。
域名:域名是Internet网络上的一个服务器或一个网络系统的名字,全世界,没有重复的域名。
CNAME:它是一个别名记录( Canonical Name );当 DNS 系统在查询 CNAME 左面的名称的时候,都会转向 CNAME 右面的名称再进行查询,一直追踪到最后的 PTR 或 A 名称,成功查询后才会做出回应,否则失败。
DNS:DNS即Domain Name System,是域名解析服务的意思。它在互联网的作用是:把域名转换成为网络可以识别的ip地址。人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是一一对应的,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。比如:上网时输入的baidu.com会自动转换成为220.181.112.143
LDNS:我们平时所工作的电脑里,都会配置(人为或自动)一个 DNS 服务器地址,我们称之为”本地 DNS“,也叫 Local DNS,简称 LDNS。
边缘节点:也称CDN节点、Cache节点等;是相对于网络的复杂结构而提出的一个概念,指距离最终用户接入具有较少的中间环节的网络节点,对最终接入用户有较好的响应能力和连接速度。其作用是将访问量较大的网页内容和对象保存在服务器前端的专用cache设备上,以此来提高网站访问的速度和质量。
Cache:cache高速缓冲存储器一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问。
先用一张流程图介绍一下CDN的调度过程:
①用户点击网站页面上的内容URL,指向网站DNS服务器
②经过网站DNS解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器。
③CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回用户。
④用户向CDN的全局负载均衡设备发起内容URL访问请求。CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。
⑤区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址。
⑥全局负载均衡设备把服务器的IP地址返回给用户。
⑦用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。
其中第一步在请求某个域名时,LDNS 一般有两个情况:一种是域名在 LDNS 上有记录,另一种情况是没有记录,两种情况的处理流程不一样。
假设当访问 abc 这个域名时,如果 LDNS 上有缓存记录,那它会直接将 IP 地址吐出来。
如果没有缓存记录,它将会一步步向后面的服务器做请求,然后将所有数据进行汇总后交给最终的客户,这个环节术语叫”递归“。
在完全不命中情况,LDNS 首先会向全球13个根域服务器发起请求,询问 .com 域名在哪里,然后根域服务器作出回答,然后去向 .com 的服务器询问 .abc.com 在哪里,一步步往下,最后拿到 www.abc.com 这个域名所对应的 IP 地址。
在调度的最后一步,是让用户请求到了缓存服务器中,那CDN的缓存系统工作原理是怎样的呢,其实和服务端做的缓存异曲同工:
对于 CDN 来说,每台 Cache 机器每天的请求量是十分惊人的,磁盘上所存储的内容量也多得可怕,十几块 TB 级的硬盘被塞满数据也是很正常的事情,因此当一个请求到来时,能迅速检索出磁盘上的文件并读取、吐给最终用户成了一件很重要的事情。
CDN的缓存数据,采用了混合盘的分级存储方式,即SSD+SATA,通过热度算法将最热的内容放到内存、次热放到 SSD,冷数据放到 SATA,最冷数据受磁盘空间限制不进行存储,直接从 upstream 或源站获取。
另一种提高性能的方式,反向代理:
说到代理,只要明确一个概念,所谓代理就是一个代表、一个渠道;
正向代理代替客户端请求服务器,隐藏了真实请求的客户端,常用事例:翻墙-用国外服务器做正向代理,访问Google,实现国内访问Google。
反向代理收下客户端的请求,假装自己是真正的服务器端返回信息给客户端,隐藏真实的服务器。
反向代理位于用户和应用服务器之间,是连接用户和服务器的中介,可以在中间做许多事情:
1.缓存,将服务器的响应缓存在自己的内存中,减少服务器的压力。
2.负载均衡,横向扩展服务器集群,提高集群整体并发能力和抗压能力。
3.访问控制,只接受有效的请求
4.安全控制,拦截恶意请求,http请求数据压缩
耳熟能详就是Nginx反向代理了,目前比较流行的应该是基于Nginx和Lua做的高性能web平台Openresty,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关,很大程度上提高了访问性能和安全性。
前面聊的是网站前端所做的高性能设计,都是常用的基础知识,了解和熟悉就行,服务端进入下节未完待续。。。。