设计CDN系统最关键的两个问题是:中央怎么管?地方怎么干?那么今天,我们就来简单探讨一下"中央怎么管"的问题。
管理是为了合理的调度,合理的调度是为了提升整个组织的效益。所以提升效益才是最终目的,管理只是途径而已。那CDN系统是通过怎样的管理与调度,实现组织利益最大化的呢?请带着这个问题往下看。
一、有效的管理
先来回顾一下这张图:
这张图只反映了源站与加速节点之间的关系,然而一个有效的CDN系统想要高效的运转,还需区域节点和中心节点的参与。所以经典的CDN三层架构,如下图:
看到这张图,我相信你已经明白了CDN的管理模式:典型的金字塔型组织结构,中心节点负责决策下达(返回距离用户最近的边缘节点IP),边缘节点负责实际输出(返回终端用户实际请求的数据),区域节点负责管理边缘节点并且对中心节点的决策负责。
这里面比较难理解就是区域节点,它们起到了承上启下的作用。一般区域节点需要做以下几件事:
(1)监控边缘节点,通过ICMP探测、PORT探测、内容探测等方式探测边缘节点的健康状况。
(2)均衡边缘节点,通过合理的调度(下文有详细阐述),实现区域内边缘节点的负载均衡。
(3)缓存源站内容,出于对源站的保护以及边缘节点回源性能的考虑,区域节点同时还充当着"中间源"的角色。
(4)日志采集,日志关系到计费与运营分析,一般是由区域节点统一采集之后上传至日志分析系统。
(5)配置管理,对区域内边缘节点的配置进行统一管理,如果有某个节点下线,可及时将对应的配置下发到替补节点上。
为了便于大家更直观的理解,我将上面两张图进行逻辑上的合并,得到下图:
看完这三张图,我想不用我多说,你就已经明白了CDN的管理方式,然而正如之前我所说,管理是为了更合理的调度(当然严格来说,调度也属于管理的范畴,这里分开阐述是因为调度是CDN系统中比较关键的一部分内容),那接下来,就让我们来看一下CDN到底是如何调度的。
二、合理的调度
1、调度方法
(1)基于Local DNS's IP的调度
我们在《浅谈CDN(一)》中有提及到基于DNS实现全局负载均衡的方式:
我将它与我们今天讲的CDN三层架构进行逻辑合并之后,得到下图:
GSLB确实会根据Local DNS的IP返回一个距Local DNS最近的边缘节点IP,但用户可能会设置错误的Local DNS,所以这种调度的准确性不高,据说准确率只有85%左右。除此之外,Local DNS的缓存还会导致GSLB的失效以及无法灵活应对边缘节点故障的问题。
(2)基于Client's IP的调度
正是由于上一种方式的种种不足,所以会存在302调度这种方案。为了很好的进行比较,我也给出一张图:
通过对比,我们很容易发现:基于302调度比基于DNS调度多了一个302跳转的步骤。正是这个302跳转,让GSLB获取到了Client IP,保证了调度的准确率,这种方式的准确率可达99%左右,但缺陷也很明显,多了一个步骤就多了一些时间损耗,同时也给GSLB带来很大的性能压力。
由于这两种方式都存在着各自的优缺点,谁也无法完全替代谁,所以他们是一种共存的状态。当请求小文件时,302的延时甚至可能大于直接从一个较远的节点获取文件的延时,所以总结起来就一句话:请求大文件才会用到302跳转。一般来说视频、压缩包,默认就会被认为是大文件(通过文件后缀判断),所以在点播和下载加速的场景中才会用到302调度。
合理的调度不仅体现在智能的调度方法上,还体现在全面的调度策略上。那接下来让我们看看GSLB具备哪些调度策略。
2、调度策略
(1)静态策略
静态策略是预先配置好且固定不变的,缺乏灵活性,在运行一段时间后很容易出现失衡的局面,所以需要下面的动态策略来进行辅助修正。
(2)动态策略
与前面说到的两种调度方法一样,静态与动态这两种调度策略也是存在各自的优缺点。静态策略,太死板容易导致组织"失衡",动态策略,领导者劳心劳力且决策周期长。因此在实际生产中,静态和动态是结合使用的。正常情况下,第一层调度(区域间调度)采用静态调度较多,第二层调度(区域内调度)采用动态调度较多。
好了,今天花了较长的篇幅介绍了CDN系统是如何管理以及如何调度的。我也感叹这其中的技术细节深不可测,很多内容我也是一知半解,所以我如果有什么写得不对的地方,还望大家帮忙指出。期待与大家共同探讨,共同进步。