笔记-CDN

2023-11-03

转自:http://www.jianshu.com/p/df806e04b204

转自:http://blog.qiniu.com/archives/6221


从 CDN 到 LiveNet

随着基础设施的升级,我们从文字时代演进到读图时代,又从读图时代演进到微视频时代。人们对媒体载体的实时性,交互性的要求越来越高。今年是 Live 时代的元年,直播 App 如雨后春笋,像极了几年前的千团大战、O2O 大战、P2P 金融大战,成为互联网的又一场战役。

  • 什么是内容分发网络
  • 内容分发网络的链路路由
  • 内容分发网络的扩容
  • 内容分发网络的安全
  • 回归本质:LiveNet
  • LiveNet VS P2P 网络

为什么要有内容分发网络,内容分发网络的由来

互联网起源于美国军方的一个内部网络,Tim Berners-Lee 是互联网发明者之一,他很早就预见到在不久的将来网络拥塞将成为互联网发展的最大障碍,于是他提出了一个学术难题,要发明一种全新的、从根本上解决问题的方法来实现互联网内容的无拥塞分发,这项学术难题最终催生出一种革新性的互联网服务– CDN 。当时 Berners-Lee 博士隔壁是 Tom Leighton 教授的办公室,一位麻省理工学院应用数学教授,他被 Berners-Lee 的挑战激起了兴趣。Letghton 最终解决了这个难题并开始自己的商业计划,成立了 Akamai 公司,成为世界上第一家 CDN 公司。

内容分发网络的架构

1

上图是一个典型的 CDN 系统的三级部署示意图,节点是 CDN 系统中的最基本部署单元,分为三级部署,中心节点、区域节点和边缘节点,最上面一级是中心节点,中间一级是区域节点,边缘节点地理位置分散,为用户提供就近的内容访问服务。

下面介绍一下 CDN 节点的分类,主要分成两大类,骨干节点和 POP 节点,骨干节点又分为中心节点和区域节点:

  • 骨干节点
  • 中心节点
  • 区域节点
  • POP节点
  • 边缘节点

逻辑上来讲,骨干节点主要负责内容分发和边缘节点未命中时进行回源,POP 节点主要负责提供给用户就近的内容访问服务。但如果 CDN 网络规模较大,边缘节点直接向中心节点回源会给中间层的核心设备造成的压力过大,在物理上引入区域节点,负责一个地理区域的管理,保存部分热点数据。



CDN通过将网络内容发布到靠近用户的边缘节点,使不同地域的用户在访问相同网页时可以就近获取。这样既可以减轻源服务器的负担,也可以减少整个网络中的流量分布不均的情况,进而改善整个网络性能。所谓的边缘节点是CDN服务提供商经过精心挑选的距离用户非常近的服务器节点,仅“一跳”(Single Hop)之遥。用户在访问时就无需再经过多个路由器,大大减少访问时间。

从图4-9可以看出,DNS在对域名解析时不再向用户返回源服务器的IP,而是返回了由智能CDN负载均衡系统选定的某个边缘节点的IP。用户利用这个IP访问边缘节点,然后该节点通过其内部DNS解析得到源服务器IP并发出请求来获取用户所需的页面,如果请求成功,边缘节点会将页面缓存下来,下次用户访问时可以直接读取,而不需要每次都访问源服务器。


CDN架构

淘宝CDN系统用于支持用户购物,尤其是“双11”光棍节时的海量图片请求。如图4-10所示,图片存储在后台的TFS集群中,CDN系统将这些图片缓存到离用户最近的边缘节点。CDN采用两级Cache:L1-Cache以及L2-Cache。用户访问淘宝网的图片时,通过全局调度系统(Global Load Balancing)调度到某个L1-Cache节点。如果L1-Cache命中,那么直接将图片数据返回用户;否则,请求L2-Cache节点,并将返回的图片数据缓存到L1-Cache节点。

如果L2-Cache命中,直接将图片数据返回给L1-Cache节点;否则,请求源服务器的图片服务器集群。每台图片服务器是一个运行着Nginx的Web服务器,它还会在本地缓存图片,只有当本地缓存也不命中时才会请求后端的TFS集群,图片服务器集群和TFS集群部署在同一个数据中心内。


对于每个CDN节点,其架构如图4-11所示。从图中可以看出,每个CDN节点内部通过LVS+Haproxy的方式进行负载均衡。其中,LVS是四层负载均衡软件,性能好;Haproxy是七层负载均衡软件,能够支持更加灵活的负载均衡策略。通过有机结合两者,可以将不同的图片请求调度到不同的Squid服务器。


