昨天和新人交谈的时候,发现他们对网站整体的访问和架构都不清楚,所以想着可以写一篇比较白话一点的技术入门文章,内容上也可以慢慢丰富。

马上就是国庆了,然后你想出去旅游,你打开了Ctrip。下面来看看,当你在浏览器轻轻 www.ctrip.com 以后发生了什么?

首先你的浏览器查询了DNS服务器(注:能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP地址,例如192.168.1.1),现在DNS服务器将 www.ctrip.com 转换成IP地址,机器能直接读取了。

不过浏览器发现,在不同的地区或者不同的网络(电信、联通、移动)的情况下,转换后的IP地址很可能是不一样的,这首先涉及到全局负载均衡【GSLB】(注:相当于几万人的大学,一个食堂不够用,于是学校弄了五个食堂来服务所有的同学,这就叫负载均衡)。第一步,通过DNS解析域名时将你的访问分配到不同的入口,同时尽可能保证你所访问的入口是所有入口中可能较快的一个。

好了,现在你通过这个入口成功的访问了 www.ctrip.com 的实际的入口IP地址。这时你产生了一个PV(注: Page View,一次页面访问),每日每个网站的总PV量是形容一个网站规模的重要指标。同时作为一个独立的用户,你这次访问Ctrip的所有页面,均算作一个UV(注:Unique Visitor用户访问)。卖火车票的12306.cn的日PV量最高峰在10亿左右,而UV量却相对比较小,这其中的原因我相信大家都会知道。

因为同一时刻访问 www.ctrip.com 的人数过于巨大,所以即便是Ctrip首页页面的服务器,也不可能仅有一台。仅用于生成 www.ctrip.com 首页的服务器就可能有成百上千台,那么你的一次访问时生成页面给你看的任务便会被分配给其中一台服务器完成。(注:相当于学校有5个食堂,二食堂3窗口老是爆满,因为打菜的是个萌妹子。)

这个过程要保证公正、公平、平均(注:这成百上千台服务器每台负担的用户数要差不多,就像食堂不能颠勺),这一很复杂的过程是由几个系统配合完成,其中最关键的便是负载均衡。负载均衡分为L4负载均衡、L7负载均衡。L4负载均衡,商业产品有A10、Netscaler、F5等,开源有LVS;L7负载均衡,比较常用是nginx、haproxy,当然那些商业产品基本上也都支持L7的负载均衡。通过负载均衡,可以把请求公平的分给各个服务器去处理。

然后经过一系列复杂的逻辑和处理(此处省略…),用于这次给你看的Ctrip首页的内容便生成成功了。

然后你会发现,首页的加载过程中,浏览器会请求大量的图片和静态资源,可以看到这些资源的是不同的ip返回的response。这便是CDN(Content Delivery Network),即内容分发网络的作用,它利用一些手段保证你访问的地方是离你最近的CDN节点,这样便保证了大流量分散在各地访问的加速节点上,同时用户也获得了更好的访问体验。这些静态资源是缓存在CDN节点上的,当你更新了一张图片的时候,你可以刷新CDN节点上的缓存,这样用户的请求到达CDN节点上后,会向我们的源站发起请求,CDN获取到资源后,会返回给用户,同时把这个资源也缓存起来,再有用户的访问,就直接从缓存里拿。