Skip to main content
德胜云
  万速智能9 > CDN

干货满满「聊聊CDN系统的架构设计(1)」cdn技术实现原理是什么cdn技术实现原理及应用

2023-06-03 00:00:06 浏览:

干货满满「聊聊CDN系统的架构设计(1)」cdn技术实现原理是什么cdn技术实现原理及应用

0.引言

本文主要讲解CDN在实际应用中的架构设计,能够从整体上帮助你快速了解CDN的功能。有些补充知识可以参考前面的文章,文章列表如下:

聊聊CDN技术与流媒体相关协议

详解Nginx系列

SRS流媒体服务器集群之Edge模式(2)

SRS流媒体服务器集群之Forward模式(1)

SRS流媒体服务器集群之Edge模式(1)

SRS流媒体服务器集群之Forward模式(2)

SRS流媒体服务器集群之Edge模式(3)

高并发网络 IO模型那些事

目前市面上可以进行商用的 CDN 大部分以流媒体 CDN 为主,其余的还有一部分是 WEB-CDN。近些年流媒体与 CDN 的结合使得流媒体业务发展迅猛,也带动了一批又一批的视频业务的发展。流媒体结合 CDN 中的存储分发、路由管理、负载均衡等关键技术,为视频业务创造了一个良好的发展环境。CDN架构图原理如下:

(1)发起DNS请求

(2)DNS递归查询

(3)返回最佳接入IP,同时LOCAL DNS缓存。

(4)用户获得最合适IP

(5)用户再次发起请求

(6)CDN内部路由

(7)转发请求,到合适的服务器,如源站。

(8)服务器返回数据

(9)边缘节点获取数据

(10)用户接收数据

1.流媒体服务器需求分析

流媒体服务器是流媒体应用系统的核心部分。具体而言,在现有的流媒体业务基础上,提升流媒体服务器抗抖动性能增强服务器抗压能力减小网络拥塞下的丢包率是研究的重点内容。并研究了流媒体协议选取,服务器选型以及流量整形算法选取等内容,基于 Nginx-web 服务器,进行二次开发和功能优化,期望设计出一个高性能且便于维护便于管理的流媒体服务器系统。

期望对所设计的流媒体系统的功能做如下总结:

(1) 能够实现各种媒体形式的分发、存储等操作。

(2) 支持 HLS 协议,并且提供对各类协议的解析

(3) 在高并发的环境中提升稳定性,实现服务高可用。

(4) 能够自适应网络抖动,对于抗抖动性有一定的性能要求。

2.流媒体服务器框架设计

列举一些目前市场上主流流媒体服务器系统。还有一些其它流媒体系统,就不一一列举了,如下图所示:

传统的流媒体服务器存在有一些弊端。例如,服务器会将流切割器切割的 TS 文件存到磁盘上,每次读取文件时都要对磁盘进行一次操作,这样的机制一是会影响读取效率,二是磁盘寿命会大大降低。传统的流媒体服务器在高并发方面处理的不太理想,尤其在应对突发流量时容易产生网络拥塞、性能严重下降等问题。

Nginx 服务器在应对高并发时有着较优的性能,Nginx 可以分为以下四大模块:核心模块,HTTP 模块,邮件服务模块和第三方模块。

(1)核心模块是 Nginx 服务器最为重要的一大模块,提供 Nginx 最为核心的服务,如进程管理、日志管理以及权限控制等。HTTP 模块可以分为标准HTTP 模块和可选 HTTP 模块,这两个模块主要负责实现 HTTP 请求可选 HTTP 模块在标准 HTTP 功能的基础上进行了拓展,相较于标准 HTTP 模块新增支持处理 Nginx 的一些特殊服务的功能。邮件服务模块为 Nginx 的邮件服务提供支持。第三方模块拓展了 Nginx 服务器的应用,开发者可以根据自己的业务场景将要开发的模块业务添加于其中。

(2)Nginx 采用高并发的服务框架,使用多进程机制和异步机制。Nginx 在其每个工作进程中的异步机制都采用异步非阻塞方式(Master-Worker)。这是其可处理多个客户端请求的重要原因。异步非阻塞模式是当工作进程收到客户端请求时,可能没有立即做出处理,而是先将其挂起去处理其他客户端请求,当此请求处理完成后会通知该进程从而响应客户端