Squid服务器用来缓存Blob图片数据。用户的请求按照一定的策略发送给某台Squid服务器,如果缓存命中则直接返回;否则,Squid服务器首先会请求源服务器获取图片缓存到本地,接着再将图片数据返回给用户。数据通过一致性哈希的方式分布到不同的Squid服务器,使得增加/删除服务器只需要移动1/n(n为Squid服务器总数)的对象。

相比分布式存储系统,分布式缓存系统的实现要容易很多。这是因为缓存系统不需要考虑数据持久化,如果缓存服务器出现故障,只需要简单地将它从集群中剔除即可。

1.分级存储

分级存储是淘宝CDN架构的一个很大创新。由于缓存数据有较高的局部性,在Squid服务器上使用SSD+SAS+SATA混合存储,图片随着热点变化而迁移,最热门的存储到SSD,中等热度的存储到SAS,轻热度的存储到SATA。通过这样的方式,能够很好地结合SSD的性能和SAS、SATA磁盘的成本优势。

2.低功耗服务器定制

淘宝CDN架构的另外一个亮点是低功耗服务器定制。CDN缓存服务是IO密集型而不是CPU密集型的服务,因此,选用Intel Atom CPU定制低功耗服务器,在保证服务性能的前提下大大降低了整体功耗。

讨论

由于Blob存储系统读访问量大,更新和删除很少,特别适合通过CDN技术分发到离用户最近的节点。CDN也是一种缓存,需要考虑与源服务器之间的一致性。源服务器更新或者删除了Blob数据,需要能够比较实时地推送到CDN缓存节点,否则只能等到缓存中的对象被淘汰,而对象的有效期一般很长,热门对象很难被淘汰。

另外,淘宝在研发CDN的过程中也发现,随着系统的规模越来越大,商用软件往往很难满足需求,通过采用开源软件与自主开发相结合的方式,可以有更好的可控性,系统也有更高的可扩展性。互联网技术的优势在于规模效应,随着规模越来越大,单位成本也会越来越低。

当然,随着硬件技术的发展,淘宝CDN架构也经历着变革。例如SSD价格快速下降,使得SSD+SAS+SATA分级存储的优势不再明显,新上线的CDN缓存节点配备的磁盘均为SSD。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

