QuXiao's Blog

Life && Tech && Thoughts

互联网应用IDC/CDN部署分析实践

Written on

前言

一款互联网应用,在其生命周期中,也许能够一直保持着功能上的足够专注、体验上的足够简约。但是,随着产品的功能增强、市场运营深入,知名度增长、访问量增大,即使在保持功能、体验不变的情况下,应用的部署只会变得日趋复杂,以保证在不影响用户体验的前提下,承受巨大访问量的应用仍然是可用、快速、流畅的。 典型的互联网应用,会分为:接入层、转发层、动态层/静态层、服务层、 存储层等层次。为了满足这样的需求,需要在应用的各个层次进行优化,例如接入层部署在在多个运营商、多个IDC [1] 、将静态层资源(图片/CSS/JS)部署至CDN [2],等等。

从用户的角度看,各种互联网应用都是一个“黑盒”,你只有体验上的感觉,却不能了解应用是如何部署的,当然这也不是用户需要关心的。但是,作为互联网领域的研发或者产品人员,可能就需要实时掌握自己产品或者竞品的应用部署情况了,并且希望进一步得到详细的产品性能数据,了解到真实用户的体验情况,作为自己产品功能取舍、架构调整的依据,也可以作为竞品分析的第一手资料。如果是自己的产品,或许可以通过专职运维、研发人员了解到部署情况,但是对应竞品,就变得十分困难。

由于本人目前正在从事应用性能管理(APM)领域产品的研发,本文将结合实际开发中的经验,介绍一些与互联网应用IDC/CDN部署分析相关的原理和技术。

技术原理

一个互联网产品,都是一个从无到有、从小到大(大多数再从有到无……)的过程,部署、架构一步步变得复杂,我们就来跟随着这个过程,讲解其中遇到的各项技术吧。

应用部署初期

首先,肯定是一群充满激情的研发人员经过了没日没夜的紧张开发,将应用部署到了网络上。一开始流量不大,加之时间紧张,能让用户看到产品是最重要的,因此这个阶段,只需要用几台甚至一台服务器,web应用、后端服务、数据库、缓存等都可能部署在同一台服务器上。根据团队资金的不同情况,团队会考虑租用IDC机房的服务器,或者选择各大云主机,但是不管选择哪种,每台服务器都至少有一个公网IP。服务器有时也会配置多块网卡,每一块网卡使用不同运营商的公网IP。然后,再通过配置域名A记录,用户键入域名就可以连接这台服务器的web应用了。

对于域名A记录,我们可以通过 dig 命令来进行查询。例如,查询我的博客的A记录:

dig +noall +answer blog.goquxiao.com
blog.goquxiao.com.  9   IN  A   107.170.219.167

可以看到,因为只在一台服务器上面进行了部署,所以通过 dig ,返回的A记录只有一个公网IP。

多运营商部署

通常,如果服务器只有一个公网IP(除非是BGP),都是针对某一个运营商的。假设IP所属运营商的电信的,那么联通用户访问你的产品,就会存在跨网的问题,导致访问速度(首包以及后续数据传输)过慢。这时候,就需要将应用部署在不同运营商线路中,并且在域名解析服务配置中,按照不同运营商线路来配置不同的IP。以下是DnsPod配置的页面示意图:


那么,对于一个域名,我们如何找到它在不同运营商线路下的A记录呢?我们还是用到 dig ,除了上面的用法, dig 还可以在参数里面加上dns server, dig 就会输出这个dns server返回的该域名的A记录。例如,我们知道一个上海电信的dns server为101.226.4.6 ,一个北京联通的dns server为161.207.5.5,我们来看看分别用这两个dns server运行 dig 解析域名,得到的结果有什么不同:

dig +noall +answer @101.226.4.6 www.baidu.com
www.baidu.com.      790 IN  CNAME   www.a.shifen.com.
www.a.shifen.com.   100 IN  A   180.97.33.107
www.a.shifen.com.   100 IN  A   180.97.33.108

dig +noall +answer @161.207.5.5 www.baidu.com
www.baidu.com.      1195    IN  CNAME   www.a.shifen.com.
www.a.shifen.com.   300 IN  A   61.135.169.121
www.a.shifen.com.   300 IN  A   61.135.169.125

可以看出来,不同运营商的dns server,会解析出不同的IP。并且,通过在线的IP库服务,我们可以知道,电信的dns server解析出的是电信的IP;联通的dns server解析出的是联通的IP。下面是淘宝IP库的解析结果如下:

http://ip.taobao.com/service/getIpInfo.php?ip=180.97.33.107
{
    "code": 0,
    "data": {
        // 去掉了多余信息
        "isp": "电信",
        "isp_id": "100017",
        "ip": "180.97.33.107"
    }
}

http://ip.taobao.com/service/getIpInfo.php?ip=61.135.169.121
{
    "code": 0,
    "data": {
        // 去掉了多余信息
        "isp": "联通",
        "isp_id": "100026",
        "ip": "61.135.169.121"
    }
}

这样,对于不同运营商的用户,就可以通过部署不同运营商IDC的方式,来降低用户的访问延时,避免用户跨网访问了。