(3)当 Nginx 启动后,会产生一个主进程,主进程 Master 主要负责与外界通信和对内部进程的管理,包括读取配置文件、建立绑定或关闭 socket实现平滑重启以及开启日志文件等工作。在主进程完成监听、绑定套接字等操作后创建若干 Worker进程。Worker 进程是彼此相互独立的,用来处理多个客户端的动态站点请求Worker 进程还会与后端服务器进行通信,交互方式有 HTTPFASTCGI(快速通用网关接口),MEMCACHE(分布式告诉缓存系统)。通常,用户通过 HTTP/HTTPS 协议进行 Web 服务请求Worker 进程收到来自客户端的请求后会转发至后端服务器,后端服务器的相应模块会依次对用户请求进行处理。Nginx 还设有缓存机制,每个 Worker 进程还时刻保持与代理缓存的交互,从而方便下次的快速访问。整个Nginx的请求服务架构如下图所示:

在上图中,Nginx 服务器的 Master-Worker 模型,涉及两种交互方式,分别是Master和Worker的之间的交互以及Worker与Worker,这两类交互都是使用管道机制通信。具体如下:

(4) Master-Worker 交互

主进程和工作进程间的交互是单向的。主进程与外界通过信号进行通信,主进程向工作进程发出指令及工作进程 ID 等信号。

(5) worker-worker 交互

worker之间的通信与上述 Master-Worker 交互原理相同,区别在于每个工作进程间是相互隔离的,当 worke1 向 worke2 发送指令时需将 worker1 的进程 ID 写入 worker2 的通道以供worker2 收到信号后进行后续工作(使用管道通信)。

3.CDN 网络架构设计

(1)CDN 网络拓扑

实际应用中,大型互联网公司会将数以万计的 CDN 节点——Cache 服务器集群在互联网络中进行部署,通过与各大网络运营商的合作,将这些节点服务器放置于靠近用户的区域机房中。在某些集群的分发模式下,CDN 事先会将流媒体内容从源站复制到各个节点服务器上,当媒体数据提供商进行数据更新时,CDN 也会同步进行内容更新并重新向各个节点服务器进行内容分发。对于每个用户的内容请求,CDN 都会为其选择一个最优的节点服务器,这个节点要么离用户最近要么是与用户之间有一条最优通信路径。CDN寻找最优节点的过程称为负载均衡。

云服务层可以分为两大模块(分别为OOS,CDN),其中对象存储 OOS是云对象的一项存储服务(Object Storage Service,简称OSS),数据可靠性较高。CDN 在接收到来自终端的请求后,首先会在边缘节点服务器寻找对应文件,如未找到,则会一层层回源进行查找。在 OSS 寻找对应文件内容后,OSS 的 ALB 网络接入层向 CDN 进行文件传输,CDN 的调度系统将文件进行整合发给下游终端设备。当请求在 OSS 没有找到文件,会自动到源站抓取对应文件保存到 OSS,并将内容直接返回到用户。CDN 在云服务中的的架构如下图所示。

4.CDN 负载均衡

CDN 的的负载均衡技术是 CDN 的关键技术之一。负载均衡是对批量用户请求进行动态平衡、分摊,寻找距离用户最近、性能最佳的 CDN 节点,目的是为了提高服务器响应速率利用率。负载均衡在多个节点之间按照一定的算法策略进行计算,对网络节点进行分配。CDN负载均衡常用的算法有轮询算法、最小连接数算法和快速响应优先算法,这些算法基本信息如下:

(1) 轮询算法

轮询算法的处理原则是对待所有负责负载均衡的服务器一视同仁,内部服务器循环对用户的请求做处理,这种算法不关心服务器上的连接数以及用户响应速率,因此在代码设计上较为简洁。

(2) 最小连接数算法

最小连接数算法在集群内部服务器上设置 flag 计数器,用来记录当前服务器的实时连接数目,通过比对各台服务器的连接数量,优先选择当前连接数最少服务器执行任务。

(3) 快速响应优先算法

快速响应优先算法对集群中的节点状态进行审查,选择适合当前请求状态的节点进行任务分配。

关于这些算法,后面有机会,再使用详细的文章来讲解。

整个文件传输的过程中,用户由 APP 终端发起请求,根据发起请求的内容,播放器首先获取 CDN 的播放地址,网络服务端通过此地址在本地边缘节点进行查找,将其内容放在 CDN上,CDN 从权重存储器中获取数据,CDN 质量体系实时统计系统向 VIP 权重管理模块进行反馈。CDN负载均衡架构图如下:

5.流媒体 CDN 的关键技术选取

流媒体协议选取

