WEB架构简述

WEB访问过程

首先简述一下访问网页的过程:
在浏览器地址栏输入网址如京东:”jd.com“回车,浏览器很智能,会把你输入的地址转换成标准url即:http://jd.com/:80,最后面”/“指请求资源的uri,不带任何字符则是请求根目录,”:80”指端口号,指访问地址的对应端口,默认”/“和80端口会隐藏,让普通用户看起来不疑惑,专注于网页内容。你可能看到返回的网址会变成https://www.jd.com,是因为京东的web服务器对用户输入的jd.com做处理了,返回一个安全的页面。实际是发送http请求。
浏览器会先对域名进行DNS解析,把域名解析成公网地址。浏览器会通过以下几步来获取解析:

  1. 先检查浏览器本身DNS缓存
  2. 查找系统HOST文件是否有对应记录
  3. 查找系统DNS缓存
  4. 查找本地的DNS服务器缓存
  5. 发送DNS请求到根服务器来获得IP地址
    获取到IP地址后,就向该地址服务器发送HTTP请求,服务器响应请求并返回一个页面,浏览器收到响应后渲染页面。

从点击访问到看到页面经历哪些时间

  1. DNS解析时间:通常在20-50ms左右
  2. 数据传输时间:发送HTTP请求(跟网络带宽有关),接收并返回数据(请求数据内容大小有关)
  3. 处理请求时间:建立连接,等待服务器响应(服务器查库,计算,生成页面)
  4. 浏览器渲染时间(浏览器算法不一样渲染的时间也不一样)

单机架构

LNMP+ECSHOP开源商城搭建在同一台服务器

  1. 单点故障(可以定期备份)
  2. 性能有瓶颈
  3. web和db在一起会相互影响(web忙的时候查询数据库,数据库也很忙,就会很慢,web处理请求就会很慢,就会一堆请求排队,会导致web更慢,这是一个叠加的效应)

组件及读写分离

实现方法:

  1. 在web1上做负载均衡把请求分发到两台web服务器上,在web2上做备节点
  2. 弄两域名如web1.xxx.com和web2.xxx.com,无论用户访问哪个域名都是同一个页面(原理跟游戏选网络节点一样,是电信还是联通或者软件站下载通道),所有技术都是有应用场景,整个框架的设计是根据业务来决定的,而不是新技术。
  3. DNS轮询,使用单条域名绑定多条A记录,有负载均衡的局限性:
    • 无法快速踢出故障节点:假如其中一台服务器宕机,即其中一条记录失效,需要手动删除失效的记录,但是DNS有缓存时间,在DNS时间失效前,访问就会出问题,当然可以使用脚本当宕机就直接切换IP。
    • 负载不均衡:服务器硬件配置不同,DNS缓存影响,不同地区DNS缓存劫持不一样,有些地区永远获取到同一个地址

DNS轮询应用场景:

  1. 有多个集群,有多个A记录,配成智能DNS,根据客户IP来做
  2. 全局负载均衡
  3. 用于主机流量的切换或节点的替换,给域名添加多一条记录就是新主机IP,在DNS失效前就是用DNS轮询

单机架构到集群演变

集群

什么是集群
多台同构或异构的服务器集中起来对外提供相同的服务,可以叫这堆服务器做集群,服务器不一定是要全部是linux或windows的,也可以是异构的。
分类:

负载均衡LB

提高资源利用率,使用多种调度策略,尽量把任务分发得更均匀。当出现故障能够快速切换,但不能把负载均衡配置在web服务器上,可以放到DB服务器上,因为要有第三方仲裁才能确保宕机的消息是可靠的。不能单纯PING不同就认为节点DONM了,有可能是到该节点的网络不通,也可能是网络拥堵,并不意味着服务器宕机,如果这时候切换,就会造成混乱。需要过一段时间再尝试PING,需要有次数限制,如果再不通,就设置一个SLEEP时间,过了SLEEP时间再尝试。经典案例是支付宝回调通知的一种方式。实现:

  1. DNS轮询
  2. HTTP重定向:使用location跳转,一般为业务原因需要用到,或者备案原因
  3. 反向代理:代理用户的请求,向真实服务器发送请求,再把结果返回给用户,下载类网站不适合使用反向代理局限于带宽和性能问题,如果是下载类很容易把带宽占满,同时有高并发的情况,性能会很差。可以马上停掉从库,主库读写,然后从库再弄一个反向代理来分流,后面再优化架构。
  4. IP负载均衡:
    • 如LVS的NAT模式:LB充当网关的功能,用户发送请求,目的地址是VIP虚拟IP,源地址是用户IP,到达LB设备后进行调度,发送数据包目的地址为服务器IP,源地址是用户IP,到达服务器后,服务器根据用户IP发送给网关,也就是LB设备,LB设备再修改数据包,把源IP改为VIP。这样最大特点是服务器的网关必须要设置成LB服务器的VIP,不然就无法通讯,LB设备对双向的数据包进行改写,与反向代理不同的是,LVS不向用户负责,只负责转发,不负责请求。而且LVS不支持健康检查,健康检查是keepalived或者是其他软件如heartbeat里面的active director做的。
    • LVS的DR模式:用户请求到达LB设备,LB设备进行调度,转发数据包到服务器,服务器直接返回给用户,不再经过LB设备。此模式实际上是二层负载均衡,LB设备只修改MAC地址(ARP协议)。缺点是配置麻烦,不能跨局域网,监听端口不能改。下载类可以用DR模式,少了一次转发。

高可用HA

健康检查,高可用性,防止脑裂—仲裁设备:关机。两台反向代理服务器合理利用如何实现:

  1. 多组互备:使用两套集群,集群A中代理A为主,B为备,集群B中代理A为备,B为主。缺点:雪崩效应
  2. 备机做服务器监控,数据库备份或者定时任务等
  3. 做web节点

高性能HPC

WEB架构集群

WEB架构缓存

打开京东网站,查看源代码,可以看到有link rel的内容

1
2
3
4
5
6
7
8
9
10
11
12
<link rel="dns-prefetch" href="//static.360buyimg.com"/>
<link rel="dns-prefetch" href="//misc.360buyimg.com"/>
<link rel="dns-prefetch" href="//img10.360buyimg.com"/>
<link rel="dns-prefetch" href="//img11.360buyimg.com"/>
<link rel="dns-prefetch" href="//img12.360buyimg.com"/>
<link rel="dns-prefetch" href="//img13.360buyimg.com"/>
<link rel="dns-prefetch" href="//img14.360buyimg.com"/>
<link rel="dns-prefetch" href="//img20.360buyimg.com"/>
<link rel="dns-prefetch" href="//img30.360buyimg.com"/>
<link rel="dns-prefetch" href="//d.3.cn"/>
<link rel="dns-prefetch" href="//d.jd.com"/>
<link rel="icon" href="//www.jd.com/favicon.ico" mce_href="//www.jd.com/favicon.ico" type="image/x-icon"/>

这个是HTML5的新功能,叫DNS预获取。在HTTP头部插入,把页面内所有需要获取DNS的元素先获取缓存一遍,这样当请求到对应资源的时候就会很快。

WEB架构存储

数据库扩展

结语

没有绝对好的架构,只有合适的架构,当引入一个新的架构,解决了当前问题,同时也会产生其他问题。没必要指点他人架构,存在即合理,当你看到别人的架构,多想想为何这样用,这种架构的好处是什么,优点是什么。一个好的架构,就是在有限的资源里,把架构做到最优,能充分利用所有资源,达到最大的效果。

分享到