负载均衡----lvs调度算法

lvs(linux virtual server)基于内核
管理工具:ipvsadm(调度策略的编辑工具)(什么方式,用什么算法调度)

一。基本概念
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。

二。工作模式

lvs工作模式 	DR
			TUN(隧道)
			NAT
			fullnat

三。lvs调度算法
根据前面的介绍,我们了解了LVS的三种工作模式,但不管实际环境中采用的是哪种模式,调度算法进行调度的策略与算法都是LVS的核心技术,LVS在内核中主要实现了一下十种调度算法。

1.轮询调度

轮询调度(Round Robin 简称’RR’)算法就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器。

2.加权轮询调度

加权轮询(Weight Round Robin 简称’WRR’)算法主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。

3.最小连接调度

最小连接调度(Least Connections 简称’LC’)算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1。

(集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载。)

4.加权最小连接调度

加权最少连接(Weight Least Connections 简称’WLC’)算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

5.基于局部的最少连接

基于局部的最少连接调度(Locality-Based Least Connections 简称’LBLC’)算法是针对请求报文的目标IP地址的 负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和Cache命中率,从而提升整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则使用’最少连接’的原则选出一个可用的服务器,将请求发送到服务器。

6.带复制的基于局部性的最少连接

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

7.目标地址散列调度

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

8.源地址散列调度U

源地址散列调度(Source Hashing 简称’SH’)算法先根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同,它的算法流程与目标地址散列调度算法的基本相似。

9.最短的期望的延迟

最短的期望的延迟调度(Shortest Expected Delay 简称’SED’)算法基于WLC算法。举个例子吧,ABC三台服务器的权重分别为1、2、3 。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用SED算法后会进行一个运算

A:(1+1)/1=2 B:(1+2)/2=3/2 C:(1+3)/3=4/3 就把请求交给得出运算结果最小的服务器。

10.最少队列调度

最少队列调度(Never Queue 简称’NQ’)算法,无需队列。如果有realserver的连接数等于0就直接分配过去,不需要在进行SED运算。

四。防火墙五条链,四个表

四表:

filter:过滤,防火墙
nat :network address translation 网络地址转换
mangle:拆解报文,作出修改,封装报文
raw: 关闭nat表上启用的链接追踪机制

五链:

PREROUTING 数据包进入路由之前
INPUT 目的地址为本机
FORWARD 实现转发
OUTPUT 原地址为本机,向外发送
POSTROUTING 发送到网卡之前

PREROUTING —> INPUT(流向内部)
PREROUTING —> FORWARD ---->POSTROUTING(转发)
OUTPUT —> POSTROUTING(流向外部)
五。相关术语

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地址。

六.DR工作模式
(a)当用户请求到达调度器时,请求报文会先进入到内核空间的PREROUTING链。此时报文的源IP为CIP,目标IP为VIP
(b)PREROUTING检查发现数据包的目标IP为本机,将数据包送至INPUT链
(c)工作在INPUT链上的IPVS会检查数据包请求是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改为RIP的MAC地址,然后将数据包发给POSTROUTING链。
(d)由于RS和DS在同一网络中,所以是通过二层传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,然后将数据包发至RS。
(e)RS发现请求MAC为自己,就会接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。此时的源IP为VIP,目标IP为CIP。

DS和RS在同一网络段
-A 添加虚拟服务,-s 选择调度算法,-t目标地址

环境配置

物理机
挂载yum源,并开启httpd

mount /home/kiosk/rhel-server-6.5-x86_64-dvd.iso /var/www/html/rhel6.5
systemctl start httpd

vm1
yum源配置

vim  /etc/yum.repos.d/rhel-source.repo
  9 [LoadBalancer]
 10 name=LoadBalancer
 11 baseurl=http://172.25.26.250/rhel6.5/LoadBalancer
 12 gpgcheck=0

负载均衡----lvs调度算法
vm1(DS前端的负载均衡器)安装软件

yum install ipvsadm -y
ipvsadm -A -t 172.25.26.100:80 -s rr
ipvsadm -a -t 172.25.26.100:80 -r 172.25.26.2:80 -g
ipvsadm -a -t 172.25.26.100:80 -r 172.25.26.3:80 -g
ipvsadm -l
/etc/init.d/ipvsadm save
/etc/init.d/ipvsadm start
ip addr add 172.25.26.100/24 dev eth0
ip addr show
netstat -tnlp

