从对CDN的理解到Nginx负载均衡

什么是CDN

  1. CDN的全称是Content Delivery Network,即内容分发网络。
  2. 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定
  3. 通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上
  4. 其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度**。
  5. 内容分发网络是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。

中心与边缘节点

CDN 网络一般分为中心与边缘节点两部分,中心负责全局负载均衡与内容管理。中心节点的功能如下:

  • 随时监控边缘节点的健康状况(可用性,拥塞程度);
  • 根据边缘节点到请求端的距离,以及边缘节点的健康状况,按一定的策略重定向请求;
  • 与客户主站进行数据同步更新。
    负责为用户提供内容服务的 cache 设备应部署在物理上的网络边缘位置,即 CDN 边缘层。CDN 系统中负责全局性管理和控制的设备组成中心层(二级缓存),中心层同时保存着最多的内容副本,当边缘层节点未命中时,会向中心层请求,如果在中心层仍未命中,则需要中心层向源站回源进行请求。

使用CDN的好处

  1. 加速网站访问,缩短时延
    CDN应用广泛,支持多种行业、多种场景内容加速,例如:图片小文件、大文件下载、视音频点播、直播流媒体、全站加速、安全加速。
  2. 跨运营商,全网覆盖
  3. 保障网站安全
  4. 在多台服务器间均衡负载

CDN的工作原理

CDN这个技术其实说起来并不复杂,最初的核心理念,就是将内容缓存在终端用户附近。

内容源不是远么?那么,我们就在靠近用户的地方,建一个缓存服务器,把远端的内容,复制一份,放在这里,不就OK了?

具体来说,CDN就是采用更多的缓存服务器(CDN边缘节点),布放在用户访问相对集中的地区或网络中。当用户访问网站时,利用全局负载技术,将用户的访问指向距离最近的缓存服务器上,由缓存服务器响应用户请求。(有点像电商的本地仓吧?)

大家可能觉得,这个不就是“镜像服务器”嘛?其实不一样。镜像服务器是源内容服务器的完整复制。而CDN,是部分内容的缓存,智能程度更高。

从对CDN的理解到Nginx负载均衡_第1张图片
借用阿里云官网的例子,来简单介绍CDN的工作原理。
假设通过CDN加速的域名为www.a.com,接入CDN网络,开始使用加速服务后,当终端用户(北京)发起HTTP请求时,处理流程如下:

  1. 当终端用户(北京)向www.a.com下的指定资源发起请求时,首先向LDNS(本地DNS)发起域名解析请求。
  2. LDNS检查缓存中是否有www.a.com的IP地址记录。如果有,则直接返回给终端用户;如果没有,则向授权DNS查询。
  3. 当授权DNS解析www.a.com时,返回域名CNAME www.a.tbcdn.com对应IP地址。
  4. 域名解析请求发送至阿里云DNS调度系统,并为请求分配最佳节点IP地址。
  5. LDNS获取DNS返回的解析IP地址。
  6. 用户获取解析IP地址。
  7. 用户向获取的IP地址发起对该资源的访问请求。
  8. 如果该IP地址对应的节点已缓存该资源,则会将数据直接返回给用户,例如,图中步骤7和8,请求结束。
  9. 如果该IP地址对应的节点未缓存该资源,则节点向源站发起对该资源的请求。获取资源后,结合用户自定义配置的缓存策略,将资源缓存至节点,例如,图中的北京节点,并返回给用户,请求结束。

从这个例子可以了解到:

(1)CDN的加速资源是跟域名绑定的。
(2)通过域名访问资源,首先是通过DNS分查找离用户最近的CDN节点(边缘服务器)的IP
(3)通过IP访问实际资源时,如果CDN上并没有缓存资源,则会到源站请求资源,并缓存到CDN节点上,这样,用户下一次访问时,该CDN节点就会有对应资源的缓存了。

什么是负载均衡

简言之,负载均衡实际上就是将大量请求进行分布式处理的策略。

什么是 Nginx 负载均衡