将针对各个协议的使用方式及特点进行比较分析,探索合适的流媒体服务器协议进行服务器系统设计。

在流媒体服务器中,处理流媒体文件时需要将流媒体文件切为若干 TS 分片,通过一个可扩展的 m3u8 列表文件将这些 TS 分片集中起来提供给客户端的播放器进行播放。HLS 协议的优势在于:

(1) HLS 协议在流媒体文件切分完成后,分发过程只需使用普通的网络服务器即可完成,而不再额外使用其它任何专门软件来进行分发。

(2)HLS 协议是基于 HTTP 协议实现的,而 HTTP 协议是当下发展较为成熟的协议之一。

(3)对于非实时视频,如果要实现在长视频中的跳转功能,HLS 协议不需要额外 for 循环遍历每个用户的请求,只需依据文件中的时间轴对 TS 片段进行下载,时间复杂度大大降低。SEEK效率高效。

(4) HLS 协议有自适应码率的特点,会根据用户请求时的网络状况为用户自动选择合适的码率文件,若当前用户连接数较小,则可选用高码率媒体文件,当网络较为繁忙时,选用低码率媒体文件。在 HLS 协议下的服务器首先会提供多码率的视频流,同时会在媒体文件列表中对码率进行标注,方便播放器对播放和下载进度进行自动调整,这种特性在应对移动设备网络状况较差时效果极为明显。

(5) HLS 协议代码格式简单,容易开发,便于维护且易用性强,可操控性强。

对于封装格式来说,TS 与 MP4 的编码格式不同,将 TS 于 MP4 进行比较后可以发现,MP4 协议的使用具有一定的局限性。TS有如下特点:

(6)MP4 一般只能用在点播业务中,如果选择 MP4 协议,播放器需分别针对点播业务与直播业务进行开发,而 TS 同时支持点播与直播,解析方使用一套代码即可完成解析。

(7)MP4 在解析文件时要先解析 MOOV 时长,首包响应较慢(首包响应是指用户从发起 GET 请求到播放器展示第一张画面的响应时间,是流媒体服务器的指标),这可能会影响质量评判。

所以选用 HLS 和 TS 作为开发流媒体服务器的主要媒体协议,支持直播、点播录制。

注意:协议没有好坏之分,每个协议都有它的优点和缺点,只要适配合适的场景,每种协议就有它的用户之地。

6.服务器选型

服务器的发展经历了很多变革,例如,服务器经历了从单进程多线程到多进程单线程再到多进程多线程的演变,服务器在稳定性方面也发生了质的飞跃。当前市场上流行的服务器主要有 Adobe FMS、Red5、Nginx 等。

(1)FMS(Flash Media Server)FMS是 Adobe 公司开发的一款多媒体实时通讯平台,在 2002 年被 Adobe 收购并更名为AMS。FMS 集成了多媒体交互的特性,提供了一套功能强大、拓展性强的对象模型和组件架构模型。基于 FMS 可以快速开发通讯相关的应用程序,并在代码执行和数据处理方面相对高效。

(a) 优点:专业厂商产品,性能优良、稳定,支持多平台,可实现 P2P 通信。

(b) 缺点:费用较高、代码实现复杂。

(2) Red5

Red5 提供的媒体服务器是基于 JAVA进行开发的,Red5采用 RTMP 作为流媒体传输协议,且与 FMS 可以做到完全兼容,即客户端在更改服务器后不会受到任何影响。

(a) 优点:代码开源,与 FMS 完全兼容,有着 FMS 的优点,通常用在开发较小型网站

(b) 缺点:性能与稳定性较差,在处理高并发、大容量数据等场景上有一定缺陷。

(3) Nginx

Nginx 是目前市场上主流的具有较高性能的 HTTP 和反向代理服务器,采用高并发服务器框架,因其架构本身的高稳定性受到开发者的青睐。Nginx 提供丰富的功能集合和示例配置文件,适用于多种开发场景,并且,其在资源的消耗上也较低。

(a) 优点:部署方便,性能较高,采用 HTTP 渐进式下载,支持进度拖拽、防盗链等功能,直播点播使用一套服务器,管理更加便捷。

(b) 缺点:需要二次开发

Nginx 服务器性能高,稳定性强,且在当前应用领域比较广泛,具有相对成熟性。而其他几类服务器虽本身支持流媒体传输,但在业务方面,与业务并不兼容,对其中的一些模块仍需要二次开发,所以这里选择Nginx作为服务器。

7.流量整形算法选取

