负载均衡(二)LVS安装部署及调度算法

负载均衡(LVS安装部署篇)html

安装ipvsadm

LVS的IP负载均衡技术是经过IPVS(IP Virtual Server,IP虚拟服务)模块实现的。IPVS模块是LVS集群的核心软件模块,它安装在LVS集群做为负载均衡的主节点上,虚拟出一个IP地址和端口对外提供服务。
用户经过访问这个虚拟服务,而后访问请求由负载均衡器调度到后端真实服务器中,由后端真实服务器处理用户的请求并返回响应。前端

IPVS 在Linux内核中实现传输层负载均衡,即所谓的第4层交换。
在主机上运行的IPVS充当真实服务器集群前端的负载均衡器,它能够将对基于TCP/UDP的服务的请求定向到真实服务器,并使真实服务器的服务在虚拟服务上显示为虚拟服务。node


Linux内核2.4版本开始默认支持LVS。要使用LVS的能力,只需安装一个LVS的管理工具:ipvsadmlinux

下载 ipvsadm:  https://mirrors.edge.kernel.org/pub/linux/utils/kernel/ipvsadm算法

目前最新版本是ipvsadm-1.29.tar.gzvim

直接安装会报错,须要安装一下依赖包,gcc是必须的。后端

image

查看下系统内核版本
[root@node1 ~]# uname -r
2.6.32-573.el6.x86_64浏览器

[root@node1 ~]# ls /usr/src/kernels/
2.6.32-696.16.1.el6.x86_64bash

若是发现没有安装当前系统的内核源码在/usr/src/kernels/目录下,其实咱们是少安装了一个rpm包;
使用yum安装kernel-devel
[root@node1 ~]# yum -y install kernel-devel服务器

[root@node1 ~]# ln -s  /usr/src/kernels/2.6.32-696.16.1.el6.x86_64 /usr/src/linux
由于/usr/src/kernels/目录下可能有多个目录,若是不建立这个链接文件,在编译时可能会报错。

咱们还须要安装几个依赖包
[root@node1 ~]# yum -y   install gcc popt-static libnl* libpopt*
[root@node1 ~]# wget  https://mirrors.edge.kernel.org/pub/linux/utils/kernel/ipvsadm/ipvsadm-1.29.tar.gz
[root@node1 ~]# tar -xf ipvsadm-1.29.tar.gz
[root@node1 ~]# cd  ipvsadm-1.29
[root@node1 ipvsadm-1.29]# make && make install

image

从make install 的输出,咱们能够看到生成了几个可执行文件:

/sbin/ipvsadm

/sbin/ipvsadm-save

/sbin/ipvsadm-restore

/etc/rc.d/init.d/ipvsadm


安装完成后,模块ipvs并无自动加载入内核,须要手动执行ipvsadm,由于尚未作配置,所以没有数据输出。再执行命令,就能够看到ipvs已加载到内核了。

image


部署ipvs

咱们已经成功安装了 ipvs,接下来咱们开始部署使用。

实验环境:
三台服务器在通一个内网

设备角色              IP地址
VIP                           172.16.10.10
负载均衡               172.16.10.251
后端服务器1        172.16.10.252
后端服务器2        172.16.10.253


负载均衡上安装好ipvs,后端服务器安用yum安装httpd

yum -y install httpd

service  httpd start


在后两台端服务器上添加页面,方便区分转发后请求到了哪一个后端服务器。

后端服务器1
echo '<h1>This is Back-end  Web Server 252 </h1>' > /var/www/html/index.html

后端服务器2
echo '<h1>This is Back-end  Web Server 253 </h1>' > /var/www/html/index.html


测试访问结果

image

image



绑定VIP


为了方便维护,vip的绑定通常都是用脚原本实现的。让这个脚本随系统开机启动。

后端真实服务器

vim /etc/init.d/lvsreal

#! /bin/bash
# chkconfig: 2345 55 25
# Description : Start Real Server ,https://blog.51cto.com/xmomo
VIP=172.16.10.10
# /etc/rc.d/init.d/functions  //脚本在/etc/init.d/目录下,注释这一行
case "$1" in
start)
echo "Start LVS Of Real Server"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
     echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
     echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
     echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
     echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
/sbin/ifconfig lo:0 down
echo "Stop LVS Of Real Server"
     echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
     echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
     echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
     echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac

# chmod +x /etc/init.d/lvsreal
# chkconfig  --add lvsreal
# /etc/init.d/lvsreal start 

LVS后端提供服务的服务器都要使用这个VIP,在其余服务器上作一样的操做。

这个VIP被绑定到 lo:0 上,广播地址是自己,子网掩码是 255.255.255.255。
这是与标准的网络地址设置有很大的不一样,
采用这种可变长的子网掩码方式把网段划分红只含一个主机地址,这样作的目的是避免IP地址冲突。
echo "1" ,echo "2" 是为了防止arp广播。
 
