使用LVS实现负载均衡原理及安装配置详解

1、LVS概念
LVS( Linux Virtual Server)是一种负载均衡(LB,Laod Balance)技术,采用IP负载均衡技术和基于内容请求分发技术。具备很好的吞吐率,将请求均衡地转移到不一样的服务器上执行。LVS是一套组件(ipvs与ipvsadm),相似与iptables,ipvs至关于netfilter,是能将用户请求转发的框架,须要依赖以规则完成转发,工做于内核中的INPUT链上,并依赖于规则进行转发,而ipvsadm是用来定义规则的工具。LVS工做在TCP/UDP协议的四层,能根据用户请求的IP与PROT进行转发,即LVS能实现四层交换、四层路由。html

ipvsadm:用户空间的命令行工具,规则管理器,用于管理集群服务及RealServer
ipvs:工做于内核空间的netfilter的INPUT钩子之上的框架前端

LVS集群类型中的术语android

Director:负载均衡器,也称VS(Virtual Server)
RS:真实服务器(RealServer)
CIP:客户端IP(Client IP)
VIP: Client所请求的,提供虚拟服务的IP,能够用Keepalive作高可用
DIP:在Director实现与RS通讯的IP
RIP:RealServer IP

 

2、LVS集群的类型算法

LVS转发模式有四种:
lvs-nat: 修改请求报文的目标IP
lvs-dr: 操纵封闭新的MAC地址
lvs-tun: 在原请求IP报文以外新加一个IP首部
lvs-fullnat: 修改请求报文的源和目标IPchrome

2.1 LVS-NAT(Network Address Translation)
多目标IP的DNAT,经过将请求报文中的目标地址和目标端口改成某挑出的RS的RIP和PORT实现转发(NAT模式修改的是dst IP,直接走switch或pub不须要修改MAC,因此不须要VIP和realserver同在一个网段内)缓存

模型:安全

image

image

如上图,NAT模式对请求报文作了DNAT,即将报文的目的地址改成RS的地址,但源地址不变;RS上配置路由策略(如网关),应答报文到了LVS设备上后作SNAT,即将报文的源地址改成LVS设备上的地址,目的地址不变。bash

lvs-nat的特性服务器

1.RS应该使用私有地址
2.RS的网关必须指向DIP
3.RIP和DIP必须在同一网段内
4.请求和响应的报文都得通过Director,在高负载场景中,Director极可能成为性能瓶颈(由于既要处理请求报文也要处理响应服方的转发,请求报文通常很小,但响应报文通常都比较大)
5.支持端口映射,便可修改请求报文的目标端口 6.Director必须是Linux系统(必须支持nat),RS能够是任意支持集群服务的操做系统

 

2.2 LVS/DR(Direct Routing直接路由)
经过为请求报文从新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变,请求报文通过Dirctor但响应报文再也不通过Dirctor
网络

模型:

image

image

DR类型工做流程
如上图所示:当客户端请求VIP时,经过互联网到达前端路由Route1,再经过交换机到达Dirctor上;而Dirctor在收到请求报文后,经过定义在ipvs规则中的各rip去得到各RS的MAC地址,并在此报文外再封装一个MAC地址,源MAC为Dirctor的DIP端口的MAC而目标MAC改成其中被调度算法选中一个RS的MAC,但该报文的目标ip(VIP)不变,最后经过DIP接口发送给RS;为了RS能接收Dirctor发来的报文,须要在各RS上也配置VIP,但RS上的VIP是须要隔离前端arp广播的,因此须要将各RS上的VIP隐藏(RS上的VIP一般配置到lo网卡接口的别名上,并配合修改Linux内核参数来实现隔离arp广播);而RS封装响应报文时,源IP为VIP,目标ip为CIP,并经过RIP的网络接口直接向外发送响应,再也不通过Dirctor。


