1. 调度系统是什么?

调度系统是指CDN厂家有能力通过各种机制将客户域名的所有现网请求引导到合适的目标机房,从而实现流量控制、质量控制、成本控制以及故障处理。

2. 接入CDN的方式

在讲解调度原理之前,我们先来看看客户是怎么接入CDN的,或者说客户的流量是如何切往CDN的。(假设客户的域名为:www.test.com,大概有以下几种方式:)

【1】CNAME方式

CNAME方式是最常见的接入方式,即CDN厂家向客户提供一个调度域名,客户将自己业务域名的CNAME指向这个调度域名,从而实现将请求引导到CDN上来。

腾讯云向客户提供的CDN是 $domain.cdn.dnsv1.com ,客户的域名 www.test.com 如果需要将请求切到腾讯云CDN上,只需要将 www.test.com 的CNAME 设置为 www.test.com.cdn.dnsv1.com 即可。

CNAME方式的背后,又分为以下几种模式:

01

CDN厂家提供基于DNS的调度,最终客户的域名经CDN的调度域名解析出CDN节点的IP。腾讯云CDN即采用这种模式。

02

CDN厂家提供基于302的调度,给的CNAME不是真正CDN节点,而是一个调度集群,真正的CDN IP地址是通过在调度集群上向请求响应302跳转实现的。腾讯云为一些手机厂家的下载业务提供过这种模式

03

再有一种,是Anycast CDN。从DNS层面上看,CDN厂家提供给你的CNAME的解析结果只有全球固定的一两个IP地址,不像方式1中不同地区的解析结果IP不同。这种场景下的流量调度,不是靠DNS解析,而是Anycast BGP路由的调整,通过调整Anycast的路由来调度各地区的流量到哪个机房。

【2】调度域名深度定制方式

这种模式主要是一些代理商客户,即使用腾讯云CDN来接客户,又想在DNS层面隐藏他们使用的CDN厂商。一般做法是客户提供一个自己的域名比如:gslb.mycdn.com,腾讯云也提供一个中性的且不备案的平台调度域名glsb.mycdn-platform.com。真正的客户域名 www.test.com CNAME到 gslb.mycdn.com ,后者CNAME到腾讯云的调度域名 gslb.mycdn-platform.com。这样整个解析环节都没有腾讯云的痕迹。

【3】域名托管方式

这种模式不太常见。以域名 www.test.com 为例,如果客户要将请求切往CDN,需要将 test.com 的NS记录改为 CDN厂商提供的NS 权威服务器。这时CDN厂商同时担当了DNS服务商和CDN服务商的角色。

3. 调度形式详解

调度方式 说明
DNS调度 基于请求端local dns的出口IP归属地及运营商属性的DNS调度
302调度 基于客户端IP归属地及运营商属性的302跳转调度
路由调度 基于Anycast技术(BGP路由)的机房流量调度

【1】DNS调度

CDN的调度服务器是调度域名的NS权威服务器,调度域名的TTL被故意设置成很短(比如3分钟),这样所有请求都会较频繁地触发客户端的local DNS重新到CDN调度服务器解析新的IP地址。此时CDN的调度服务器依据是local DNS的出口地址。DNS调度流程如下:
01
客户端DNS TTL过期无首次访问,向local DNS发起DNS查询
02
local DNS在递归解析过程中,向CDN的调度服务器发起解析请求
03
CDN调度服务器可以看到local DNS的出口ip(有时还有基于EDNS的客户端ip)
04
通过IP库获取上一步IP的地理及运营商属性,从当前调度域名的策略规则中匹配,同时结合其它的因素(比如质量监控、机房成本因素等)得到最佳的一组IP

以上是DNS调度的基本流程,下面将举个实际场景中的例子:

访问URL http://p73.ping.dnsv1.com/a.php
测试机出口IP 113.87.117.154 (中国 广东 深圳 电信 中国电信);出口IP会变化,但大概率稳定在深圳电信
DNS服务器 202.96.134.133 / 202.96.128.166 (中国 广东 深圳 电信 中国电信),中国电信DHCP自动配置
DNS出口地址 202.96.136.240 (中国 广东 深圳 电信),多次测试结果会发生变化,但大概率稳定在深圳电信
目标域名解析 p73.ping.dnsv1.com 的DNS解析情况如下:p73.ping.dnsv1.com;p73.ping.dnsv1.com.cdn.dnsv1.com;388957.p23.tc.cdntip.com;113.96.154.108 等十多个IP

DNS调度原理

01
浏览器首次请求目标URL,本地无p73.ping.dnsv1.com 解析记录,向DNS服务器(也称为 local DNS)202.96.134.133发起查询请求

02
202.96.134.133(此IP背后的真实服务器)若本地无缓存,发起递归解析,最终解析到388957.p23.tc.cdntip.com,解析请求被发往cdntip.com的权威服务器 ns-open3.qq.com