对于流媒体服务器来说,限流是一个很重要的环节。限流即限制系统的输入或输出,当输入获输出达到服务器流量限制的阈值,通过延迟处理,拒绝处理或者部分拒绝处理等方式来进行限流,从而达到保证系统稳定运行的目的。常用的限流算法有漏桶算法(leaky bucket)和令牌桶算法(leaky bucket)。

(1)漏桶算法的思路是在一个固定容量的漏桶中,水流(用户请求)以任意速率流入到漏桶中,漏桶以固定速率出流(响应请求)。因此,漏桶算法是通过强行限制数据的传输速率实现限流的。

待处理的数据放在队列中,数据入桶前会对桶是否满做出判断。如果漏桶为空或没有满,则数据入桶,这个过程称为入流。如果入流速度过大而导致流入的水流超过了桶的容量,水流将会溢出,意味着要传输的数据包会被直接丢弃。出流的速率可以根据业务场景进行人为调节,但漏桶算法本身并不能对出流速率进行自适应调节。这也就是网盘限速的基本原理。漏桶算法原理如下图所示:

(2)还有一种令牌桶算法原理是,以一个恒定的速率在桶里添加令牌,当新的请求来临时需要从桶里获取一个令牌才能进行发送,当桶里的令牌满了,则暂停添加令牌;当桶里没有令牌时,则阻塞或者拒绝服务。对于令牌桶算法来说,拿到令牌是数据可以进行传输前提条件。令牌桶算法原理图如下:

(3)漏桶算法与令牌桶算法的比较如下:

相同点:这两个算法都是通过限制流量速率来对流量进行管控达到限流的目的。

不同点:在速率管控方面,漏桶算法较令牌桶算法具有一定的局限性。对比上面2张图可以看到,漏桶出流速率是一定的,而令牌桶通过令牌机制可以有效地对出流速率进行控制,只有拿到了令牌才可进行后续服务。在遇到突发流量的状况时,漏桶算法面临着数据包被大批丢弃,而令牌桶算法则可以保持阻塞状态,等待新的令牌。因此,漏桶算法与令牌桶算法的不同点在突发性流量的场景中表现极为明显。

8.添加限流模块示例

Nginx 提供了一个单独的模块进行流量控制,即 ngx_http_limit_req_module 模块,在service.pconf 配置文件中的配置如下:

location /Service { try_files $uri = 404; proxy_pass http://127.0.0.1:8080/Service/1.jsp; limit_req zone = ten burst = 1 nodelay; limit_req_ status 503; keepalive_requests 120 //单连接请求上限次数 }

注意:传统的 Nginx 在流量控制上采用的限流算法是漏桶算法而非令牌桶算法,这是为了应对一种特殊访问——恶意访问 DDos(Distributed Denial of Service)。这种访问是通过一台或几台机器,不断向服务器发起访问请求,造成其他用户无法得到响应。Nginx 使用漏桶算法限制用户单位时间内的访问次数,相比于令牌桶算法,漏桶算法的代码更为简化,便于二次开发。本文这里设计讲解的就是从提升服务器性能的角度考虑,令牌桶算法在应对突发流量有着较优的性能,可以对每一路的发送数据进行速率平滑,因此,本系统将令牌桶算法应用在 Nginx 的数据发送模块上,在此模块上设计开发了基于令牌桶算法的流量控制模式

9.总结

本文阐述了流媒体 CDN 的系统架构设计。接着根据 Nginx 服务器框架对传统的流媒体服务器框架进行改进。然后介绍了 CDN 的网络架构包括 CDN 网络拓扑以及其内部的通信方式和负载均衡技术等,对本次设计的流媒体服务器所在的大的网络环境进行介绍。最后对流媒体 CDN 的关键技术进行选取,对比了流媒体协议,服务器选型以及漏桶算法与令牌桶算法在流量整形中的应用。欢迎关注,收藏,转发,分享。

后期关于项目知识,也会更新在微信公众号“记录世界 from antonio”,欢迎关注

干货满满「聊聊CDN系统的架构设计(1)」cdn技术实现原理是什么cdn技术实现原理及应用

  • 怎么可以错过「IPFS相关–看eosDAC社区 如何托管其网
  • 越早知道越好「加速访问,保障网站安全(了解CDN无限防御的五
  • 学到了「CDN内容分发服务好“最后一公里”」cdn内容分发技
  • 这样也行?「网络原来如此之浅谈Nginx服务器安全加固」ng
  • 新鲜出炉「聊聊CDN系统的架构设计(1)」cdn管理平台cd