负载均衡(LVS安装部署篇)
安装ipvsadmLVS的IP负载均衡技术是通过IPVS(IP Virtual Server,IP虚拟服务)模块实现的。IPVS模块是LVS集群的核心软件模块,它安装在LVS集群作为负载均衡的主节点上,虚拟出一个IP地址和端口对外提供服务。
用户通过访问这个虚拟服务,然后访问请求由负载均衡器调度到后端真实服务器中,由后端真实服务器处理用户的请求并返回响应。
IPVS 在Linux内核中实现传输层负载均衡,即所谓的第4层交换。
在主机上运行的IPVS充当真实服务器集群前端的负载均衡器,它可以将对基于TCP/UDP的服务的请求定向到真实服务器,并使真实服务器的服务在虚拟服务上显示为虚拟服务。
Linux内核2.4版本开始默认支持LVS。要使用LVS的能力,只需安装一个LVS的管理工具:ipvsadm
下载 ipvsadm: https://mirrors.edge.kernel.org/pub/linux/utils/kernel/ipvsadm
目前最新版本是ipvsadm-1.29.tar.gz
直接安装会报错,需要安装一下依赖包,gcc是必须的。
查看下系统内核版本
[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_64
如果发现没有安装当前系统的内核源码在/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
从make install 的输出,我们可以看到生成了几个可执行文件:
/sbin/ipvsadm
/sbin/ipvsadm-save
/sbin/ipvsadm-restore
/etc/rc.d/init.d/ipvsadm
安装完成后,模块ipvs并没有自动加载入内核,需要手动执行ipvsadm,因为还没有做配置,因此没有数据输出。再执行命令,就可以看到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
测试访问结果
为了方便维护,vip的绑定一般都是用脚本来实现的。让这个脚本随系统开机启动。
后端真实服务器
vim /etc/init.d/lvsreal
#! /bin/bash
# chkconfig: 2345 55 25
# Description : Start Real Server ,http://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是否配置成功。
负载均衡
现在就轮到负载均衡器的配置了,由于没有配置keepalived一起使用,因此只需要一个服务器做负载均衡器。
vim /usr/local/bin/lvsserver.sh
#! /bin/bash
# Description : Start Load Balance ,http://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地址是否配置成功,以及查看转发规则是生效。
确认没问题后,我们来验证一下:
用客户端浏览器访问: http://172.16.10.10/index.html 多刷新几下。
从输出信息可以看到,客户端请求都被转发到后端服务器了。
客户端172.16.10.22的请求被转发到172.16.10.252和172.16.10.253。
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地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载, 将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该 服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。