Nginx

Nginx负载均衡的4种方案
  1. 轮询
  2. 最少连接
  3. IP地址哈希
  4. 基于权重

    缓存

    image.png
    lua + redis

    模块扩展

    Core+模块化
    非常丰富的第三方插件(Lua、JS、Per)

    Nginx性能优化
  5. 网络连接:类似NIO百万连接,服务器内核调优

  6. Nignx参数:worker进程数、worker处理连接数、CPU核绑定、Worker权重

    服务需崩

    单台机器故障,导致后续机器连接上限超出全部故障
    image.png
    后端服务雪崩

    解决方案:
  7. 设置后台服务连接时间Timeout、故障尝试次数

  8. 健康检查插件
  9. 日志收集-弹性扩容

    LVS+Nginx

    image.png
    防止Nginx单点故障

image.png

LVS+Nginx


LVS (linux virtual server)

LVS工作在网络7层模型的传输层

LVS集群特点:
  1. 有实现三种IP负载均衡技术和八种连接调度算法的IPVS软件
  2. 在IPVS内部实现上,采用了高效的Hash函数和垃圾回收机制,能正确处理所调度报文相关的ICMP消息
  3. 虚拟服务的设置数目没有限制,每个虚拟服务有自己的服务器集群
  4. 它支持持久的虚拟服务(如HTTP Cookie 和 HTTPS等需要该功能的支持),并提供详尽的统计数据,如连接的处理速率和报文流量等
  5. 针对大规模拒绝服务(Deny of Service)攻击,实现了三种防卫策略
  6. 有基于内容请求分发应用层交换软件KTCPVS,它也是在Linux内核中实现的
  7. 有相关的集群管理软件对资源进行检测,能及时将故障屏蔽,实现系统的高可用性
  8. 主、从调度器能周期性的进行状态同步,从而实现更高的可用性
    IPVS调度算法
  • 轮询(Round Robin)
  • 加权轮询(Weighted Round Robin)
  • 最少链接(Least Connections)
  • 加权最少链接(Weighted Least Connections)
  • 基于局部性的最少链接(Locality-Based Least Connections)
  • 带赋值的基于局部性最少链接(Locality-Based Least Connections with Replication)
  • 目标地址散列(Destination Hashing)
  • 源地址散列(Source Hashing)

LVS-DR
VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器响应直接返回给客户。这种方法没有IP渠道的开销,对集群中的真实服务器也没有必须支持IP隧道的要求,但是要求调度器与真实服务器都有一块网卡在同一物理网段上
LVS-NAT
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器是,报文的源地址呗重写,再返回给客户,完成整个负载调度过程
LVS-TUN
采用NAT技术是,由于请求和相应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成文瓶颈。为了解决这个问题,调度器包请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用VS/TUN技术后,集群系统的最大吞吐量可提高10倍

内核Layer-7交换机KTCPVS

LVS与Nginx对比

负载均衡 4层负载均衡 7层负载均衡
技术原理 IP+TCP端口 URL应用层(内容交换)
典型代表 LVS Nignx、Haproxy、Mysql Proxy
优缺点 不理解mysql、ftp、http、等应用协议,满足不了特点需求,比如动静分离,缓存自定义等;但是配置简单,效率也很高 对负载均衡设备要求很高,处理七层能力一般低于四层模式的部署方式,但比较智能化,如动静分离,根据不同请求定义图片,缓存,可以对客户端请求和服务器的响应进行自定义修改,极大提升了应用系统在网络层的灵活性
安全性 SYNFlood攻击,有的软四层应用则会转发到后端服务器,有的则可以防止攻击,这个和设备有一定的关系 一般可以在七层进行拦截,不影响后台服务器正常运营,可以设置多种策略,过滤特定报文
应用 对应tcp应用,比如C/S开发的ERP 应用广泛HTTP协议,应用主要是网站或者内部信息平台等B/S开发系统
案列 接收客户的syn请求,通过选择后端指定服务器,彬彬对报文中目标IP地址进行修改,改为后端服务器IP,tcp连接是直接建立,而负载均衡类似路由器作用 如果要根据真正的应用层内容在选择服务器,则先代理最终服务器和客户端建立连接(三次握手)后,才可能接受客户端发送的真正应用层内容报文,然后根据该报文中特定字段,加上负载均衡设备服务器选择放手,决定最终选择的内部服务器。此时充当了代理服务器

Keepalived

  • keepalived是一个类似于layer3/4/7交换机机制的软件
  • keepalived的使用场景通常是高可用场景

