精华内容
下载资源
问答
  • LVS 负载均衡

    万次阅读 2020-02-22 10:42:05
    LVS是Linux Virtual Server的简写,...负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、haproxy,商业的硬件负载均衡设备F5、Netscale。 使用集群技术...

    LVSLinux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、haproxy,商业的硬件负载均衡设备F5、Netscale。

    • 使用集群技术和Linux操作系统实现一个高性能、高可用的服务器.
    • 很好的可伸缩性(Scalability)
    • 很好的可靠性(Reliability)
    • 很好的可管理性(Manageability)
    • 开源,免费
    • 在网上能找到一些相关技术资源
    • 具有软件负载均衡的一些优点

    可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术

    LVS技术

    • 技术简介

    LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

    一般来说,LVS集群采用三层结构,其主要组成部分为:

    A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。

    B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。

    C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

    • 调度器

    调度器是服务器集群系统的唯一入口点(Single Entry Point),它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客户请求到达时,调度器只根据服务器负载情况和设定的调度算法从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的其他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提供不同的服务,当客户请求到达时,调度器可根据请求的内容选择服务器执行请求。因为所有的操作都是在Linux操作系统核心空间中完成的,它的调度开销很小,所以它具有很高的吞吐率。服务器池的结点数目是可变的。当整个系统收到的负载超过所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。

    对大多数网络服务来说,请求间不存在很强的相关性,请求可以在不同的节点上并行执行,所以整个系统的性能基本上可以随着服务器池的结点数目增加而线性增长。 共享存储通常是数据库、网络文件系统或者分布式文件系统。服务器结点需要动态更新的数据一般存储在数据库系统中,同时数据库会保证并发访问时数据的一致性。静态的数据可以存储在网络文件系统(如NFS/CIFS)中,但网络文件系统的伸缩能力有限,一般来说,NFS/CIFS服务器只能支持3~6个繁忙的服务器结点。对于规模较大的集群系统,可以考虑用分布式文件系统,如AFS、GFS、Coda和Intermezzo等。分布式文件系统可为各服务器提供共享的存储区,它们访问分布式文件系统就像访问本地文件系统一样,同时分布式文件系统可提供良好的伸缩性和可用性。

    LVS的八种调度算法

    1. 轮叫调度 rr :这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
    2.  加权轮叫 wrr :这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
    3. 最少链接 lc :这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
    4. 加权最少链接 wlc :这个算法比 lc 多了一个权重的概念。
    5. 基于局部性的最少连接调度算法 lblc:这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
    6. 复杂的基于局部性最少的连接算法 lblcr :记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
    7. 目标地址散列调度算法 dh :该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
    8. 源地址散列调度算法 sh :与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
    • 分布式锁管理器

    此外,当不同服务器上的应用程序同时读写访问分布式文件系统上同一资源时,应用程序的访问冲突需要消解才能使得资源处于一致状态。这需要一个分布式锁管理器(Distributed Lock Manager),它可能是分布式文件系统内部提供的,也可能是外部的。开发者在写应用程序时,可以使用分布式锁管理器来保证应用程序在不同结点上并发访问的一致性。

    负载调度器、服务器池和共享存储系统通过高速网络相连接,如100Mbps交换网络、Myrinet和Gigabit网络等。使用高速的网络,主要为避免当系统规模扩大时互联网络成为整个系统的瓶颈。

    • 监视器

    Graphic Monitor是为系统管理员提供整个集群系统的监视器,它可以监视系统的状态。Graphic Monitor是基于浏览器的,所以无论管理员在本地还是异地都可以监测系统的状况。为了安全的原因,浏览器要通过HTTPS(Secure HTTP)协议和身份认证后,才能进行系统监测,并进行系统的配置和管理。

    • LVS 由2部分程序组成, ipvs 和 ipvsadm。

      ipvs(ip virtual server):工作在内核空间,叫ipvs,是真正生效实现调度的代码。
      pvsadm:工作在用户空间,负责为ipvs内核框架编写规则,定义谁是集群服务,谁是后端真实的服务器(Real Server)

    • DS:Director Server。指的是前端负载均衡器节点。
    • RS:Real Server。后端真实的工作服务器。
    • VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
    • DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
    • RIP:Real Server IP,后端服务器的IP地址。
    • CIP:Client IP,访问客户端的IP地址。

    LVS 三种工作模式的解析

    • 基于NAT的LVS模式负载均衡

          NAT(Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用用户可以访问位于公司内部的私有IP主机。VS/NAT工作模式拓扑结构如图2所示,LVS负载调度器可以使用两块网卡配置不同的IP地址,eth0设置为私钥IP与内部网络通过交换设备相互连接,eth1设备为外网IP与外部网络联通。

           第一步,用户通过互联网DNS服务器解析到公司负载均衡设备上面的外网地址,相对于真实服务器而言,LVS外网IP又称VIP(Virtual IP Address),用户通过访问VIP,即可连接后端的真实服务器(Real Server),而这一切对用户而言都是透明的,用户以为自己访问的就是真实服务器,但他并不知道自己访问的VIP仅仅是一个调度器,也不清楚后端的真实服务器到底在哪里、有多少真实服务器。

    第二步,用户将请求发送至124.126.147.168,此时LVS将根据预设的算法选择后端的一台真实服务器(192.168.0.1~192.168.0.3),将数据请求包转发给真实服务器,并且在转发之前LVS会修改数据包中的目标地址以及目标端口,目标地址与目标端口将被修改为选出的真实服务器IP地址以及相应的端口。

    第三步,真实的服务器将响应数据包返回给LVS调度器,调度器在得到响应的数据包后会将源地址和源端口修改为VIP及调度器相应的端口,修改完成后,由调度器将响应数据包发送回终端用户,另外,由于LVS调度器有一个连接Hash表,该表中会记录连接请求及转发信息,当同一个连接的下一个数据包发送给调度器时,从该Hash表中可以直接找到之前的连接记录,并根据记录信息选出相同的真实服务器及端口信息。

    • 基于TUN的LVS负载均衡

           在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。VS/TUN工作模式拓扑结构如图3所示。其中,IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。

    • 基于DR的LVS负载均衡

    在LVS(TUN)模式下,由于需要在LVS调度器与真实服务器之间创建隧道连接,这同样会增加服务器的负担。与LVS(TUN)类似,DR模式也叫直接路由模式,其体系结构如图4所示,该模式中LVS依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端。与隧道模式不同的是,直接路由模式(DR模式)要求调度器与后端服务器必须在同一个局域网内,VIP地址需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源IP为VIP地址,目标IP为客户端IP,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),客户端是感觉不到后端服务器存在的。由于多台计算机都设置了同样一个VIP地址,所以在直接路由模式中要求调度器的VIP地址是对外可见的,客户端需要将请求数据包发送到调度器主机,而所有的真实服务器的VIP地址必须配置在Non-ARP的网络设备上,也就是该网络设备并不会向外广播自己的MAC及对应的IP地址,真实服务器的VIP对外界是不可见的,但真实服务器却可以接受目标地址VIP的网络请求,并在回应数据包时将源地址设置为该VIP地址。调度器根据算法在选出真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器。整个过程中,真实服务器的VIP不需要对外界可见。


    • 下面开始搭建基于 DR 模式 的 LVS 负载均衡
    • 试验环境简介
    • VIP 172.16.1.168
    • Director Server CentOS 7.5 :  (eth0 192.168.1.2  eth1 172.16.1.1  vip eth1:0 172.16.1.168)

    • Real server1 CentOS 7.5 : (eth0 172.16.1.4  vip lo:0 172.16.1.168)

    • Real server2 CentOS 7.5 : (eth0 172.16.1.5  vip lo:0 172.16.1.168)


    • 首先在  Director 上使用 yum 方式安装 ipvsadm
    • 在 CentOS 7 中 LVS 默认已经被编译进内核中,主要分为两部分ipvs和ipvsadm,ipvs是LVS软件核心,是运行在LB上的,基于ip层的负载均衡;ipvsadm 是用户空间(DR)集群管理工具。
    • 查看内核是否加载 LVS 模块
    • lsmod | grep ip_vs
    • 安装 ipvsadm
    • yum install -y ipvsadm
    • 要想起到负载均衡效果,所有请求报文必须发往 LVS 服务器(DS),然后 DS 根据指定算法分发到后端服务器上(RS),因此DS必须配置VIP地址,VIP是与公网client通信地址,这样DS才能接受到请求报文进行分发。
    • 在LVS 服务器上添加一个地址为 VIP 的虚拟网卡eth1:0
    • ifconfig eth1:0 172.16.1.168 netmask 255.255.255.255 up
    • 添加 IPVS 规则
    • ipvsadm -A -t 172.16.1.168:80 -s wrr
      ipvsadm -a -t 172.16.1.168:80 -r 172.16.1.4:80 -g -w 1
      ipvsadm -a -t 172.16.1.168:80 -r 172.16.1.5:80 -g -w 1
      ipvsadm-save -n > /etc/sysconfig/ipvsadm
      -A -t server1.2:http -s wrr
      -a -t server1.2:http -r 172.16.1.4:http -g -w 1
      -a -t server1.2:http -r 172.16.1.5:http -g -w 1
      systemctl start ipvsadm
    • 确认无误启动 LVS 服务
    • PS:规则文件会保存在 /etc/sysconfig/ipvsadm 文件中


    • 接着分别在  Real server (Rs)端设置
    • 将对应网卡设置为只回应目标IP为自身接口地址的ARP请求

    echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore

    echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

    将ARP请求的源IP设置为eth0上的IP,也就是RIP

    echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

    echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

    • 永久生效方式,编辑 /etc/sysctl.conf 在末尾添加
    • net.ipv4.conf.all.arp_ignore=1
      net.ipv4.conf.lo.arp_ignore=1
      net.ipv4.conf.all.arp_announce=2
      net.ipv4.conf.lo.arp_announce=2
    • 必须完成以上设置,然后添加IP地址为 VIP 的虚拟网卡lo:0
    • ifconfig lo:0 172.16.1.168 netmask 255.255.255.255 up
    • 添加一条路由,目标IP为VIP的数据包使用lo接口发送,这样响应报文的源IP就会为VIP

    • route add -host 172.16.1.168 dev lo:0

    • 使用 yum 方式安装 nginx
    • yum -y install nginx
    • echo "<html><h1> 172.16.1.4 </h1></html>" > /usr/share/nginx/html/index.html 
    • systemctl start nginx

    • 两台 RS 都要做相同的设置

    • 打开浏览器 输入 http://172.16.1.168,手动刷新查看结果(一直按住F5可以看到变化)


    • Linux 内核参数arp_ignore和arp_announce作用说明

      arp_ignore - INTEGER
      0:默认值,表示可使用本地任意接口上配置的任意地址进行arp应答;
      1:仅当请求的目标IP配置在本地主机接受到报文的接口上时,才给予响应;
      2:仅当目的IP配置在收到报文的接口上,且arp请求的源IP和该接口同一网段,才响应arp请求;
      3:如ARP请求的IP作用域是主机则不响应,如果作用域是全局或者链路则响应ARP
      4-7:保留
      8:不应答所有本地IP
      arp_announce - INTEGER
      0:默认值,允许使用本机上所有接口的IP作ARP通告。
      1:尽量避免使用本地IP向非本网卡直接连接网络进行ARP通告。
      2:必须避免使用本地IP向非本网卡直接连接网络进行ARP通告

     

     

    展开全文
  • Linux Nginx 负载均衡

    万次阅读 2020-03-05 11:07:04
    负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。负载...

    负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。

    • 软/硬件负载均衡

    软件负载均衡解决方案是指在一台或多台服务器相应的操作系统上安装一个或多个附加软件来实现负载均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的优点是基于特定环境,配置简单,使用灵活,成本低廉,可以满足一般的负载均衡需求。

    软件解决方案缺点也较多,因为每台服务器上安装额外的软件运行会消耗系统不定量的资源,越是功能强大的模块,消耗得越多,所以当连接请求特别大的时候,软件本身会成为服务器工作成败的一个关键;软件可扩展性并不是很好,受到操作系统的限制;由于操作系统本身的Bug,往往会引起安全问题。

    硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备通常称之为负载均衡器,由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。

    负载均衡器有多种多样的形式,除了作为独立意义上的负载均衡器外,有些负载均衡器集成在交换设备中,置于服务器与Internet链接之间,有些则以两块网络适配器将这一功能集成到PC中,一块连接到Internet上,一块连接到后端服务器群的内部网络上。一般而言,硬件负载均衡在功能、性能上优于软件方式,不过成本昂贵。

    • 本地/全局负载均衡

    负载均衡从其应用的地理结构上分为本地负载均衡(Local Load Balance)和全局负载均衡(Global Load Balance,也叫地域负载均衡),本地负载均衡针对本地范围的服务器群做负载均衡,全局负载均衡针对不同地理位置、不同网络结构的服务器群做负载均衡。

    本地负载均衡不需要花费高额成本购置高性能服务器,只需利用现有设备资源,就可有效避免服务器单点故障造成数据流量的损失,通常用来解决数据流量过大、网络负荷过重的问题。同时它拥有形式多样的均衡策略把数据流量合理均衡的分配到各台服务器。如果需要在现在服务器上升级扩充,不需改变现有网络结构、停止现有服务,仅需要在服务群中简单地添加一台新服务器。

    全局负载均衡主要解决全球用户只需一个域名或IP地址就能访问到离自己距离最近的服务器获得最快的访问速度,它在多区域都拥有自己的服务器站点,同时也适用于那些子公司站点分布广的大型公司通过企业内部网(Intranet)达到资源合理分配的需求。

    全局负载均衡具备的特点:

    1. 提高服务器响应速度,解决网络拥塞问题,达到高质量的网络访问效果。

    2. 能够远距离为用户提供完全的透明服务,真正实现与地理位置无关性

    3. 能够避免各种单点失效,既包括数据中心、服务器等的单点失效,也包括专线故障引起的单点失效

    负载均衡部署方式

    负载均衡有三种部署方式:路由模式、桥接模式、服务直接返回模式。路由模式部署灵活,约60%的用户采用这种方式部署;桥接模式不改变现有的网络架构;服务直接返回(DSR)比较适合吞吐量大特别是内容分发的网络应用。约30%的用户采用这种模式。

    • 路由模式(推荐)

    路由模式的部署方式,服务器的网关必须设置成负载均衡机的LAN口地址,且与WAN口分署不同的逻辑网络。因此所有返回的流量也都经过负载均衡。这种方式对网络的改动小,能均衡任何下行流量。

    • 桥接模式

    桥接模式配置简单,不改变现有网络。负载均衡的WAN口和LAN口分别连接上行设备和下行服务器。LAN口不需要配置IP(WAN口与LAN口是桥连接),所有的服务器与负载均衡均在同一逻辑网络中。

    由于这种安装方式容错性差,网络架构缺乏弹性,对广播风暴及其他生成树协议循环相关联的错误敏感,因此一般不推荐这种安装架构。

    • 服务直接返回模式

    这种安装方式负载均衡的LAN口不使用,WAN口与服务器在同一个网络中,互联网的客户端访问负载均衡的虚IP(VIP),虚IP对应负载均衡机的WAN口,负载均衡根据策略将流量分发到服务器上,服务器直接响应客户端的请求。因此对于客户端而言,响应他的IP不是负载均衡机的虚IP(VIP),而是服务器自身的IP地址。也就是说返回的流量是不经过负载均衡的。因此这种方式适用大流量高带宽要求的服务。


    Nginx 是一款高性能的HTTP和反向代理服务工具,现在很多大型网站都使用 Nginx 做负载均衡,由于支持高并发和资源占用低,越来越受到欢迎,下面介绍 Nginx 几种常用的负载均衡策略。

    • Nginx常用的几种负载均衡配置

    • 轮询模式:这种方式是nginx.conf配置文件的默认配置方式,当客户端访问服务的时候,请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
    • weight权重模式:这种方式比较灵活,当后端服务器性能存在差异的时候,通过配置权重,可以让服务器的性能得到充分发挥,有效利用资源。weight和访问比率成正比,用于后端服务器性能不均的情况。权重越高,在被访问的概率越大
    • ip_hash:配置很简单,在upstream中采用ip_hash指令,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。此种策略,可以实现同一个用户访问同一台服务器,会话不会丢失,但是可能会分配不均
    • fair(第三方插件):这种方式根据后端服务器的响应时间进行分配,响应快的优先分配请求
    • url  hash(第三方插件):此种方式和ip_hash比较类似,根据url的hash值进行分配,将url分配到同一个后端服务器,当服务器存在缓存时比较有效
    • nginx.conf 中命令说明

      down 表示单前的server暂时不参与负载 

      weight 默认为1.weight越大,负载的权重就越大。 

      max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误 

      fail_timeout:max_fails次失败后,暂停的时间。 

      backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻


    • 实验环境
    • Server 192.168.1.2 CentOS 7.5 Nginx+负载均衡
    • Web 1 192.168.1.3 CentOS 7.5 Nginx+PHP
    • Web 2 192.168.1.4 CentOS 7.5 Nginx+PHP
    • Web 3 192.168.1.5 CentOS 7.5 Nginx+PHP

    • 分别在 Server 和 Web 端安装 Nginx,使用 Nginx 官网提供的 Yum 方式安装
    • Nginx  Yum 官方源   http://nginx.org/packages/    
      CentOS 7.X :

      rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

      CentOS 6.X :

      rpm -Uvh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

    • yum -y install nginx PS:确保 /etc/yum.repo.d/nginx.repo 为 enabled = 1 开启状态

    • Nginx+PHP 安装详细设置请参照拙作:Linux Nginx + PHP 安装及调优https://blog.csdn.net/gaofei0428/article/details/104058580


    • 安装完成后,首先在 Server 192.168.1.2 端配置 Nginx 负载均衡
    • vim /etc/nginx/nginx.conf
    • 在 http {......} 字段添加以下信息
    • http {

    ..........

        upstream myweb{    #开启负载均衡及定义名称
            ip_hash;     #采用 ip_hash 方式的负载均衡配置
            server 192.168.1.3 max_fails=10 fail_timeout=60s;
            server 192.168.1.4 max_fails=10 fail_timeout=60s;
            server 192.168.1.5 max_fails=10 fail_timeout=60s;
            }

    #连接探测设置,如果发现后端异常,在单位周期为fail_timeout设置的时间,中达到max_fails次数,这个周期次数内,如果后端同一个节点不可用,那么接将把节点标记为不可用,并等待下一个周期(同样时常为fail_timeout)再一次去请求,判断是否连接是否成功
        include /etc/nginx/conf.d/*.conf;
    }

    • 确认无误保存退出,接下来编辑 /etc/nginx/conf.d/default.conf 
    • vim /etc/nginx/conf.d/default.conf
    • server {
          listen      *:80;
          server_name  www.myweb.com;
          location / {
              proxy_pass  http://myweb;     #使用前面定义的负载均衡配置
              proxy_set_header Host $host;    #允许重新定义或者添加发往后端服务器的请求头。$host变量值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名
              proxy_set_header X-Forwarded-For $remote_addr;    #增加节点服务器记录的IP字段
          }
      }
    • 确认无误保存退出,启动 Nginx


    • 下面开始测试,这里为了测试效果,暂时把 #ip_hash; 设置注释掉
    • 更改物理机的 HOSTS 文件 添加 192.168.1.2 www.myweb.com
    • 打开浏览器输入 www.myweb.com 按住 F5 可以看到变化

     

    展开全文
  • nginx反向代理--负载均衡

    万次阅读 多人点赞 2018-10-19 17:39:37
    Nginx配置详解 nginx概述 ...同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理... 负载均衡 nginx特点 1. 反向代理 关于代理 说到代理,首先...

    Nginx配置详解

    nginx概述

    nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。

    这里主要通过三个方面简单介绍nginx

    • 反向代理
    • 负载均衡
    • nginx特点

    1. 反向代理

    关于代理

    说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道;

    此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户

     


    正向代理

    说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理

    正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。

    举例图片审核不过 大家自行理解吧


    反向代理

     

    明白了什么是正向代理,我们继续看关于反向代理的处理方式,举例如我大天朝的某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用nginx进行反向代理实现的,并且通过封装nginx和其他的组件之后起了个高大上的名字:Tengine,有兴趣的童鞋可以访问Tengine的官网查看具体的信息:http://tengine.taobao.org/
    那么反向代理具体是通过什么样的方式实现的分布式的集群操作呢,我们先看一个示意图:

     

    通过上述的图解大家就可以看清楚了,多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色

    反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!

    项目场景

    通常情况下,我们在实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向单利服务器,反向代理了多台真实的业务处理服务器。具体的拓扑图如下:

    2. 负载均衡

    我们已经明确了所谓代理服务器的概念,那么接下来,nginx扮演了反向代理服务器的角色,它是以依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否可以控制呢?

    这里提到的客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量

    请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则

    所以~将服务器接收到的请求按照规则分发的过程,称为负载均衡。

    负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制

     

    nginx支持的负载均衡调度算法方式如下:

    1. weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。

    2. ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。

    3. fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块

    4. url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包

    Nginx安装

    1. windows安装

    官方网站下载地址:

    https://nginx.org/en/download.html
    

     

     

    如下图所示,下载对应的版本的nginx压缩包,解压到自己电脑上存放软件的文件夹中即可

     

    解压完成后,文件目录结构如下:

     

     

    启动nginx

    1) 直接双击该目录下的nginx.exe,即可启动nginx服务器

    2) 命令行计入该文件夹,执行nginx命令,也会直接启动nginx服务器

    D:/resp_application/nginx-1.13.5> nginx

     

    访问nginx

    打开浏览器,输入地址:http://localhost,访问页面,出现如下页面表示访问成功

     

    停止nginx

    命令行进入nginx根目录,执行如下命令,停止服务器:

    # 强制停止nginx服务器,如果有未处理的数据,丢弃
    D:/resp_application/nginx-1.13.5> nginx -s stop
    
    # 优雅的停止nginx服务器,如果有未处理的数据,等待处理完成之后停止
    D:/resp_application/nginx-1.13.5> nginx -s quit

     

    2. ubuntu安装

    按照正常软件的安装方式,直接通过如下命令进行安装:

    $ sudo apt-get install nginx

    安装完成即可,在/usr/sbin/目录下是nginx命令所在目录,在/etc/nginx/目录下是nginx所有的配置文件,用于配置nginx服务器以及负载均衡等信息

     

    查看nginx进程是否启动

    $ ps -ef|grep nginx

    nginx会自动根据当前主机的CPU的内核数目创建对应的进程数量(当前ubuntu主机是2核4线程配置)

    备注:这里启动的服务进程其实是4个进程,因为nginx进程在启动的时候,会附带一个守护进程,用于保护正式进程不被异常终止;如果守护进程一旦返现nginx继承被终止了,会自动重启该进程。

    守护进程一般会称为master进程,业务进程被称为worker进程

     

    启动nginx服务器命令

    直接执行nginx会按照默认的配置文件进行服务器的启动

    $ nginx

     

    停止nginx服务命令

    和windows系统执行过程一样,两种停止方式

    $ nginx -s stop
    or
    $ nginx -s quit

     

    重新启动加载

    同样也可以使用命令reopen和reload来重新启动nginx或者重新加载配合着文件。

     

    3. mac os安装

    直接通过brew进行nginx的安装,或者下载tar.gz压缩包都是可以的。

    直接通过brew进行安装

    brew install nginx

    安装完成后,后续的命令操作,服务器的启动、进程查看、服务器的停止、服务器的重启已经文件加载命令都是一致的。

    nginx配置

    nginx是一个功能非常强大的web服务器加反向代理服务器,同时又是邮件服务器等等

    在项目使用中,使用最多的三个核心功能是反向代理、负载均衡和静态服务器

    这三个不同的功能的使用,都跟nginx的配置密切相关,nginx服务器的配置信息主要集中在nginx.conf这个配置文件中,并且所有的可配置选项大致分为以下几个部分

    main                                # 全局配置
    
    events {                            # nginx工作模式配置
    
    }
    
    http {                                # http设置
        ....
    
        server {                        # 服务器主机配置
            ....
            location {                    # 路由配置
                ....
            }
    
            location path {
                ....
            }
    
            location otherpath {
                ....
            }
        }
    
        server {
            ....
    
            location {
                ....
            }
        }
    
        upstream name {                    # 负载均衡配置
            ....
        }
    }

     

    如上述配置文件所示,主要由6个部分组成:

    1. main:用于进行nginx全局信息的配置
    2. events:用于nginx工作模式的配置
    3. http:用于进行http协议信息的一些配置
    4. server:用于进行服务器访问信息的配置
    5. location:用于进行访问路由的配置
    6. upstream:用于进行负载均衡的配置

    main模块

    观察下面的配置代码

    # user nobody nobody;
    worker_processes 2;
    # error_log logs/error.log
    # error_log logs/error.log notice
    # error_log logs/error.log info
    # pid logs/nginx.pid
    worker_rlimit_nofile 1024;

    上述配置都是存放在main全局配置模块中的配置项

    • user用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
    • worker_processes指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
    • error_log定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
    • pid用来指定进程id的存储文件的位置
    • worker_rlimit_nofile用于指定一个进程可以打开最多文件数量的描述

    event 模块

    上干货

    event {
        worker_connections 1024;
        multi_accept on;
        use epoll;
    }

    上述配置是针对nginx服务器的工作模式的一些操作配置

    • worker_connections 指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。
    • multi_accept 配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
    • use epoll 配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue

    http模块

    作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置,常规情况下,使用默认配置即可!

    http {
        ##
        # 基础配置
        ##
    
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;
    
        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;
    
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
    
        ##
        # SSL证书配置
        ##
    
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;
    
        ##
        # 日志配置
        ##
    
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
    
        ##
        # Gzip 压缩配置
        ##
    
        gzip on;
        gzip_disable "msie6";
    
        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript
     text/xml application/xml application/xml+rss text/javascript;
    
        ##
        # 虚拟主机配置
        ##
    
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;

    1) 基础配置

    sendfile on:配置on让sendfile发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处
    tc_nopush on:让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
    tcp_nodelay on:让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦
    
    keepalive_timeout 10:给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好
    client_header_timeout 10:设置请求头的超时时间
    client_body_timeout 10:设置请求体的超时时间
    send_timeout 10:指定客户端响应超时时间,如果客户端两次操作间隔超过这个时间,服务器就会关闭这个链接
    
    limit_conn_zone $binary_remote_addr zone=addr:5m :设置用于保存各种key的共享内存的参数,
    limit_conn addr 100: 给定的key设置最大连接数
    
    server_tokens:虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处哦
    include /etc/nginx/mime.types:指定在当前文件中包含另一个文件的指令
    default_type application/octet-stream:指定默认处理的文件类型可以是二进制
    type_hash_max_size 2048:混淆数据,影响三列冲突率,值越大消耗内存越多,散列key冲突率会降低,检索速度更快;值越小key,占用内存较少,冲突率越高,检索速度变慢

    2) 日志配置

    access_log logs/access.log:设置存储访问记录的日志
    error_log logs/error.log:设置存储记录错误发生的日志

    3) SSL证书加密

    ssl_protocols:指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。
    ssl prefer server ciphers:设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件

    4) 压缩配置

    gzip 是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
    gzip_disable 为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
    gzip_static 告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。
    gzip_proxied 允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。
    gzip_min_length 设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。
    gzip_comp_level 设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。
    gzip_type 设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。

    5) 文件缓存配置

    open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。
    open_file_cache_valid 在open_file_cache中指定检测正确信息的间隔时间。
    open_file_cache_min_uses 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。
    open_file_cache_errors 指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。

    server模块

    srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息

    server {
        listen        80;
        server_name localhost    192.168.1.100;
        root        /nginx/www;
        index        index.php index.html index.html;
        charset        utf-8;
        access_log    logs/access.log;
        error_log    logs/error.log;
        ......
    }

    核心配置信息如下:

    • server:一个虚拟主机的配置,一个http中可以配置多个server

    • server_name:用力啊指定ip地址或者域名,多个配置之间用空格分隔

    • root:表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录

    • index:用户访问web网站时的全局首页

    • charset:用于设置www/路径中配置的网页的默认编码格式

    • access_log:用于指定该虚拟主机服务器中的访问记录日志存放路径

    • error_log:用于指定该虚拟主机服务器中访问错误日志的存放路径

    location模块

    location模块是nginx配置中出现最多的一个配置,主要用于配置路由访问信息

    在路由访问信息配置中关联到反向代理、负载均衡等等各项功能,所以location模块也是一个非常重要的配置模块

    基本配置

    location / {
        root    /nginx/www;
        index    index.php index.html index.htm;
    }

    location /:表示匹配访问根目录

    root:用于指定访问根目录时,访问虚拟主机的web目录

    index:在不指定访问具体资源时,默认展示的资源文件列表

    反向代理配置方式

    通过反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化

    location / {
        proxy_pass http://localhost:8888;
        proxy_set_header X-real-ip $remote_addr;
        proxy_set_header Host $http_host;
    }

    uwsgi配置

    wsgi模式下的服务器配置访问方式

    location / {
        include uwsgi_params;
        uwsgi_pass localhost:8888
    }

    upstream模块

    upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器

    简单的配置方式如下

    upstream name {
        ip_hash;
        server 192.168.1.100:8000;
        server 192.168.1.100:8001 down;
        server 192.168.1.100:8002 max_fails=3;
        server 192.168.1.100:8003 fail_timeout=20s;
        server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
    }

    核心配置信息如下

    • ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定

    • server host:port:分发服务器的列表配置

    • -- down:表示该主机暂停服务

    • -- max_fails:表示失败最大次数,超过失败最大次数暂停服务

    • -- fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求

    展开全文
  • 高并发解决方案之一 ——负载均衡

    万次阅读 多人点赞 2018-04-15 21:52:15
    1.什么是负载均衡?当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台...

    1.什么是负载均衡?

            当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。

    那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题。

    下面详细介绍负载均衡的四种实现方式。 

    (一)HTTP重定向实现负载均衡

    过程描述

            当用户向服务器发起请求时,请求首先被集群调度者截获;调度者根据某种分配策略,选择一台服务器,并将选中的服务器的IP地址封装在HTTP响应消息头部的Location字段中,并将响应消息的状态码设为302,最后将这个响应消息返回给浏览器。

    当浏览器收到响应消息后,解析Location字段,并向该URL发起请求,然后指定的服务器处理该用户的请求,最后将结果返回给用户。

    在使用HTTP重定向来实现服务器集群负载均衡的过程中,需要一台服务器作为请求调度者。用户的一项操作需要发起两次HTTP请求,一次向调度服务器发送请求,获取后端服务器的IP,第二次向后端服务器发送请求,获取处理结果。 
     

    调度策略

        调度服务器收到用户的请求后,究竟选择哪台后端服务器处理请求,这由调度服务器所使用的调度策略决定。

    1. 随机分配策略 
      当调度服务器收到用户请求后,可以随机决定使用哪台后端服务器,然后将该服务器的IP封装在HTTP响应消息的Location属性中,返回给浏览器即可。

    2. 轮询策略(RR) 
      调度服务器需要维护一个值,用于记录上次分配的后端服务器的IP。那么当新的请求到来时,调度者将请求依次分配给下一台服务器。

    由于轮询策略需要调度者维护一个值用于记录上次分配的服务器IP,因此需要额外的开销;此外,由于这个值属于互斥资源,那么当多个请求同时到来时,为了避免线程的安全问题,因此需要锁定互斥资源,从而降低了性能。而随机分配策略不需要维护额外的值,也就不存在线程安全问题,因此性能比轮询要高。 
     

    优缺点分析

       采用HTTP重定向来实现服务器集群的负载均衡实现起来较为容易,逻辑比较简单,但缺点也较为明显。

    在HTTP重定向方法中,调度服务器只在客户端第一次向网站发起请求的时候起作用。当调度服务器向浏览器返回响应信息后,客户端此后的操作都基于新的URL进行的(也就是后端服务器),此后浏览器就不会与调度服务器产生关系,进而会产生如下几个问题:

    • 由于不同用户的访问时间、访问页面深度有所不同,从而每个用户对各自的后端服务器所造成的压力也不同。而调度服务器在调度时,无法知道当前用户将会对服务器造成多大的压力,因此这种方式无法实现真正意义上的负载均衡,只不过是把请求次数平均分配给每台服务器罢了。
    • 若分配给该用户的后端服务器出现故障,并且如果页面被浏览器缓存,那么当用户再次访问网站时,请求都会发给出现故障的服务器,从而导致访问失败。
     

    (二)DNS负载均衡

    DNS是什么?

    在了解DNS负载均衡之前,我们首先需要了解DNS域名解析的过程。

    我们知道,数据包采用IP地址在网络中传播,而为了方便用户记忆,我们使用域名来访问网站。那么,我们通过域名访问网站之前,首先需要将域名解析成IP地址,这个工作是由DNS完成的。也就是域名服务器。

    我们提交的请求不会直接发送给想要访问的网站,而是首先发给域名服务器,它会帮我们把域名解析成IP地址并返回给我们。我们收到IP之后才会向该IP发起请求。

    那么,DNS服务器有一个天然的优势,如果一个域名指向了多个IP地址,那么每次进行域名解析时,DNS只要选一个IP返回给用户,就能够实现服务器集群的负载均衡。 
     

    具体做法

    首先需要将我们的域名指向多个后端服务器(将一个域名解析到多个IP上),再设置一下调度策略,那么我们的准备工作就完成了,接下来的负载均衡就完全由DNS服务器来实现。

    当用户向我们的域名发起请求时,DNS服务器会自动地根据我们事先设定好的调度策略选一个合适的IP返回给用户,用户再向该IP发起请求。 
     

    调度策略

    一般DNS提供商会提供一些调度策略供我们选择,如随机分配、轮询、根据请求者的地域分配离他最近的服务器。 
     

    优缺点分析

           DNS负载均衡最大的优点就是配置简单。服务器集群的调度工作完全由DNS服务器承担,那么我们就可以把精力放在后端服务器上,保证他们的稳定性与吞吐量。而且完全不用担心DNS服务器的性能,即便是使用了轮询策略,它的吞吐率依然卓越。

    此外,DNS负载均衡具有较强了扩展性,你完全可以为一个域名解析较多的IP,而且不用担心性能问题。

    但是,由于把集群调度权交给了DNS服务器,从而我们没办法随心所欲地控制调度者,没办法定制调度策略。

    DNS服务器也没办法了解每台服务器的负载情况,因此没办法实现真正意义上的负载均衡。它和HTTP重定向一样,只不过把所有请求平均分配给后端服务器罢了。

    此外,当我们发现某一台后端服务器发生故障时,即使我们立即将该服务器从域名解析中去除,但由于DNS服务器会有缓存,该IP仍然会在DNS中保留一段时间,那么就会导致一部分用户无法正常访问网站。这是一个致命的问题!好在这个问题可以用动态DNS来解决。 
     

    动态DNS

    动态DNS能够让我们通过程序动态修改DNS服务器中的域名解析。从而当我们的监控程序发现某台服务器挂了之后,能立即通知DNS将其删掉。

    综上所述

    DNS负载均衡是一种粗犷的负载均衡方法,这里只做介绍,不推荐使用。 


     

    (三)反向代理负载均衡

    什么是反向代理负载均衡?

           反向代理服务器是一个位于实际服务器之前的服务器,所有向我们网站发来的请求都首先要经过反向代理服务器,服务器根据用户的请求要么直接将结果返回给用户,要么将请求交给后端服务器处理,再返回给用户。

    之前我们介绍了用反向代理服务器实现静态页面和常用的动态页面的缓存。接下来我们介绍反向代理服务器更常用的功能——实现负载均衡。

    我们知道,所有发送给我们网站的请求都首先经过反向代理服务器。那么,反向代理服务器就可以充当服务器集群的调度者,它可以根据当前后端服务器的负载情况,将请求转发给一台合适的服务器,并将处理结果返回给用户。 

    优点

    1. 隐藏后端服务器。 
      与HTTP重定向相比,反向代理能够隐藏后端服务器,所有浏览器都不会与后端服务器直接交互,从而能够确保调度者的控制权,提升集群的整体性能。
    2. 故障转移 
      与DNS负载均衡相比,反向代理能够更快速地移除故障结点。当监控程序发现某一后端服务器出现故障时,能够及时通知反向代理服务器,并立即将其删除。
    3. 合理分配任务 
      HTTP重定向和DNS负载均衡都无法实现真正意义上的负载均衡,也就是调度服务器无法根据后端服务器的实际负载情况分配任务。但反向代理服务器支持手动设定每台后端服务器的权重。我们可以根据服务器的配置设置不同的权重,权重的不同会导致被调度者选中的概率的不同。 
       

    缺点

    1. 调度者压力过大 
      由于所有的请求都先由反向代理服务器处理,那么当请求量超过调度服务器的最大负载时,调度服务器的吞吐率降低会直接降低集群的整体性能。
    2. 制约扩展 
      当后端服务器也无法满足巨大的吞吐量时,就需要增加后端服务器的数量,可没办法无限量地增加,因为会受到调度服务器的最大吞吐量的制约。 
       

    粘滞会话

    反向代理服务器会引起一个问题。若某台后端服务器处理了用户的请求,并保存了该用户的session或存储了缓存,那么当该用户再次发送请求时,无法保证该请求仍然由保存了其Session或缓存的服务器处理,若由其他服务器处理,先前的Session或缓存就找不到了。

    解决办法1: 
    可以修改反向代理服务器的任务分配策略,以用户IP作为标识较为合适。相同的用户IP会交由同一台后端服务器处理,从而就避免了粘滞会话的问题。

    解决办法2: 
    可以在Cookie中标注请求的服务器ID,当再次提交请求时,调度者将该请求分配给Cookie中标注的服务器处理即可。

     

     

    2.负载均衡组件

     

     

    1.1、apache
         —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安全Socket层(SSL)等等,目前互联网主要使用它做静态资源服务器,也可以做代理服务器转发请求(如:图片链等),结合tomcat等servlet容器处理jsp。
    1.2、ngnix
         —— 俄罗斯人开发的一个高性能的 HTTP和反向代理服务器。由于Nginx 超越 Apache 的高性能和稳定性,使得国内使用 Nginx 作为 Web 服务器的网站也越来越多,其中包括新浪博客、新浪播客、网易新闻、腾讯网、搜狐博客等门户网站频道等,在3w以上的高并发环境下,ngnix处理能力相当于apache的10倍。
         参考:apache和tomcat的性能分析和对比(http://blog.s135.com/nginx_php_v6/)
    1.3、lvs
         —— Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。由毕业于国防科技大学的章文嵩博士于1998年5月创立,可以实现LINUX平台下的简单负载均衡。了解更多,访问官网:http://zh.linuxvirtualserver.org/。

    1.4、HAProxy

         —— HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上.
    1.5、keepalived
         —— 这里说的keepalived不是apache或者tomcat等某个组件上的属性字段,它也是一个组件,可以实现web服务器的高可用(HA high availably)。它可以检测web服务器的工作状态,如果该服务器出现故障被检测到,将其剔除服务器群中,直至正常工作后,keepalive会自动检测到并加入到服务器群里面。实现主备服务器发生故障时ip瞬时无缝交接。它是LVS集群节点健康检测的一个用户空间守护进程,也是LVS的引导故障转移模块(director failover)。Keepalived守护进程可以检查LVS池的状态。如果LVS服务器池当中的某一个服务器宕机了。keepalived会通过一 个setsockopt呼叫通知内核将这个节点从LVS拓扑图中移除。
    1.6、memcached
         —— 它是一个高性能分布式内存对象缓存系统。当初是Danga Interactive为了LiveJournal快速发展开发的系统,用于对业务查询数据缓存,减轻数据库的负载。其守护进程(daemon)是用C写的,但是客户端支持几乎所有语言(客户端基本上有3种版本[memcache client for java;spymemcached;xMecache]),服务端和客户端通过简单的协议通信;在memcached里面缓存的数据必须序列化。
    1.7、terracotta
         —— 是一款由美国Terracotta公司开发的著名开源Java集群平台。它在JVM与Java应用之间实现了一个专门处理集群功能的抽象层,允许用户在不改变系统代码的情况下实现java应用的集群。支持数据的持久化、session的复制以及高可用(HA)。

    展开全文
  • 动静分离二、Nginx 的安装三、 Nginx 的常用命令和配置文件四、 Nginx 配置实例 1 反向代理五、 Nginx 配置实例 2 负载均衡六、 Nginx 配置实例 3 动静分离七、 Nginx 的高可用集群 前言 一、nginx简介...
  • 负载均衡算法

    万次阅读 2019-10-10 17:11:02
    负载均衡算法 负载均衡算法说明 负载均衡介绍 负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助...
  • 负载均衡(汇总)

    万次阅读 2019-09-02 15:44:46
    一分钟了解负载均衡的一切 什么是负载均衡 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。 ...
  • 负载均衡

    万次阅读 多人点赞 2018-05-28 10:08:23
    流量负载均衡介绍1 负载均衡产生的背景LB(Load Balance,负载均衡)是一种集群技术,它将特定的业务(网络服务、网络流量等)分担给多台网络设备(包括服务器、防火墙等)或多条链路,从而提高了业务处理能力,保证...
  • 使用Nginx实现负载均衡

    万次阅读 多人点赞 2018-08-28 17:48:52
    负载均衡的作用 负载均衡:分摊到多个操作单元上进行执行,和它的英文名称很匹配。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。 负载均衡这...
  • 阻性负载和感性负载

    千次阅读 2019-04-06 19:59:09
    阻性负载即和电源相比当负载电流负载电压没有相位差时负载为阻性(如负载为白炽灯、电炉等)。通俗一点讲,仅是通过电阻类的元件进行工作的纯阻性负载称为阻性负载。 2、感性负载 通常情况下,一般把带有电感参数...
  • 负载均衡不只是为了计算单元的负载达到均衡状态,他依据分配算法目标,有的基于负载考虑,有的基于性能(吞吐量、响应时间)考虑,有的基于业务考虑。 DNS 负载均衡 DNS 是最简单也是最常见的负载均衡方式,一般...
  • 负载均衡之基于DNS负载

    千次阅读 2016-01-08 13:28:58
    当前业界中所最常使用的负载平衡解决方案主要分为三种:基于DNS的负载平衡,L3/4负载平衡,也即是基于网络层的负载平衡,以及L7负载平衡,即基于应用层的负载平衡。在这些解决方案中,基于DNS的负载平衡是最简单的,...
  • 0.负载均衡 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 负载均衡,英文名称为Load Balance,...
  • 负载均衡之基于L7负载

    千次阅读 2016-01-11 12:37:57
    L7负载平衡   另一种较为常用的负载平衡解决方案则是L7负载平衡。顾名思义,其主要通过OSI模型中的第七层应用层中的数据决定如何分发负载。   在运行时,L7负载平衡服务器上的操作系统会将接收到的各个数据包...
  • nacos服务的负载均衡功能演示

    万次阅读 2020-09-21 13:35:52
    值是上面服务提供者的spring.application.name值 启动服务进行负载均衡测试 将3个服务都启动,信息如下 如下通过消费者调用提供者,服务提供者会根据负载均衡进行处理,默认是轮询算法,如果想要使用其它算法例如...
  • Nginx负载均衡

    千次阅读 2020-03-21 16:03:14
    在nginx中负载均衡主要实现用户访问请求进行调度分配和后端服务器的压力分担。 负载均衡调度算法 轮询(rr) :按时间顺序逐一分配到不同的后端服务器(默认) 权重(weight):加权轮询(wrr)。weight值越大,分配到的...
  • 7层负载均衡与4层负载均衡区别

    万次阅读 2020-05-07 18:12:15
    4 层负载均衡本质是转发,而 7 层负载本质是内容交换和代理 一、OSI 7层模型与TCP/IP 4层模型 OSI: open system interconnection 开放式系统互联参考模型 OSI 7层模型 TCP/IP 4层模型 应用层 应用层 表示...
  • 感性负载与容性负载的区别

    万次阅读 2018-11-08 11:45:28
    感性负载与容性负载的...线圈负载叫感性,电容负载叫容性,纯电阻负载叫阻性比如电机是感性负载,电容是容性负载。 电炉电阻丝,白炽灯,碘坞灯等是阻性负载在电工或电子行业中对负载阻抗特性的定义,分为纯电阻...
  • 一、本地负载机设置: 二、多台负载机设置: 1、首先,要在你想要连接的负载机上,安装LR 2、其次,要在你想连接的已安装LR的负载机上,开通代理(这点很关键) 3、其余步骤参照【一、本地负载机设置...
  • 负载和硬负载的区别分析

    千次阅读 2019-07-12 18:26:41
    什么是软负载均衡及常用方式? 在系统服务器上安装相应负载均衡软件,进行相关的配置,达到均衡负载的目的。它基于特定的使用环境、配置简单、使用灵活、成本较低,能够解决大部分需求问题。常用的软件有:Nginx ...
  • LVS负载均衡系列

    千人学习 2017-03-03 13:58:11
    通过本次实战企业级LVS负载均衡系列课程的学习,大家可以入原理配置及讲解。让我们对Linux网站架构有更深入的了解,能够独立实施LVS负载均衡并维护LVS负载均衡。
  • nginx负载均衡

    千次阅读 2020-12-24 19:38:29
    nginx负载均衡简介 随着网站的发展,服务器压力越来越大,我们可能首先会将数据库,静态文件分离出去。但是随着发展,单独业务API的请求的压力也会变得很大,这时候我们可能需要做负载均衡将一台服务器面临的压力...
  • 负载牵引

    2019-10-10 21:11:27
    在对功率放大器进行设计时,通过负载牵引仿真可以方便的计算出最佳功率输出阻抗,在进行阻抗匹配时更容易实现最大功率输出,负载牵引的仿真可通过ADS中带的相应工具来实现,另外还有源牵引仿真,对仿真的阻抗完成...
  • CPU负载均衡

    千次阅读 2019-02-28 19:37:36
    如何实现负载均衡 为了系统负载的均衡,主要通过如下三种手段: (1)当一个进程要加入runqueue时,选择负载最轻的cpu上的runqueue (2)当前CPU的runqueue为空时,主动拉取其他runqueue上的进程来运行 (3)周期...
  • DNS负载均衡和NGINX负载均衡

    千次阅读 2018-07-17 18:12:16
    负载均衡:把请求均匀的分摊到多个服务器上处理 两种负载均衡: 客户端与反向代理服务器之间的DNS负载均衡 服务器与反向代理服务器之间的负载均衡,可以使apache+tomcat负载均衡,也可以是ngnix负载均衡 DNS负载...
  • Windows Server 2012 网络负载均衡(NLB)

    万次阅读 2017-06-27 15:18:14
    今天通过书籍、博客,网络资料 对windowsServer 2012 中NLB--网路负载平衡进行了大概的了解。  网络负载平衡,英文简称为NLB,windows Server 2012 中该功能允许你将传入的请求传播到最多达32台的服务器上,即...
  • 负载状态(load average)中的数据代表了什么? 宝塔的负载状态图表中百分比的含意: 50% 以下 - 此时服务器正以低负载状态运行 50 ~ 90% - 服务器负载正常,用户的请求可以及时得到服务器响应 90% ~ 100% - 表示服务器...
  • Springcloud 负载均衡理解

    万次阅读 热门讨论 2018-07-18 00:19:37
    本来想写私人学习笔记的,但是...负载均衡分为两种,一种是服务端负载均衡,一种是客户端负载均衡。 服务端负载均衡:分为两种,一种是硬件负载均衡,还有一种是软件负载均衡。 硬件负载均衡主要通过在服务器节点...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 230,268
精华内容 92,107
关键字:

负载