通过上文简单的概念介绍,你可能对负载均衡有了一个初步的了解,知道它是一种调度策略。那么问题来了,Nginx 又是什么呢?Nginx 如何实现负载均衡?这就要从正向代理和反向代理说起了。

  1. 正向代理

正向代理(Forward Proxy)最大的特点是,客户端非常明确要访问的服务器地址,它代理客户端,替客户端发出请求。比如:科学上网。

假设客户端想要访问 Google,它明确知道待访问的服务器地址是 https://www.google.com/,但由于条件限制,它找来了一个能够访问到 Google 的”朋友”:代理服务器。客户端把请求发给代理服务器,由代理服务器代替它请求 Google,最终再将响应返回给客户端。这便是一次正向代理的过程,该过程中服务器并不知道真正发出请求的是谁。
从对CDN的理解到Nginx负载均衡_第2张图片
2. 反向代理
那么,随着请求量的爆发式增长,服务器觉得自己一个人始终是应付不过来,需要兄弟服务器们帮忙,于是它喊来了自己的兄弟以及代理服务器朋友。此时,来自不同客户端的所有请求实际上都发到了代理服务器处,再由代理服务器按照一定的规则将请求分发给各个服务器。这就是反向代理(Reverse Proxy),反向代理隐藏了服务器的信息,它代理的是服务器端,代其接收请求。换句话说,反向代理的过程中,客户端并不知道具体是哪台服务器处理了自己的请求。如此一来,既提高了访问速度,又为安全性提供了保证

从对CDN的理解到Nginx负载均衡_第3张图片
在这之中,反向代理需要考虑的问题是,如何进行均衡分工,控制流量,避免出现局部节点负载过大的问题。通俗的讲,就是如何为每台服务器合理的分配请求,使其整体具有更高的工作效率和资源利用率。

Nginx 是什么?

Nginx 作为一个基于 C 实现的高性能 Web 服务器,可以通过系列算法解决上述的负载均衡问题。并且由于它具有高并发、高可靠性、高扩展性、开源等特点,成为开发人员常用的反向代理工具

负载均衡常用算法

  1. 轮询 (round-robin)
    轮询为负载均衡中较为基础也较为简单的算法,它不需要配置额外参数。假设配置文件中共有 台服务器,该算法遍历服务器节点列表,并按节点次序每轮选择一台服务器处理请求。当所有节点均被调用过一次后,该算法将从第一个节点开始重新一轮遍历。特点:由于该算法中每个请求按时间顺序逐一分配到不同的服务器处理,因此适用于服务器性能相近的集群情况,其中每个服务器承载相同的负载。但对于服务器性能不同的集群而言,该算法容易引发资源分配不合理等问题。

  2. 加权轮询
    为了避免普通轮询带来的弊端,加权轮询应运而生。在加权轮询中,每个服务器会有各自的 weight。一般情况下,weight 的值越大意味着该服务器的性能越好,可以承载更多的请求。该算法中,客户端的请求按权值比例分配,当一个请求到达时,优先为其分配权值最大的服务器。特点:加权轮询可以应用于服务器性能不等的集群中,使资源分配更加合理化。

  3. IP 哈希(IP hash)
    ip_hash 依据发出请求的客户端 IP 的 hash 值来分配服务器,该算法可以保证同 IP 发出的请求映射到同一服务器,或者具有相同 hash 值的不同 IP 映射到同一服务器。特点:该算法在一定程度上解决了集群部署环境下 Session 不共享的问题。

  4. 其他算法

总结

Nginx 作为一款优秀的反向代理服务器,可以通过不同的负载均衡算法来解决请求量过大情况下的服务器资源分配问题。较为常见的负载均衡算法有轮询、加权轮询、IP 哈希等等,可分别应对不同的请求场景。如果有兴趣可以去 Github 理解下大神的源码,有问题也欢迎一起来探讨~

参考连接

  1. 阿里巴巴淘系技术
  2. 又拍云
  3. 前端开发-Me

你可能感兴趣的:(cdn,网络,分布式,nginx)