须要注意的是:由于Route1的A点的IP和Dirctor的VIP在同一网段内,VIP一般是公网IP;而DIP、RIP一般是私有IP,且这两个IP一般也应在同一物理网络内;假设RIP与Route1的A接口(同Director 的VIP DIP)在同一网段,则这时可将RS的网关指向Route1,不然,Route2只能其它路由器(如Route2)接口访问互联网,且Route2的C点的IP须要与RIP在同一网段内,此时RIP响应的报文就经过Route2发送。

上文黑色斜体部分的实现及确保前端路由器将目标IP为VIP的请求报文发往Director后的各RS,方法c是最佳的选择:
(a) 在前端网关即Dirctor作静态绑定:不利于高可用
(b) 在RS上使用arptables:须要额外配置,复杂且学习成本高昂
(c) 在RS上修改内核参数以限制arp通告及应答级别:

arp_announce 定义arp通告级别 默认0,应设为2 --> echo 2 > /proc/sys/net/ipv4/conf/enoXXX/arp_announce
arp_ignore 定义arp应答级别 默认0,应设为1 --> echo 1 > /proc/sys/net/ipv4/conf/enoXXX/arp_ignore

Linux kernel从2.4.26与2.6.4之后引入了两个设备标识,即上面提到的arp_announce arp_ignore来调整arp模式
arp_announce: 向外通告
0:默认的,通告时告之本机所使用的全部地址、配置、接口 1: 尽可能只通告接入的网络一端的接口地址(不绝对保证) 2: 必需避免向非本机网络通告 # DR模式须要 内核地址/proc/sys/net/ipv4/conf/all/arp_announce
arp_ignore: 应答请求
0: 默认的,响应本机接口上配置的全部的目标IP地址 1: 只响应入栈报文的那个接口 # DR模式须要 地址同上

详细arp_ignore与arp_announce说明查看 http://www.cnblogs.com/zyd112/p/8797188.html

LVS DR模型的特性

1.LVS的VIP和realserver必须在同一个网段,否则广播后全部的包都会丢掉(提早确认LVS/硬件LB 是什么模式,是否须要在同一个网段中)
2.全部的realserver 都必须绑定VIP的IP地址,不然realserver 收到package后发现dst不是本身的ip,全部包都会丢掉
3.RS的网关必定不能指向DIP
4.请求报文必须通过Director,但响应报文不能通过Director而是由RS直接发往Client以释放Directory的压力
5.不支持端口映射(由于响应报文不通过Director)
6.Director的VIP对外可见,RS的VIP对外不可见
7.RS可使用大多数的操做系统

 

2.3 LVS/TUN