ns-open3.qq.com并非一台实体服务器,而是网络的虚拟IP,先避开复杂的网络结构,其背后有一台或多台真实DNS权威服务器(或集群),为描述方便假设其IP为10.1.1.1

03

10.1.1.1 目前有的信息包括域名 388957.p23.tc.cdntip.com、local DNS ip 202.96.136.240。如果local DNS支持EDNS,那此时还能看到客户端IP 113.87.117.154。

有了以上3个信息,调度服务器,就能通过算法得出结果了

04

202.96.134.133 将IP结果返回给客户端,浏览器按自己的策略从中选择一个IP发起HTTP请求

DNS调度的优缺点:

优点 简单易用/用户无感知/客户端兼容性好
缺点 调度策略非实时生效(DNS是树型分布式系统,所有节点上都会按域名的TTL来做缓存)
调度不够精确(大量的local DNS不支持edns协议,拿不到客户的真实IP,CDN绝大多数时候只能通过local DNS ip来做决策,而local DNS ip有时候不太靠谱)

【2】302调度

先看下302模式下与前面的DNS调度有什么不同。
(http://p73.ping.dnsv1.com/a.php)
在DNS解析调度模式下,浏览器访问上面的URL时,正常情况下会收到CDN节点的返回码200和文件内容,即DNS解析到的IP会直接做为文件服务器响应浏览器请求。类似于:
HTTP/1.1 200 OK
Server: NWS_S1
Connection: keep-alive
Date: Sun, 11 Dec 2018 19:44:02 GMT
Transfer-Encoding: chunked
Keep-Alive: timeout=120
X-Daa-Tunnel: hop_count=2
X-NWS-LOG-UUID:750246221628030518 0be2170ce2df3d9f634cd70470120401
\r\r\r\n文件内容

但在302跳转模式下,上述URL的访问,浏览会收到一个状态码为302的响应:

HTTP/1.1 302 Moved Temporarily
Server: stgw/1.3.6.2_1.13.5
Date: Sun, 16 Dec 2018 19:38:58 GMT
Content-Type: text/html
Content-Length: 168
Connection: keep-alive
Location: http://61.142.166.245/p73.ping.dnsv1.com/a.php

意思是告诉浏览器,你需要继续访问Location中的URL去请求实际的文件内容。所以浏览器又发起了第2次请求:

http://61.142.166.245/p73.ping.dnsv1.com/a.php

这个URL中的IP地址,就是CDN调度系统为我们分配的CDN节点,我们来看这个IP是怎么拿到的。

域名解析的过程和基于DNS的调度一样,最终都会拿到一组IP,目标IP有两种情况:

◎目标IP并不是CDN的实际边缘节点,而是302调度集群的IP;
◎IP是CDN的普通边缘节点IP

01

浏览器向第一次拿到的IP发起http请求

02

如果这个IP实际上是CDN的边缘节点,它会从本机的配置文件中读取信息:

◎若请求Host不是IP,URL形式为:http://p73.ping.dnsv1.com/a.php,则将请求转发到后端调度集群;

◎若请求Host为IP,URL形式为:http://61.142.166.245/p73,ping.dnsv1.com/a.php,则读取缓存提供文件服务

03

此时请求到了调度群集上,我们能拿到的客户端信息有客户端的出口IP(绝大多情况下是相同的)

04

接下来算法和基于DNS的调度可以是一样的,只是判断依据由local DNS出口IP变成了客户端的出口IP(调度集群毕竟不是CDN节点,无法向客户端提供实际的文件内容,此时它只能通过302报文告知客户端)

05

浏览器收到302回应,跟随Location中的URL,继续发起http请求,这次请求的目标IP是CDN边缘节点,且Host是IP,CDN节点会响应实际的文件内容

302调度的优缺点:

优点 实时调度(每次拿到的最终IP都是实时计算的结果,所以调度策略是实时生效的)
准确性高(可以拿到请求的出口IP,在不考虑NAT或小运营商出口飘移时,客户端归属地更贴近真实情况,不受用户的DNS配置影响)
缺点 业务兼容性(要求客户业务的客户端必须支持302跟随,比如手机固定或应用下载,如果下载客户端不识别http 302响应码,那下载就会失败)
不适用于延时敏感业务(每个请求都会多出一次http交互,加载时间会成倍增加,对于web静态小资源不合适)

因此,302只适用于客户端兼容性好的大文件下载业务哦~

实时调度的好处:

◎快速隔离故障设备

◎精确控制节点于机房的带宽和资源负载

◎快速应对业务突发,尤其适合大文件加载类突发场景,例如:手机固件、游戏安装包、大体积资源分发

【3】路由调度

Anycast路由技术使得物理分布在全球/全球不同区域的不同服务器具有相同的IP地址,客户端对这个IP的请求会在路由层面引导到最近的物理服务器上。
Anycast BGP路由调度模式在表现形式上和DNS调度一样:
◎业务域名通过CNAME解析到CDN的调度域名
◎CDN的调度域名解析出的IP即边缘节点IP,请求不会发生302跳转
但也有特殊之处:
◎解析结果的全球IP数量极少,通常只有1-2个,或者一个大洲或大片区域1~2个
◎DNS的TTL通常极大,经常配置成2小时甚至更长

Anycast路由调度的优缺点:

优点 对CDN权威服务器的DNS解析性能要求不高(IP少且固定,TTL长)
比DNS抗干扰,比302兼容性好(在路由层面完成了就近接入CDN)
路由策略变动生效时间快,优于DNS调度
受DDOS攻击时,只需调整路由,将攻击流量引导到高带宽清洗机房,无需从现网剔除IP
缺点 方案复杂(全网网络复杂,BGP路由优化繁琐,容易造成网络不通,请求延时较长)
成本高(Anycast实施需要整个完整的IPC段,IP浪费严重,为达到好的效果和扛攻击,全球机房都要有足够的带宽)

关注腾讯云CDN公众号,技术干货一手掌握!

三种CDN调度系统实现原理详解相关推荐

  1. Spring Boot项目(Maven\Gradle)三种启动方式及后台运行详解

    Spring Boot项目三种启动方式及后台运行详解 1 Spring Boot项目三种启动方法 运行Application.java类中的Main方法 项目管理工具启动 Maven项目:mvn sp ...

  2. 三种Cross-lingual模型 (XLM, XLM-R, mBART)详解

    本文将详述三种Cross-lingual模型,按照其在Arxiv上发表论文的时间,分别是XLM(2019/1/22).XLM-R(2019/11/5).mBART(2020/1/22),有意思的是这三 ...

  3. 无盘系统工作原理详解

    总的来说,无盘工作站都是由网卡的启动芯片(Boot ROM)以不同的形式向服务器发出启动请求号,服务器收到后,根据不同的机制,向工作站发送启动数据,工作站下载完启动数据后,系统控制权由Boot ROM ...

  4. html5边框顶格,CSS 三种定位方式以及格式化上下文详解 》 html5jscss

    常规流( Normal flow ) 之称之为常规流,是因为这是相对于后面的浮动和绝对定位的一个概念,浮动和绝对定位元素都脱离了当前的常规流. 在 CSS2.1中,常规流包括块框( block box ...

  5. java c3p0 配置文件_【c3p0】 C3P0的三种配置方式以及基本配置项详解

    数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理. ---------------------------------------- ...

  6. C3P0的三种配置方式以及基本配置项详解

    数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理. 注:需要的jar包在后面给出链接. ---------------------- ...

  7. 三种js轮播实现方式详解(看一遍就会)

    js轮播的三种实现方式 1.替换scr(入门级) <!DOCTYPE html> <html><head><meta charset="utf-8& ...

  8. 数据可视化大屏应急管理综合指挥调度系统完整案例详解(PHP-API、Echarts、百度地图)

    文章目录 项目说明 一.项目说明 单位信息数据库字段: 资源数据库字段 项目需求 二.项目开发 1.项目分析 2.引入库 3.项目开发 (1)地图容器构建 (2)筛选和返回按钮事件 (3)企业筛选功能 ...

  9. 二叉树的创建与三种遍历方式(带图文详解)

    二叉树是由多节点组成的,每个节点最多链接两个节点,这两个节点就称为根节点的左树和右树. 每个节点的由数据区,左树,右树组成. typedef struct node {int data;struct ...

最新文章

  1. Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID (Java版)
  2. GeneGAN: Learning Object Transfiguration and Attribute Subspace from Unpaired Data
  3. 数学建模 概率论与数理统计
  4. 【Java虚拟机的垃圾收集算法】
  5. ZooKeeper的安装与部署
  6. python基础 list和tuple
  7. [蓝桥杯2019初赛]完全二叉树的权值-完全二叉树的性质
  8. 根据自己的博客数据统计国内IT人群
  9. Permutations
  10. n != n, n == -n
  11. 肿瘤基因检测的解读流程
  12. SIEBEL应用概述
  13. you-get遇到的坑
  14. 什么是云计算,什么是网格计算,他们之间有什么区别
  15. removeClass删除类名称
  16. 第071封“情书”:绳命20181008 Create and Simulate a Procedural Rope<Entagma>Houdini 2018
  17. 源码时代软测干货分享|带你了解CGI支持模块
  18. C++ 封装 信息隐藏
  19. 查看和调试core文件
  20. bash内置文档(ubuntu20.10)

热门文章

  1. Node.js~ioredis处理耗时请求时连接数瀑增
  2. 前端利器倚天剑之sublime
  3. xcode6是否导入framework
  4. 牛客 - 骚区间(线段树+思维)
  5. HDU - 4135 Co-prime(容斥原理)
  6. Three.js入门
  7. Fib数模n的循环节
  8. python3爬虫(9)分布式爬虫与对等分布式爬虫
  9. Duilib教程-HelloDuilib及DuiDesigner的简单使用
  10. Delphi使用ADO组件访问ACCESS数据入门例程