检测服务器的状态,如果有一台web服务器宕机,或出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同事使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器集群中,这些全部自动完成,不需要人工干涉,只需要人工修复故障的服务器

CDN

Content Delivery Network ,内容分发网络

  • CDN是构建在网络之上的内容分发网络
  • CDN使用户就近获取所需内容,降低网络阻塞,提高用户访问响应速度和命中率
  • CDN依靠部署在各地的边缘服务器,包括中心平台的负载均衡、内容分发、调度等功能模块

主要特点

  1. 本地Cache加速
  2. 镜像服务
  3. 远程加速
  4. 宽带优化
  5. 集群抗攻击

    DNS

    DNS(Domain Name System,域名系统),其主要作用就是将主机名解析成ip地址的过程,完成了从域名到主机识别ip地址之间的转换

  6. DNS是一个分布式、分层次的主机名管理架构,通过配置DNS服务器地址,主机不需要知道对应ip地址就能通过主机名的形式访问互联网

  7. DNS利用类似倒状树的目录结构将主机名的管理分配在不同层级的DNS服务器当中,经过分层管理,每一级DNS服务器负责部分域名信息,这就减轻了DNS服务器的负载,同时也方便记录更新同步
  8. DNS是一个网络服务,英雌有对应的端口,其端口号为53号。DNS查询的时候,是以udp这个比较快速的数据传输协议来查询的,但万一没有方法查询到完整的信息时,就会再次以tcp这个来查询,DNS服务器在启动的时候会同时开启tcp的53端口和udp的53号端口
  9. DNS在进行区域传输的时候使用TCP协议,其他时候则使用UDP协议。
  10. FQDN(Full Qualified Domain Name):完整主机名,是有主机名和域名构成。例如www.baidu.com当中,www就是web网站服务器的主机名,baidu.com就是域名,主机名和域名之间用实心点好来表示
  11. DNS是机遇C/S架构(多数机遇套接字架构的C/S架构),对于每一级域名长度的限制是63个字符,域名长度则不能超过253个字符
  12. DNS系统记录信息非常多,不过重点就是两个:一个是记录服务器所在的NS(name server)标志,另一个是纪律主机名对应的A(address)标志

image.png
DNS简介


Tengine

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台


OpenResty

OpenResty是一个基于 NginxLua 的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty通过汇聚各种设计精良的Nginx模块,从而将Nginx有效地变成一个强大的通用Web应用平台。这样,Web开发人员和系统工程师可以使用Lua脚本语言调Nginx支持的各种C以及Lua模块,快速构造出足以胜任10K乃至1000K以上单机并发连接的高性能Web应用系统。
从上面官网的描述信息中,可以看出OpenResty主要包含两方面的技术:

  • Nginx:一款轻量级、高性能、高并发的Web服务器。
  • Lua:一种轻量、小巧、可移植、快速的脚本语言;LuaJIT即时编译器会将频繁执行的Lua代码编译成本地机器码交给CPU直接执行,执行效率更高,OpenResty会默认启用LuaJIT

既然DNS可以实现负载均衡,为什么还会出现nginx、lvs这样的负载均衡技术,请论述DNS实现负载均衡有什么不足?
  • 第一,不能够按照Web服务器的处理能力分配负载。DNS负载均衡采用的是简单的轮循负载算法,不能区分服务器之间的差异,不能反映服务器的当前运行状态。所以DNS服务器将Http请求平均地分配到后台的Web服务器上,而不考虑每个Web服务器当前的负载情况。如果后台的Web服务器的配置和处理能力不同,最慢的 Web服务器将成为系统的瓶颈,处理能力强的服务器不能充分发挥作用。不能做到为性能较好的服务器多分配请求,甚至会出现客户请求集中在某一台服务器上的情况。
  • 第二,不支持高可靠性,DNS负载均衡技术没有考虑容错。如果后台的某台Web服务器出现故障,DNS服务器仍然会把DNS 请求分配到这台故障服务器上,导致不能响应客户端。
  • 第三,可能会造成额外的网络问题。为了使本DNS服务器和其他DNS服务器及时交互,保证DNS数据及时更新,使地址能随机分配,一般都要将DNS的刷新时间设置的较小,但太小将会使DNS流量大增造成额外的网络问题。
  • 第四,一旦某个服务器出现故障,即使及时修改了DNS设置,还是要等待足够的时间(刷新时间)才能发挥作用,在此期间,保存了故障服务器地址的客户计算机将不能正常访问服务器。

image.png
编辑者:Jason