模型:在原请求IP报文以外新加一个IP首部(这个新添加的IP首部其源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS.

image

TUN类型工做流程(主要是为了容灾,由于Director与各RS是在不一样网段中,因此能够存在于不一样的物理空间)

LVS TUN类型特性

1.RIP,DIP,VIP都得是公网地址
2.RS的网关不会指向也不可能指向DIP
3.请求报文通过Directory,但响应报文必定不通过Director
4.不支持端口映射 5.RS的OS必须得支持隧道功能 ??

 

2.4 LVS/FULLNAT (LVS默认不支持此类型)

经过同时修改请求报文的源IP地址和目标IP地址进行转发

原理介绍1

FULLNAT模式是在NAT模式的基础上作一次源地址转换(即SNAT),作SNAT的好处是可让应答流量通过正常的三层路由回到负载均衡上,这样负载均衡就不须要以网关的形式存在于网络中了,对网络环境要求比较低,缺点是因为作了SNAT,应用服务器会丢失客户端的真实IP地址。

image

首先负载均衡上须要存在一个localip池,在作SNAT时的源IP就是从localip池中选择的。当客户端流量到达负载均衡设备之后,负载均衡会根据调度策略在应用服务器池中选择一个应用服务器,而后将数据包的目的IP改成应用服务器的IP。同时从localip池中选择一个localip将数据包的源IP改成localip,这样应用服务器在应答时,目的IP是localip,而localip是真实存在于负载均衡上的IP地址,所以能够通过正常的三层路由到达负载均衡。因为FULLNAT比NAT模式多作了一次SNAT,而且SNAT中有选端口的操做,所以其性能要逊色于NAT模式,可是对网络环境具有较强的适应性。

原理介绍2

 

image

如上图。FULLNAT模式对入报文作了DNAT+SNAT,即将报文的目的地址改成RS的地址,源地址改成LVS设备地址;RS上不须要配置路由策略,出报文到了LVS设备上后作SNAT+DNAT,即将报文的源地址改成LVS设备上的地址,目的地址改成真实的用户地址。

LVS FULLNAT类型特性

1.VIP是公网地址,RIP和DIP是私网地址,且一般不在同一IP网络,所以,RIP的网关通常不会指向DIP
2.RS收到的请求报文源地址是DIP,所以只需响应给DIP, Dirctor收到RS的回复报文后将其发往Client
3.请求和响应报文都经由Dirctor
4.支持端口映射

美团点评高性能四层负载均衡-MGW选择了FULLNAT做为MGW的转发模式,MGW介绍地址:https://tech.meituan.com/MGW.html

若是要让你的服务器支持fullnat,能够查看如下链接方法:https://ieevee.com/tech/2015/12/09/fullnat-2.html

3、LVS调度方法(Scheduler)

LVS的调度方法分为两类(静态算法、动态算法),共10种。
在转发方式选定的状况下,采用哪一种调度算法将决定整个负载均衡的性能表现。不一样的算法适用于不一样的生产环境,有时可能须要针对特殊需求自行设计调度算法。

静态方法:仅根据算法自己进行调度(注重起点公平)

① rr:Round Robin 轮询或轮叫,算法将外部请求按顺序轮流分配到集群中的RS(真实)服务器上,它均等地对待每一台服务器,而无论服务器上实际的链接数和系统负载。不支持权重。
② wrr:Weighted RR 权重轮询或加权轮叫,此算法根据RS(真实)服务器的不一样处理能力来调度访问请求。这样可保证处理能力强的服务器能处理更多的访问请求。调度器能够自动问询真实服务器的负载状况,并动态地调整其权值。
③ sh:source hashing 源地址hash,对请求的客户端IP进行hash计算,可实现session绑定,但可能会破坏负载均衡。Director在本地维护一张hash表,此表保存有每个源IP地址及其第一次调度哪个Server,每一条记录都有默认时长。
④ dh:destination hashing 目标地址hash,请求的目标IP地址,做为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,不然返回空。Director在本地维护一张散列表,此表保存有每一次请求的目标IP及其对应调度的目标服务器(RS) 。将发往同一个目标地址的请求始终转发至第一次挑中的RS服务器。使用场景多数为缓存服务器代理。

 

动态方法:根据算法及RS当前的负载状态(注重结果公平)

⑤ lc:Least Connection 最少链接,此算法动态地将网络请求调度到已创建的链接数最少的服务器上。若是集群系统的真实服务器具备相近的系统性能,采用“最小链接“算法能够较好地均衡负载。Overhead=Active*256+Inactive来实现,采用计算值最小的RS,不支持权重。
**⑥ wlc: ** Weighted LC 权重最少链接,在集群系统中服务器性能差别较大的状况下,调度器采用”加权最少链接“优化负载均衡性能,具备较高权值的服务器将承受较大比例的活动链接负载。调度器能够自动问询真实服务器的负载状况,并动态地调整其权值。是LVS默认的调度算法。权重公式:Overhead=(Active*256+Inactive)/weight
⑦ sed:Shortest Expect Delay 最短时间望延迟,wlc的改进算法,简单地说就是调度器会选择响应速度快的RS(真实)服务器,先选择权重(weight)较大的服务器计算方法:Overhead=(Active+1)*256/weight 这种方式可能会链接多个请求都发送给一台性能较强(即weight值较大)的RS,而别的RS却连一个请求都不会接收到。
⑧ nq:Nerver Queus: sed算法的改进,永不排队,每一个RS至少先处理一个请求,而后再按sed算法来。
⑨ lblc:Locality-based least connection 基于局部性的最少链接,能够理解为动态的dh算法。目前主要用于cache集群系统,该算法根据请求的目标ip地址找出该目标ip地址最近使用的服务器,若该服务器是可用的且没有超载,则将请求发送的该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工做负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
⑩ lblcr:Replicated and Locality-based least connection带复制的基于 的最少链接。各缓存RS各自匀一匀缓存项,及达到负载均衡)。上面说了dh不利于负载均衡,这个算法算是弥补了这个缺陷。

 

