负载均衡

Nginx 负载均衡配置

作为负载均衡器,在版本1.9之前,它只能作为http的负载均衡,也就是在网络模型的第七层发挥作用,1.9之后,它可以对tcp进行负载均衡,比如redis,mysql等。

主要支持以下负载均衡算法:

  • 轮询(round-robin):轮询分发请求;
  • 加权轮询(weight-round-robin);
  • 最少连接(least-connected):请求分发给连接数最少的机器;
  • 加权最少连接;
  • IP哈希(ip-hash):对 IP 做哈希运算确定请求目的机器;
  • 普通哈希(url-hash):把 url 均衡到不同的服务器。
http {
     upstream [负载均衡名称] {
	 server [ip地址]:[端口值];
	 server [ip地址]:[端口值];
	 server [ip地址]:[端口值];
	 server [ip地址]:[端口值];
 }
 server {
	 listen [nginx监听端口];
	 server_name [head中的host对应的值]
	 location / {
	   proxy_pass http:// [负载均衡名称,对应上面upstream的值];
         }
    }
}

一些负载均衡策略配置如下:

http {
upstream ipHashLoadBalanceServer {
        # ip_hash;              # IP 哈希负载均衡
        # least_conn;           # 最少连接负载均衡
        # hash $request_uri;    # 根据 url 进行哈希;
        # 
        server www.address1.com; // 或者ip+端口 , 不需要加入http/https前缀
        # server www.address1.com weight=3;  # 加权操作
        # server www.address1.com down;  # 机器故障下线配置
        server www.address2.com;
        server www.address3.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://loadBalanceServer;
        }
    }
}

LVS 与 Nginx 负载均衡对比

LVS架构介绍

LVS(Linux virtual Server),并通过负载均衡技术和 Linux 操作系统实现一个高性能、高可用的服务集群。下面是官网原话介绍:http://www.linuxvirtualserver.org/

The Linux Virtual Server is a highly scalable and highly available server built on a cluster of real servers, with the load balancer running on the Linux operating system. The architecture of the server cluster is fully transparent to end users, and the users interact as if it were a single high-performance virtual server.

LVS 架构包含三个主要部分:负载均衡层(Load Balance)、服务器集群层(Server Array)、数据共享层(Shared Storage)。

  • Load Balancer:核心组件为 Director Server负载调度器,LVS 模块安装在它上面。可以将 Direct Server 看成路由器,通过 LVS 功能设定的路由表完成请求转发。另外 Director Server 还安装有对服务器集群的监控模块 Ldirectord,检测各个实际服务器的健康状况,实现动态剔除或新增。
  • Server Array:实际运行的服务器构成集群,比如 DNS服务器、web服务器、MAIL服务器、FTP服务器等等,每个服务器间通过局域网相互通信。
  • Shared Storage:底层共享存储,物理上通过磁盘列阵设备组成,内容上的一致性可以通过 NFS网络文件系统共享数据,但是 NFS 在大吞吐量表现不佳,可以采用 GFS/OCFS2 等文件系统。

LVS负载均衡

LVS 转发请求的方式有以下三种:

当用户请求到达 LVS时,Director Server 模块会虚拟出一个 VIP地址,访问的请求会先经过 VIP 到达负载调度器,然后由负载调度器从服务器列表中选出一个服务器节点响应客户端请求。负载均衡机制包括 NAT、TUN、DR 三种:

VS-NAT

  • VS-NAT(Virtual Server via Network Address Transation):用户请求到达调度器后,调度器根据请求报文的目的地址改写为选定的实际服务器地址并修改端口。真实服务器在返回结果时,也将报文源地址源端口修改为虚拟IP地址和相应端口。所以请求报文和响应报文都需要经过 Director Server 组件进行报文地址重写,用户请求越多,请求逐渐成功瓶颈;

VS-NAT 请求处理和响应回复涉及到多次请求报文源IP地址、目的IP地址的转换:

  • 用户向调度器发起请求,调度器将请求转发到内核空间处理;
  • 内核空间 PREROUTING 链接收用户请求,此时报文源IP为 CIP(Client IP),目标IP为 VIP(virtual IP);
  • PREROUTING 判断IP是否为本机IP,并将数据发送到 INPUT 链。IPVS 对比数据包请求的服务是否为集群服务,将报文地址改为 CIP/RIP(Real IP),并通过 POSTROUTING 将数据包转发给具体的服务器;
  • 真实服务器处理完请求后响应报文给调度器,此时报文为 RIP/CIP,报文经调度器修改为 VIP/CIP 返回给客户端,与初始发出 CIP/VIP 对应。
  • 调度器修改数据包的源IP地址和目标IP地址实现了对客户端隐藏真实服务器IP,实现反向代理。

VS-TUN

  • VS-TUN(Virtual Server via IP Tunneling):IP隧道技术实现请求转发,调度器采用IP隧道技术将请求直接转发到某个真实服务器上,真实服务器在响应时直接响应客户端不再经过调度器模块。

VS-DR

  • VS-DR(Virtual Server via Directing Routing):直接路由技术实现虚拟服务器。VS-DR 通过修改请求报文的 MAC 地址,将请求发送到真实服务器,真实服务器将响应直接返回用户,免去了 VS-TUN 的IP隧道的开销。

LVS负载调度算法如下:

  • 轮询调度(Round Robin):轮询调度算法;
  • 加权轮询调度;
  • 最少连接调度;
  • 加权最少连接调度;
  • 基于局部性最少连接:根据目标请求IP找出该IP地址最近使用的服务器列表,如果服务器是可用的且没有超载,将请求发送到服务器;否则根据最少连接原则选出一个可用的服务器。
  • 带复制的局部性最少连接;
  • 目标地址散列;
  • 源地址散列;

LVS 与 Nginx的区别

从上面可以看出 LVS 实际只充当了一个转发数据包的组件,类似于路由器,它使用了网络协议的四层(TCP层)。具体使用 IP+端口的四元组方式,实际还是由客户端和具体后端建立连接,LVS 接收客户端请求报文并修改报文的IP地址,然后转发给后端服务器,LVS中并没有实际的握手。

Nginx 则是由代理服务器和后端机器建立了实际的 TCP连接,显然性能不行,但是可以更自由地配置转发规则,人工操作性更高。

参考:

https://www.cnblogs.com/Courage129/p/14383897.html

posted @ 2024-01-11 22:21  Stitches  阅读(31)  评论(0)    收藏  举报