笔记-CDN 的相关文章

  • Http中Content-Type等属性详解

    前言 一直以来对HTTP请求中各种属性一知半解 偶然在博客中找到一篇 特意摘录过来方便自己以后查看 正文 敬请关注博客 后期不断更新优质博文 谢谢 这里讲解Content Type的可用值 以及在spring MVC中如何使用它们来映射请求
  • gethostbyname ()函数的使用

    gethostbyname 函数 根据主机名获取主机信息 用域名或者主机名获取地址 操作系统提供的库函数 函数原型 struct hostent gethostbyname const char hostname hostent结构体 st
  • 网络编程的几种I/O模式

    1 非阻塞I O 非阻塞I O 若想网络编程时调用I O函数不想让程序阻塞 需要使用I O复用技术 一个方法是poll 轮询 所谓轮询就是执行函数时 如果内核不能立即对应用的函数进行响应时 就返回给应用一个错误 而应用不停的循环调用该函数
  • http协议访问网址的流程

    http协议 http协议可以说是由三个部分组成的 超文本 URL Http 超文本 网页中的信息 如文字 图片 视频 URL 统一资源定位符 由三个部分组成 协议 主机端口 文件名及路径 使用http协议的访问流程 例如我们想访问百度 则
  • c++使用curl库发送https请求

    一 环境win7 64位 vs2010 二 文件准备 2 1文件下载 libcurl 下载页面 http curl haxx se download html 我下载的是https curl haxx se download curl 7
  • TCP中的Nagle算法

    一 Nagel算法 TCP IP协议中 无论发送多少数据 总是要在数据前面加上协议头 同时 对方接受到数据 也需要发送ack表示确认 为了尽可能利用网络带宽 TCP总是希望尽可能发送足够大的数据 在一个连接中会设置MSS参数 因此 TCP
  • P2P原理以及如何实现(整理)

    前言 这几天看了p2p的原理以及实现的demo 整理一下 一共分为三部分 第一是概念原理 第二是demo实现 第三是p2p协议相关以及分类 一 概念原理 比较全面的理解 https zhuanlan zhihu com p 30351943
  • 挖掘视频网站【优酷】上被截断的视频的地址--001

    不知道大家看视频的时候有没有注意过 一个稍微长的视频 比如超过20分钟 你刚开始看的时候暂停播放 它的进度条会在中途某一个位置停止加载 当你把播放位置调节到那个停顿的地方 视频又开始继续加载 如果视频还有很多 它会停顿很多次 我们不禁要问
  • gethostbyname()函数详解

    基本概念 gethostbyname 函数主要作用 用域名或者主机名获取地址 操作系统提供的库函数 以下的讨论基于linux环境 域名系统 Domain Name System DNS 主要用于主机名字与IP地址之间的映射 每个组织机构往往
  • 回调函数

    单线程的时候同步的话 很容易阻塞在那边 用户体验极差 例如 异步是可以多线程的 因为UI主线程一旦阻塞整个界面就卡死了 一旦异步 两个线程下一个可以后台处理数据 一个可以做UI显示 js是单线程的 如果所有的操作 ajax 获取文件等I O
  • 基于Linux用C语言实现TCP/UDP图片和文件传输(socket)

    目录 一 TCP实现 1 服务端 2 客户端 二 UDP实现 1 服务端 2 客户端 一 TCP实现 传输控制协议 TCP Transmission Control Protocol 是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设
  • TFTP协议下载实验

    include
  • TCP/IP编程之SO_REUSEADDR和SO_REUSEPORT套接字选项

    基本概念 SO REUSEADDR套接字选项能起到以下4个不同的功用 1 SO REUSEADDR允许启动一个监听服务器并捆绑众所周知端口 即使以前建立的该端口用作它们的本地端口的连接仍存在 这个条件通常是这样碰到的 a 启动一个监听服务器
  • 基于TCP的服务器端/客户端

    TCP服务器端默认函数调用顺序 socket 创建socket bind 分配socket地址 listen 等待连接请求状态 accept 允许连接 read write 数据交换 close 断开连接 等待连接请求状态 int list
  • 170_web服务器_两个需求【1-】获取虚拟机上数据库数据显示到网页 【2-】网页下拉框数据,发送到MQTT服务器上【html实现网页,.js实现内在,.cgi实现内核】

    实例 html 两个功能一起实现在网页 表面
  • Muduo库源码剖析(十)——总结

    Muduo网络库的核心代码模块 Channel 封装fd的对应事件变化情况 和关注事件 fd events revents callbacks 两种channel listenfd acceptorChannel connfd connec
  • Java GUI编程——在线聊天室

    引言 综合应用Java的GUI编程和网络编程 实现一个能够支持多组用户同时使用的聊天室软件 该聊天室具有比较友好的GUI界面 并使用C S模式 支持多个用户同时使用 用户可以自己选择加入或者创建房间 和房间内的其他用户互发信息 文字和图片
  • Node.js开发入门—HTTP文件服务器

    HelloWorld示例只有演示意义 这次我们来搞一个实际的例子 文件服务器 我们使用Node js创建一个HTTP协议的文件服务器 你可以使用浏览器或其它下载工具到文件服务器上下载文件 用Node js实现的HTTP文件服务器 比我在Qt
  • 通过python程序调取摄像头画面

    目录 1 方法 2 演示代码 3 总结 1 方法 想要调取摄像头画面有这么几个前提 需要使用网络摄像头并且支持RTSP协议 摄像头要和你的电脑在同一个局域网下 需要知道摄像头的账号 密码 IP地址 RTSP协议是一种网络传输协议 不同的摄像
  • 使用epoll时需要将socket设为非阻塞吗?

    本文是回答一位知友的提问 在APUE中介绍select和poll中说 一个描述阻塞与否并不影响select是否阻塞 也就是说 如果希望读一个非阻塞描述符 并且以超时值5s调用select 则select最多阻塞5s 我看到有些程序使用epo