负载均衡----lvs调度算法
负载均衡----lvs调度算法
vm2(后端工作服务器1)

/etc/init.d/httpd start
ip addr add 172.25.26.100/32 dev eth0
ip a

负载均衡----lvs调度算法
vm3(后端工作服务器2)

/etc/init.d/httpd start
ip addr add 172.25.26.100/32 dev eth0
ip a

负载均衡----lvs调度算法
测试:
主机

curl 172.25.26.100
arp -an | grep 100		##查看100所对应的mac地址
arp -d 172.25.26.100		##删除缓存
curl 172.25.26.100
arp -an | grep 100

负载均衡----lvs调度算法
会发现,在清除掉arp缓存,无法找到正确的mac地址,所以我们需要在vm2,和vm3上分别添加arp地址转化

yum install arptables_jf -y
arptables -A IN -d 172.25.26.100 -j DROP
arptables -A OUT -s 172.25.26.100 -j mangle --mangle-ip-s 172.25.26.2/3
arptables -nL

负载均衡----lvs调度算法
负载均衡----lvs调度算法
主机再次测试

curl 172.25.26.100
arp -an | grep 100			##查看100所对应的mac地址
arp -d 172.25.26.100		##删除缓存
curl 172.25.26.100
arp -an | grep 100

负载均衡----lvs调度算法
七。IP TUN(隧道模式)
注意:IP TUN自带反向过滤功能(反向过滤:进来和出来的ip一样)
显然这不是我们想要的
环境配置
vm1(前端负载均衡器):

modprobe ipip
ip addr del 172.25.26.100/24 dev eth0
ip addr add 172.25.26.100/24 dev tunl0		##将ip地址添加到隧道网卡
ip link set up tunl0						##开启
ip a
ipvsadm -C									##清除旧规则 
ipvsadm -A -t 172.25.26.100:80 -s rr
ipvsadm -a -t 172.25.26.100:80 -r 172.25.26.2:80 -i
ipvsadm -a -t 172.25.26.100:80 -r 172.25.26.3:80 -i##设定规则
ipvsadm -l									##查看规则
/etc/init.d/ipvsadm save

负载均衡----lvs调度算法
负载均衡----lvs调度算法
vm2(后端工作服务器1)
vm3(后端工作服务器2)

modprobe ipip								##添加隧道网卡
ip addr del 172.25.26.100/32 dev eth0
ip addr add 172.25.26.100/32 dev tunl0		##将ip地址加到隧道网卡中
ip link set up tunl0						##开启网卡
ip a 
sysctl -a | grep rp_filter					##查看反向过滤
sysctl -w net.ipv4.conf.default.rp_filter=0
sysctl -w net.ipv4.conf.lo.rp_filter=0
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
vim /etc/sysctl.conf
 10 net.ipv4.conf.default.rp_filter = 0		##消除反向过滤
sysctl -p									##刷新
sysctl -a | grep rp_filter					##查看反向过滤是否消除完毕

负载均衡----lvs调度算法
负载均衡----lvs调度算法
负载均衡----lvs调度算法
负载均衡----lvs调度算法
这里因为tunl0自带了反向过滤功能,要求进入的ip和出来的ip相同,显然我们不希望这样

主机测试

curl 172.25.26.100
curl 172.25.26.100

