## 什么是`CDN`?
* `CDN`的全称`Content Delivery Network`,即 内容分发网络.
* 简单来讲`CDN`是用户到源服务器之间的一层缓存层, 缓存一些静态资源, 静态的web页面, 流媒体等, 提高访问速度, 降低源服务器负载(网络资源, 硬件资源), 集体抗`D.D.O.S`(高可用)。
## 一个简陋`CDN`模型
* `Nginx`web反向代理服务器, 一般用于web服务器负载均衡, 具有静态资源缓存的功能, 此处我们重点利用这个功能去搭建我们的`CDN`。
* ![cnd-nginx.png](https://static.studygolang.com/200603/e8c28c199a4893a5f4edf36bd9b4152a.png)
* 如图所示, 我们使用`nginx`方向代理我们的静态资源源服务器, 在使用更多的节点去反向代理 代理源服务器的那个`nginx`, 依次类推形成一个树形结构, 树的叶子节点就是我们的边缘节点, 此时我们再实现一个域名解析服务器, 需要特殊处理一下当请求我们源服务器的域名时, 返回一个边缘节点中与用户之间网络最快, 负载最小的节点`IP`, 我认为这就可以算是一个`CDN`, 但是非常简陋, 问题很多, 例如:网络中有几个缓存节点(`nginx`), 就会有几份缓存数据, 过于冗余, 负载不均衡, 边缘节点的负载可能会大些, 1/2层的节点可能负载会小很多等。
## 百度百科中`CDN`的介绍
* `CDN`网络中包含的功能实体包括内容缓存设备、内容交换机、内容路由器、`CDN`内容管理系统等组成。
* 内容缓存设备:
* 百度百科定义: 内容缓存为`CDN`网络节点,位于用户接入点,是面向最终用户的内容提供设备,可缓存静态Web内容和流媒体内容,实现内容的边缘传播和存储,以便用户的就近访问.
* 在上述模型中, 就是`nginx`节点
* 内容交换机:
* 百度百科定义: 处于用户接入集中点,可以均衡单点多个内容缓存设备的负载,并对内容进行缓存负载平衡及访问控制.
* 因为上述模型中有几个`nginx`节点就可能有几份缓存数据, 所以在上述模型中没有体现, 我们暂时跳过。
* 内容路由器:
* 百度百科定义: 内容路由器负责将用户的请求调度到适当的设备上。内容路由通常通过负载均衡系统来实现,动态均衡各个内容缓存站点的载荷分配,为用户的请求选择最佳的访问站点,同时提高网站的可用性。内容路由器可根据多种因素制定路由,包括站点与用户的临近度、**内容的可用性**、网络负载、设备状况等。负载均衡系统是整个`CDN`的核心。负载均衡的准确性和效率直接决定了整个`CDN`的效率和性能。
* 在上述模型中就是我们实现的域名解析服务器
* 百度百科这里提到了, 内容路有器可以根据多种路由指定路由规则, 其中包含一个**内容的可用性**, 我查阅了很多资料, 这个内容路由器的实现一般都是通过`DNS`, 或者更专业的叫法叫 智能`DNS`, 虽然不知道智能`DNS`的具体流程, 但是其本身终归还是域名解析服务, 单纯通过域名是无法判断**内容可用性**的 , 因为连要访问的资源是什么都不知道, 又怎么能判断其有效性呢? 百度百科这里或许是指的非智能`DNS`的另一种实现, 也可能是我的理解错误。
* `CDN`内容管理系统:
* 不是必须的, 这里暂时不考虑.
## 基于分布式存储的`CDN`模型
* 上述那个简陋的`CDN`模型中, 我们提到的缺点就是数据过于冗余, 负载不均衡等, 此时我们可以将我们的内容缓存设备的策略更换一下, 使用分布式的存储(不太了解), 再结合负载均衡, 以及我们的集群本身就是缓存层, 我**天马行空**的这样想象到, 我们的分布式的缓存数据应该是这样的:
* ![cdn-cluster.png](https://static.studygolang.com/200603/ded0437a49bc603024cc2e1147da0e37.png)
* 首先, 会根据数据热度来决策在整个缓存层的副本数量, 所以我们缓存副本的数量不是1 2 3..., 很可能是0.7+0.7+0.5的关系, (ps: 这可能也是我们在访问某些视频网站时, 一些热门的视频播放反而加载很快, 而特别冷门的视频却特别慢), 这也是一种负载均衡.
* 然后, 是内容路由, 缓存层节点之间的内容路由, 同样需要负载均衡.
* 我认为以上两点是我们之前跳过的**内容交换机**解决的问题, 内容缓存节点会缓存哪些数据, 以及缓存层内容缓存节点之间内部如何路由, 都是内容交换机来决策.
有疑问加站长微信联系(非本文作者))