冗余部署

现在应用进行了多运营商得部署,至少三大运营商的用户访问应用,不会因为跨网访问而导致体验糟糕。但是,随着用户访问量一步步增大,每个运营商线路上部署一台服务器已经无法满足性能方面的需求了。正所谓“能用钱解决的都不是事儿”,于是对web应用进行冗余部署(俗称“加机器”)就是一个最简单直接的解决方法,用于将巨大的用户流量分散在不同的机器上面。

在上面的 dig 的样例中我们可以看到,一个域名可能会包含多条A记录,这就是web应用进行了冗余部署。这都是域名解析服务的功劳,我们将所有web应用服务器的IP在域名解析服务中进行配置了,这样就达到了一个域名对应多个外网IP,用户访问域名时,就会由域名解析服务器根据用户的运营商线路返回不同的IP列表,达到分散流量的作用。

随着访问量的进一步增加,服务器的数量也在不断增加中。如果还像上面那样每增加一台服务器,就把IP添加至域名解析服务的A记录中,未免有些麻烦。另外,如果遇到应用进行架构升级、停机重启服务等情况,也无法让线上服务做到无损升级。这个时候,就需要用到 Virtual IP 技术 [3] ,即服务对外有一个虚拟的IP,这个IP背后对应着多台真实的服务器IP ( Virtual IP 技术这里就不展开讲了)。这样,只需要将这个虚拟IP添加至域名解析的A记录即可,就不需要频繁更新域名解析配置了。事实上,绝大多数大型网站,域名解析出的IP都是虚拟IP。这样一来,我们也就无法通过A记录来得知真实服务器的数量,不过这并不妨碍我们了解web应用的IDC运营商覆盖以及地域分布。

配置CDN

新闻资讯或者休闲娱乐类的互联网应用,会使用较多的图片、视频等静态资源,对于这些资源的大量访问,意味着消耗了巨大的带宽。即使web应用已经进行了冗余部署,但是如果这些资源均放在web应用服务器上面,请求这些占用带宽较多的静态资源会“拖垮”服务器。并且别忘了,一般而言,服务器或者云主机租用费用的一大部分就是服务器外网流量,流量越大、成本就越高,这样就会显得很不划算。

为了应对此类需求,互联网应用的开发/运维人员一般会选择使用CDN。开发/运维人员通过对静态资源域名进行 CNAME [4] 配置,使得静态资源请求最终指向CDN缓存服务器。CDN厂商则将利用分散在全国的CDN节点,将web应用源站中的静态资源进行抓取、分发、缓存,用户访问这些资源时,就可以从最近的CDN节点中获取数据,不必去访问原来的服务器,节省了源站服务器的网络流量,提高了用户的浏览体验。因此,是否配置CDN,就成了影响用户体验的一项因素。

我们以 7k7k.com 为例,我们可以看出,网页里面图片URL的域名都是 *.7k7kimg.cn

我们来查询其中一个域名 i1.7k7kimg.cn 的解析结果:

dig +noall +answer i1.7k7kimg.cn
i1.7k7kimg.cn.      441 IN  CNAME   i.7k7kimg.cn.
i.7k7kimg.cn.       512 IN  CNAME   i.7kcdn.cn.
i.7kcdn.cn.     429 IN  CNAME   i.7k7kimg.cn.fastcdn.com.
i.7k7kimg.cn.fastcdn.com. 599   IN  CNAME   xnop035.fastcdn.com.
xnop035.fastcdn.com.    599 IN  CNAME   xnop035.tlgslb.com.
xnop035.tlgslb.com. 117 IN  A   218.92.1.191
xnop035.tlgslb.com. 117 IN  A   218.92.1.221
xnop035.tlgslb.com. 117 IN  A   218.92.219.44
xnop035.tlgslb.com. 117 IN  A   218.92.219.102
xnop035.tlgslb.com. 117 IN  A   58.222.17.19
xnop035.tlgslb.com. 117 IN  A   58.222.17.40
xnop035.tlgslb.com. 117 IN  A   58.222.17.41
xnop035.tlgslb.com. 117 IN  A   58.222.17.54
xnop035.tlgslb.com. 117 IN  A   58.222.17.57
xnop035.tlgslb.com. 117 IN  A   58.222.17.58
xnop035.tlgslb.com. 117 IN  A   218.92.1.131
xnop035.tlgslb.com. 117 IN  A   218.92.1.141
xnop035.tlgslb.com. 117 IN  A   218.92.1.166
xnop035.tlgslb.com. 117 IN  A   218.92.1.167

从解析结果中可以看出,经过一系列的 CNAME 转换,最终得到了数量较多的A记录,这些IP对应的就是CDN缓存服务器,或者说是CDN节点。另外,我们还能通过 CNAME 来判断CDN厂商,比如上面看到的 i.7k7kimg.cn.fastcdn.com ,我们可以查询到7k7k使用了帝联的CDN。


好了,至此与IDC/CDN部署相关的技术原理我们就讲到这,下面来详细介绍下我们的APM产品中的网络分析工具。

网络评测产品

介绍