负载均衡----lvs调度算法
八。NAT工作模式
NAT(Network address translation)即网络地址转换,作为一种过渡解决手段,可以用来减少对全球合 法IP地址的需求。简单的说,NAT就是在内部专用网络中使用内部地址,而当内部节点要与外界网络发生联系时, 就在边缘路由器或者防火墙处,将内部地址转换成全局地址,从而使得在外部公共网(Internet)上使用一个和数个合法IP地 址正常传输数据。NAT的工作原理是报文头(目标地址、源地址和端口等)被正确改写后,客户相信 它们连接 一个IP地址,而不同IP地址的服务器组也认为它们是与客户直接相连的。由此,可以用NAT方法将不同IP地 址的并行网络服务变成在一个IP地址 上的一个虚拟服务。 其中,这里的外网和内网是相对来讲的,下面假设能够访问互联网的网络为外网。
特点和要求:
1、LVS(Director)上面需要双网卡:DIP(内网)和VIP(外网)
2、内网的Real Server主机的IP必须和DIP在同一个网络中,并且要求其网关都需要指向DIP的地址
3、RIP都是私有IP地址,仅用于各个节点之间的通信
4、Director位于client和Real Server之间,负载处理所有的进站、出站的通信
工作原理:
客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度 器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址 Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口, 最后将修改后的报文发送给选出的服务器。同时,调度器在连接Hash表中记录这个连接,当这个 连接的下一个报文到达时,从连接Hash表中可以得到原选定服务器的地址和端口,进行同样的改写 操作,并将报文传给原选定的服务器。当来自真实服务器的响应报文经过调度器时,调度器将报文 的源地址和源端口改为Virtual IP Address和相应的端口,再把报文发给用户。我们在连接上引 入一个状态机,不同的报文会使得连接处于不同的状态,不同的状态有不同的超时值。在TCP连接中 ,根据标准的TCP有限状态机进行状态迁移

 NAT(网络地址映射)

       NAT: 网络地址转换

       DNAT: 目标地址转换  改变的是目标地址

       SNAT: 原地址转换  改变的是原地址

       LVS-NAT: 就是使用的SNAT和DNAT完成报的转发

    NAT方式可支持任何的操作系统,以及私有网络,并且只需一个Internet IP地址,但是整个系统的性能受到限制。因为执行NAT每次需要重写包,有一定的延迟;另外,大部分应用有80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对负载均衡器形成很大压力,成为了新的瓶颈。

环境配置:
因为需要做地址转化,这时我们应该给NAT调度器再加上一块网卡,作路由
server1(调度器)
添加网卡
负载均衡----lvs调度算法
**网卡并设置路由地址(网络位与之前的不同)

 ip link set up eth1
 ip addr add 172.25.254.100/24 dev eth1
 ip a

负载均衡----lvs调度算法
开启内核路由功能

   vim  /etc/sysctl.conf 
     7 net.ipv4.ip_forward = 1
   /etc/init.d/network restart 			##重启网络
   sysctl -a | grep ip_forward			##查看是否修改成功

负载均衡----lvs调度算法

ipvsadm -C 	
ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 172.25.26.2:80 -m
ipvsadm -a -t 172.25.254.100:80 -r 172.25.26.3:80 -m		##添加规则
ipvsadm -l

负载均衡----lvs调度算法
server1,和server2添加网关,并开启httpd服务
添加网关的原因是因为NAT模式下的数据包走向是原路返回的,要带着返回的数据包经过调度器回到客户端

route add default gw 172.25.26.1
/etc/init.d/httpd start

负载均衡----lvs调度算法
负载均衡----lvs调度算法
主机测试:
curl 172.25.254.100
curl 172.25.254.100
curl 172.25.254.100
负载均衡----lvs调度算法
九。健康检查
当主机lvs为DR工作模式时
当其中一个DR轮询访问的服务器崩溃或关闭后,主机将依然访问错误服务器,并报告错误,这时候需要做健康检查,否则给客户带来不愉快的使用体验
vm1调度器设置

vim /etc/yum.repos.d/rhel-source.repo
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.26.250/rhel6.5/HighAvailability
gpgcheck=0

yum install ldirectord-3.9.5-3.1.x86_64.rpm	
rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm	##查看目录
vim /usr/share/doc/ldirectord-3.9.5/ldirectord.cf	##配置默认文件
 25 virtual=172.25.26.100:80				##用户访问ip
 26         real=172.25.26.2:80 gate		##服务器1ip
 27         real=172.25.26.3:80 gate		##服务器2ip
 28         fallback=127.0.0.1:80 gate		##本地轮询服务(指向本机的ip)当两个服务器都显示错误时 ,默认访问本机的httpd发布文件
 29         service=http
 30         scheduler=rr
 31         #persistent=600
 32         #netmask=255.255.255.255
 33         protocol=tcp
 34         checktype=negotiate
 35         checkport=80
 36         request="index.html"
 37         #receive="Test Page"
 38         #virtualhost=www.x.y.z

cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/	##将文件移入默认目录
/etc/init.d/ldirectord start
vim /var/www/html/index.html
 页面找不到拉!!
netstat -tnlp		##查看端口使用情况,如果80端口被占用,则修改httpd的默认端口
vim /etc/httpd/conf/httpd.conf
 136 Listen 80
/etc/init.d/httpd reload

先后关闭vm2,vm3的httpd服务
主机测试(curl 172.25.26.100)查看是否能正常访问
负载均衡----lvs调度算法