4、ipvsadm命令(yum -y install ipvsadm)
grep -i -C 10 "ipvs" grep -i -C 10 "ipvs" /boot/config-2.6.32-504.el6.x86_64 查看ipvs支持的协议与调度方法
支持的协议有:TCP UDP AH ESP AH_ESP SCTP

① 对集群的操做

首先要肯定好须要使用哪一种拓扑类型(NAT DR TUN)的集群

ipvsadm -A|E|D -t|u|f  director_addr:port [-s scheduler] [-p [timeout]]   #director_addr指的就是VIP
     -A:添加一个集群服务      # Add
     -E:修改一个集群服务      # Edit
     -D:删除集群服务         # Delete   示例: ipvsadm -D -t 10.1.0.5:80

    -t:tcp协议服务
     -u:udp协议服务
     -f:firewall make一般应用于将两个或以上的服务绑定为一个服务进行处理时使用,它是一个数字。
         示例:ipvsadm -A -f 11 -s wrr     
         # 这个11为经过iptables xxxx -j MARK --set-mark 11 获得.又例如将80与443打包成一块用ipvsadm进行统一调度.
  
     service-address   # 即LVS服务器的IP地址加以前选项指明的协议类型端口
         -t IP:port    # tcp协议
         -u ip:port    # udp协议
         -f firewall_mark # 后接一个标记数字,将多个端口组织成一个集群进行统一调度
             firewall_mark示例:`iptables -t mangle -A PREROUTING -d 10.1.0.5 -p tcp -m multiport --dports 80,3306 -j MARK --set-mark 11`
             `ipvsadm -A -f 11 -s wrr` 
     -s 调度算法,这项没有声明时默认为wlc [rr wrr sh dh lc wlc sed nq lblc lblcr]
     -p: persistence # LVS的持久链接功能,没有接数字则默认为300秒

 

② 对RS的操做(LVS的类型是在对RS的操做时定义的)

ipvsadm -a -t|u|f director_addr:port -r RS_addr -[g|i|m] [-w weight]  # LVS的类型在这里定义
     -a:添加RS
     -e:修改
     -d:删除
     -r: 后接 RS的ip[:port]
     -g:gateway, DR,没有声明时默认为DR模型 -m:masquerade, NAT模型 -i:ipip, TUN模型 -w: 定义权重,仅使用在支持权重的算法上。如rr lc等不支持权重的算法加上-w选项则没有意义。

 

③ 查看、清空、保存、导入规则

-L|l:显示规则
     -n, --numeric: 不反解析IP地址和端口,数值格式显示主机地址和端口号
     --exact: 显示精确值
     --stats: 统计数据
     --rate: 速率
     --timeout: 显示tcp、tcpfin和udp的会话超时时长
     --sort: 显示当前的ipvs链接情况
     -c, --connection: 查看链接数
清空规则
     ipvsadm -C     # Clear
保存规则(通常都保存在/etc/sysconfig/ipvsadm)
     * ipvsadm -S 默认标准输出,可重定向至指定文件 
     * ipvsadm-save 默认标准输出,可重定向到指定文件
     * systemctl stop ipvsadm.service   # 中止时会自动保存
导入规则(2种)
     1.ipvsadm -R < /saved_file
     2.ipvsadm-restore < /saved_file

     

5、LVS实际配置