运行脚本后看下咱们vip是否配置成功。

image


负载均衡

如今就轮到负载均衡器的配置了,因为没有配置keepalived一块儿使用,所以只须要一个服务器作负载均衡器。

vim /usr/local/bin/lvsserver.sh
#! /bin/bash
# Description : Start Load Balance ,https://blog.51cto.com/xmomo
ip addr add 172.16.10.10/32 dev lo:0
ipvsadm -C
ipvsadm -A -t 172.16.10.10:80 -s wlc
ipvsadm -a -t 172.16.10.10:80 -r 172.16.10.252 -g -w 1
ipvsadm -a -t 172.16.10.10:80 -r 172.16.10.253 -g -w 1

chmod +x /usr/local/bin/lvsserver.sh
/usr/local/bin/lvsserver.sh
让这个脚本随系统开机启动,咱们把这个脚本路径添加到/etc/rc.local
  echo '/bin/bash /usr/local/bin/lvsserver.sh' >> /etc/rc.local


检查VIP地址是否配置成功,以及查看转发规则是生效。

image


确认没问题后,咱们来验证一下:
用客户端浏览器访问: http://172.16.10.10/index.html  多刷新几下。

image

image

从输出信息能够看到,客户端请求都被转发到后端服务器了。
客户端172.16.10.22的请求被转发到172.16.10.252和172.16.10.253。

image


LVS调度算法

 
  LVS集群的负载调度主要是由工做在内核当中的IPVS IP负载均衡软件负责进行调度的,IPVS在内核中的负载均衡调度是以链接为粒度的,在内核中的链接调度算法上,IPVS已实现了如下八种调度算法.

静态算法:只根据算法进行调度 而不考虑后端服务器的实际链接状况和负载状况

1.轮叫调度(Round-Robin Scheduling)


这种算法就是以轮叫的方式依次将请求调度不一样的服务器,算法的优势是其简洁性,它无需记录当前全部链接的状态,因此它是一种无状态调度。轮叫调度算法假设全部服务器处理性能均相同,无论服务器的当前链接数和响应速度。该算法相对简单,不适用于服务器组中处理性能不一的状况,并且当请求服务时间变化比较大时,轮叫调度算法容易致使服务器间的负载不平衡。

2.加权轮叫调度(Weighted Round-Robin Scheduling)


这种算法能够解决服务器间性能不一的状况,它用相应的权值表示服务器的处理性能,服务器的缺省权值为1。假设服务器A的权值为1,B的 权值为2,则表示服务器B的处理性能是A的两倍。加权轮叫调度算法是按权值的高低和轮叫方式分配请求到各服务器。权值高的服务器先收到的链接,权值高的服 务器比权值低的服务器处理更多的链接,相同权值的服务器处理相同数目的链接数。

3.目标地址散列调度(Destination Hashing Scheduling)


此算法先根据请求的目标IP地址,做为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,不然返回空。

4.源地址散列调度(Source Hashing Scheduling)


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

动态算法:前端的调度器会根据后端真实服务器的实际链接状况来分配请求

1.最小链接调度(Least-Connection Scheduling)


这种算法是把新的链接请求分配到当前链接数最小的服务器。最小链接调度是一种动态调度算法,它经过服务器当前所活跃的链接数来估计服务 器的负载状况。调度器须要记录各个服务器已创建链接的数目,当一个请求被调度到某台服务器,其链接数加1;当链接停止或超时,其链接数减一。当各个服务器有相同的处理性能时,最小链接调度算法能把负载变化大的请求分布平滑到各个服务器上,全部处理时间比较长的请求不可能被发送到同一台服 务器上。可是,当各个服务器的处理能力不一样时,该算法并不理想,由于TCP链接处理请求后会进入TIME_WAIT状态,TCP的TIME_WAIT通常 为2分钟,此时链接还占用服务器的资源,因此会出现这样情形,性能高的服务器已处理所收到的链接,链接处于TIME_WAIT状态,而性能低的服务器已经 忙于处理所收到的链接,还不断地收到新的链接请求。

2.加权最小链接调度(Weighted Least-Connection Scheduling)


这种算法是最小链接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员能够动态地设置服务器的权 值。加权最小链接调度在调度新链接时尽量使服务器的已创建链接数和其权值成比例。

3.基于局部性的最少连接(Locality-Based Least Connections Scheduling)


这种算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址全部使用的服务器,若是这台服务器依然可用,而且有能力处理该请求,调度器会尽可能选择相同的服务器,不然会继续选择其它可行的服务器

4.带复制的基于局部性最少连接(Locality-Based Least Connections with Replication Scheduling)


这种算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小链接”原则从该服务器组中选出一台服务器,若服务器没有超载, 将请求发送到该服务器;若服务器超载;则按“最小链接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该 服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以下降复制的程度。







647b7f4e

相关文章
相关标签/搜索