随机推荐

  • spark spark-sql提交方式及参数优化建议

    Spark作为分布式的SQL查询引擎 官方测试结果比 Hive sql 快 100倍 目前spark提交命令有spark shell spark submit spark sql三种方式 下面我就来看看spark sql的提交方式 与hiv
  • C#用Npgsql库连接postgres数据库

    按网上说法我在包管理控制台使用Install Package Npgsql安装不成功 我项目的dotnet不匹配 然后在官网上我找到了下面指令 PM gt Install Package EntityFramework6 Npgsql Ve
  • 数据库实验报告 创建学生关系数据表、课程表、选课表 SQL Kingbase

    一 实验题目 已有条件 Kingbase数据库软件包 要求 请安装Kingbase数据库软件 在数据库软件中创建一个自己名字的模式 在该模式下创建学生关系数据表 课程表 选课表 插入一些数据 尝试查询 更新 删除 二 相关原理与知识 完成实
  • 数据结构之“七大排序“

    1 排序的概念和应用 1 1 排序的概念 排序 什么是排序 排序就是使一串记录 按照其中的某个或某些关键字的大小 递增或递减的排列起来的操作 内部排序 数据元素全部放在内存中的排序 外部排序 数据元素太多不能同时放在内存中 根据排序过程的要
  • centos7查找目录下所有文件所包含的关键字

    grep r string 转载于 https www cnblogs com wang lei p 11392499 html
  • linux更新内核

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 Linux升级内核的正确姿势 很多童鞋在玩耍linux发行版的时候 都会遇到各种
  • contos的apt-get安装

    首先contos的软件包管理是yum 但是yum包好多都没有 比如我想装的sl 小火车 下载安装apt包管理工具 1 下载地址 http pkgs repoforge org rpmforge release 2 根据自己的系统下载对应的包
  • 【数据结构与算法】插入排序和希尔排序

    目录 一 插入排序 InsertSort 基本思想 动图演示 特性总结 二 希尔排序 ShellSort 基本思想 图例 特性总结 一 插入排序 InsertSort 基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序
  • 452. 用最少数量的箭引爆气球

    在二维空间中有许多球形的气球 对于每个气球 提供的输入是水平方向上 气球直径的开始和结束坐标 由于它是水平的 所以y坐标并不重要 因此只要知道开始和结束的x坐标就足够了 开始坐标总是小于结束坐标 平面内最多存在104个气球 一支弓箭可以沿着
  • 永磁同步电机矢量控制(三)——电流环 PI 参数整定(二)

    文章目录 1 电流环PI参数整定 2 电流环带宽选择 3 电流环带宽的测试方法 前面我们把电流环的闭环传递函数整定成了典型的二阶系统 这里我们再简化处理下电流环 把电流环闭环传递函数整定成一阶惯性环节 1 电流环PI参数整定 首先 我们忽略
  • uni-app之分包加载和按需注入

    文章目录 一 分包 1 为什么要分包呢 2 分包类型 3 如何设置分包 需要在manifest json中加入分包相关配置 在page json中加入分包配置 3 分包预加载配置preloadRule 二 按需注入和用时注入 1 按需注入
  • React中import的用法

    import defaultcomponent a b c from XXX eg import React Component from react 导入 react 文件里export的一个默认的组件 将其命名为React以及Compo
  • redis 主从模式以及哨兵模式

    一 redis主从模式 master slave 1 作用 1 防止单点故障 一台redis宕机 整个redis不能用 2 可以进行读写分离 一台redis主机进行写操作 其他机子进行读操作 提高使用效率 1 2实现 1 规划图 主从规划图
  • MySQL——子查询

    来一篇 MySQL 子查询 记录一下这个美好的时光 学习记录篇 下文中所有SQL 语句 均可在 MySQL DB 学习Demo 此处下载SQL语句执行 有相关DB 与 表 1 需求分析与问题解决 1 1 实际问题 现有解决方式一 SELEC
  • jira通过使用synapseRT插件实现对需求、测试用例、测试计划等的管理

    jira是可以实现对测试用例的管理的 而且还可以实现需求与测试用例 测试计划等的链接 这样就只使用一款jira软件串起整个流程了 下面说一说插件synapseRT插件的安装与破解 首先 需要下载破解包 链接如下 是我的csdn下载链接 ht
  • Python 数据分析学习路线

    Python 数据分析学习路线 第一阶段 Python语言基础 第二阶段 数据采集和持久化 第三阶段 数据分析 第四阶段 数据挖掘与机器学习 书籍介绍 参与方式 第一阶段 Python语言基础 在学习数据分析之前 首先需要掌握Python语
  • [Java]在数组中查找一个数字并返回其下标值

    此代码仅用于数组为非递减序列 二分查找 public class BinarySearch public static int binarySearch int array int target int left 0 int right a
  • PTA8(python)

    python程序设计选做题集 函数题和编程题 6 1 用类来计算圆面积 10 分 6 2 统计商品总价 20 分 6 3 定义商品类 特殊方法 30 分 6 4 学生成绩管理 30 分 6 5 设计一个股票类 高教社 Python编程基础及
  • STM32F429点亮led实验

    一 调用的函数 在stm32f429中点亮led通过控制引脚的高低电平来实现 在f429的hal库中控制引脚高低电平的函数 void HAL GPIO WritePin GPIO TypeDef GPIOx uint16 t GPIO Pi
  • 笔记-CDN

    转自 http www jianshu com p df806e04b204 转自 http blog qiniu com archives 6221 从 CDN 到 LiveNet 随着基础设施的升级 我们从文字时代演进到读图时代 又从读