5.1 配置一个NAT类型(2台RS)的集群
LVS: if1=172.16.53.128/24(VIP) if2=10.1.1.77/16(DIP)
RS1: 10.1.1.78/16(RIP1)
RS2: 10.1.1.79/16(RIP2)

RS配置:
将RS1 RS2的默认网关指向Director的DIP
route add default gw 10.1.1.77/16

LVS配置:
ipvsadm -A -t 10.1.1.77:80 -s rr                    # 添加LVS集群与调度算法
ipvsadm -a -t 10.1.1.77:80 -r 10.1.1.78 -m -w 1   # 添加LVS集群主机与LVS调度模式及RS权重
ipvsadm -a -t 10.1.1.77:80 -r 10.1.1.79 -m -w 1   # 同上

echo 1 > /proc/sys/net/ipv4/ip_forward # 打开Director的转发功能

iptables -t nat -A POSTROUTINT -o if1 -j SNAT --to-source 172.16.53.128 #对Director if1网卡发出的源地址进行nat装换

至此,一个简单的根据LVS rr算法调度的负载均衡集群完成了

5.2 配置一个DR类型(2台RS)的集群
Directory: VIP: 192.168.31.100/24 调度主机只须要一个网卡接口 VIP用DIP的别名生成
RS1: 192.168.31.194/24
RS2: 192.168.31.220/24

编写如下脚本文件并分别在各RS上执行.(setparam.sh)

#!/bin/bash
#
vip=192.168.31.100
mask='255.255.255.255'
case $1 in
start)
     echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
     echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
     echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
     echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
     /sbin/ifconfig lo:0 $vip netmask $mask  broadcast $vip up
     route add -host $vip dev lo:0
     ;;
stop)
     /sbin/ifconfig lo:0  down
     echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
     echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
     echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
     echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
     route del -host $vip dev lo:0
     ;;
status)
     # Status of LVS-DR real server.
     islothere=`/sbin/ifconfig lo:0 | grep $vip`
     isrothere=`netstat -rn | grep "lo:0" | grep $vip`
     if [ ! "$islothere" -o ! "isrothere" ]; then
         # Either the route or the lo:0 device
         # not found.
         echo "LVS-DR real server Stopped."
     else
         echo "LVS-DR real server Running."
     fi
;;
*)
     echo "Usage $(basename $0) start|stop"
     exit 1
     ;;
esac

编写如下脚本在Director(调度器)上添加VIP 添加LVS规则等操做 (ipvs.sh)

#!/bin/bash
#
vip=192.168.31.100
iface='eno16777736:0'
mask='255.255.255.255'
port='80'
rs1='192.168.31.194'
rs2='192.168.31.220'
scheduler='wrr'
case $1 in
start)
     ifconfig $iface $vip netmask $mask broadcast $vip up
     iptables -F
     ipvsadm -A -t ${vip}:${port} -s $scheduler
     ipvsadm -a -t ${vip}:${port} -r $rs1 -g -w 1
     ipvsadm -a -t ${vip}:${port} -r $rs2 -g -w 2
     ;;
stop)
     ifvsadm -C
     ifconfig $iface down
     ;;
*)
     echo ''Usage: $(basename $0) {start|stop|status}"
     exit 1
     ;;
esac

至此,一个简单的根据LVS dr算法调度的负载均衡集群完成了.


5.3 FWM(FireWall Mark)借助于防火墙标记来分类报文,然后基于标记定义集群服务,可将多个不一样的应用使用同一个集群服务进行调度。
配置示例:

iptables -t mangle -A PREROUTING -d 10.1.0.5 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 11
ipvsadm -A -f 11 -s rr
ipvsadm -a -t 192.168.31.100 -r 192.168.31.194 -g -w 1
ipvsadm -a -t 192.168.31.100 -r 192.168.31.220 -g -w 1

HTTPS     详细 X
基本翻译
abbr. 超文本传输协议安全(Hyper Text Transfer Protocol)
网络释义
HTTPS: HTTP Secure
android https: 通讯安全
相关文章
相关标签/搜索