lvs负载均衡简介 与Linux下lvs NAT模式实验

LVS简介

LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。

LVS的组成

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

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

LVS的工作原理

  1. 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
  2. PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
  3. IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
  4. POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。

LVS的三种模式

1. DS:Director Server。指的是前端负载均衡器节点。
2. RS:Real Server。后端真实的工作服务器。
3. VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
4. DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
5. RIP:Real Server IP,后端服务器的IP地址。
6. CIP:Client IP,访问客户端的IP地址。
  • Virtual Server via Network Address Translation(VS/NAT)
    通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。

    相当于LB充当网关

    RS应该使用私有地址,RS的网关必须指向DIP
    DIP和RIP必须在同一个网段内
    请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈
    支持端口映射
    RS可以使用任意操作系统
    缺陷:对Director Server压力会比较大,请求和响应都需经过director server
    
  • Virtual Server via IP Tunneling(VS/TUN)
    采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。

  • Virtual Server via Direct Routing(VS/DR)
    VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上

    特点:保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
    RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
    RS跟Director Server必须在同一个物理网络中
    所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
    不支持地址转换,也不支持端口映射
    RS可以是大多数常见的操作系统
    RS的网关绝不允许指向DIP(因为我们不允许他经过director)
    RS上的lo接口配置VIP的IP地址
    缺陷:RS和DS必须在同一机房中
    

    LVS的8种调度方式

    针对不同的网络服务需求和服务器配置,IPVS调度器实现了如下八种负载调度算法:

  1. 轮叫(Round Robin)
    调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

  2. 加权轮叫(Weighted Round Robin)
    调度器通过”加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

  3. 最少链接(Least Connections)
    调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。

  4. 加权最少链接(Weighted Least Connections)
    在集群系统中的服务器性能差异较大的情况下,调度器采用”加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

  5. 基于局部性的最少链接(Locality-Based Least Connections)
    “基于局部性的最少链接” 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用”最少链接”的原则选出一个可用的服务 器,将请求发送到该服务器。

6. 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按”最小连接”原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。

  1. 目标地址散列(Destination Hashing)
    “目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

  2. 源地址散列(Source Hashing)
    “源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

lvs NAT模式的实验

三台服务器,一台作为 director,两台作为 real server,director 有一个外网网卡(192.168.0.54) 和一个内网ip(192.168.80.8),两个 real server 上只有内网 ip (192.168.80.9) 和 (192.168.80.10),并且需要把两个 real server 的内网网关设置为 director 的内网 ip(192.168.80.8)

ipvsadm 是一个给lvs软件传递参数和查看相关信息的工具

[root@LB ~]# yum  install ipvsadm  

关闭防火墙和selinux

[root@LB ~]# iptables -F
清空防火墙规则#
[root@LB ~]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@LB ~]# getenforce 
Enforcing
[root@LB ~]# setenforce 0
[root@LB ~]# getenforce 
Permissive
[root@LB ~]# 
[root@LB ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@LB ~]# getenforce 
Permissive
[root@LB ~]# 

[root@LB ~]# cat lvs_nat.sh 
#! /bin/bash                                                                              
# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward

# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33  -j SNAT  --to-source 192.168.0.205
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
#清空规则
$IPVSADM -A -t 192.168.0.205:80 -s rr  
# rr为轮询
$IPVSADM -a -t 192.168.0.205:80 -r 192.168.80.2:80 -m 
# -a增加服务器 -m表示LVS模式为NAT
$IPVSADM -a -t 192.168.0.205:80 -r 192.168.80.3:80 -m
# -r指定服务器IP
[root@LB ~]# 
[root@LB ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  LB:http rr
  -> 192.168.80.2:http            Masq    1      12         5         
  -> 192.168.80.3:http            Masq    1      9          10        
[root@LB ~]# 

####测试

在 RS1 上执行
# echo "rs1rs1" >/usr/share/nginx/html/index.html

在 RS2 上执行
# echo "rs2rs2" >/usr/share/nginx/html/index.html

访问192.168.0.54:80

赏瓶可乐吧(*^▽^*)