我们的APM产品分为:即时评测、持续监测、全站加速三大部分。即时评测中的一项功能,就是实时分析网站的IDC/CDN节点分布、以及各个地区/运营商用户的解析结果,用最直观、也最详细的方式展现给用户,并且综合各个维度的数据,对网站的IDC/CDN/ISP/DNS进行评分。

我们先来看一下截图,以下是网络分析的结果页面:


上图直观的展现了网站IDC/CDN在全国的分布情况以及各维度的评分。另外,我们还会在页面上展现详细的结果。详细结果分为:分布视图、解析视图、以及主机视图三大部分。分布视图展示了IDC/CDN节点的分布以及使用的CDN厂商;解析视图展示了每个地区/运营商用户的网站域名解析结果的分布;主机视图则展示了IDC/CDN服务器的IP信息。

分布视图


解析视图


主机视图


处理流程

对网络分析功能有了大致的了解之后,再来梳理一下从用户键入URL到最终展现结果的整体处理流程。流程入下图所示:

其中,绿色部分表示前端处理部分,蓝色部分表示后端服务处理部分。

当用户打开我们的即时评测页面,键入网址,点击评测按钮之后,前端首先会做URL检测,以保证输入的网址是符合URL规范并且真正可以访问的,然后将URL发送给后端网络分析服务。后端网络分析服务分为两大支线:IDC分析,以及CDN分析。

IDC分析,是指直接对URL中对应的域名,通过全国的dns server以及全国真实客户端,进行域名解析操作,得到一系列类似 domain -> (ip list, cname list) 的数据。之后将两份数据进行合并。合并之后的数据,再通过查询IP库得到IDC的地域/运营商分布情况。最后,对这些数据按照运营商和地域的维度进行统计,将统计之后的数据发送给前端用于展现。前端拿到数据之后,会对数据进行验证、打分,并且调整为不同格式,最终展现在网络分析结果页面上。

CDN分析和IDC分析处理过程类似,只是之前需要通过解析URL的内容,通过算法获取该网页对应的CDN域名,然后再用这个CDN域名进行和IDC分析一致的处理步骤。

网页CDN厂商查找

CDN分析过程中,其中一个步骤是获取网页中的CDN域名。其实,我们并不能100%准确的知晓某个网页是否使用了CDN,或者在哪些资源上使用了CDN。不过,我们可以通过一定的算法来判断网页上的哪个链接“可能”是CDN域名,最终选出可能性最大的那个域名作为这个网页的CDN域名,交由网络分析服务进行处理。

我们目前的处理流程如下:

  1. 获取网页中的所有资源URL,放入 resource_url_list
  2. 遍历 resource_url_list
    1. 如果判断链接为广告/统计/在线客户链接,将其过滤,处理下一个链接
    2. 如果链接域名为非主域域名(主域域名即用户输入的URL对应的域名),将其加入候选列表 candidate_domain_list
    3. 如果链接域名为主域域名,但是该域名有 CNAME 并且不为主域域名,也将其加入候选列表 candidate_domain_list
  3. 处理 candidate_domain_list ,按照 <域名,出现次数> 的格式统计为 domain_num_dict
  4. 遍历 domain_num_dict 中的domain
    1. 如果domain包含CDN关键词(例如:img/static/cdn/...),将其保留
    2. 如果domain包含已知的CDN域名,将其保留
    3. 否则,从 domain_num_dict 中去除
  5. domain_num_dict 中出现次数最多的域名作为该URL的CDN域名

过滤广告/统计/在线客户链接这个步骤,它的目的是为了去掉那边网页的“噪声”,更加准确地提取出网页的CDN域名。维护一份URL的黑名单,是这个步骤的核心工作。

如果人工一步步慢慢收集,除非有专人维护,否则在团队初期人员较少的情况下,是不现实的。因此,这里借鉴了浏览器广告过滤插件的思路,参考著名广告过滤插件厂商 AdBlock Plus 在网络上公开的中国地区广告链接数据 [5],制作了一份广告/统计/在线客户“黑名单”数据,用于在网站CDN域名判断过程中去除掉那些链接。

结论

本文结合了笔者在实际开发过程中的经验,首先以互联网产品由小到大的发展过程为例子,讲解了其中与IDC/CDN部署相关的技术原理,之后介绍了开发的网络分析工具的功能以及具体处理流程。过年期间,总结一下自己和团队所做的工作,希望能对大家有所帮助。

广告时间,如果大家对上面提供的网络分析感兴趣的话,欢迎访问我们的 官网 进行试用 :)

[1]IDC,即Internet Data Center,是基于Internet网络,为集中式收集、存储、处理和发送数据的设备提供运行维护的设施基地并提供相关的服务。
[2]CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
[3]Viritual IP是一种IP负载均衡技术,主要作用是改变网络结构,合理分配网络资源,均衡网络负载,以及满足灾难恢复的需求。
[4]CNAME指别名记录,也被称为规范名字。这种记录允许您将多个名字映射到同一台计算机,通常用于同时提供WWW和MAIL服务的计算机。
[5]https://easylist-downloads.adblockplus.org/easylistchina.txt
comments powered by Disqus