LVS负载均衡介绍
几个专业术语:
- DIR(分发器)
- DIP(DIR的IP)
- RS(真实服务器)
- VIP(虚拟IP,也是提供服务的IP)
LVS三种模式
(http://www.it165.net/admin/html/201401/2248.html)
- NAT模式(Network address translation):
用iptables的NAT表实现网络地址转换,
数据包目标IP为DIP,DIR将目标IP地址转换为RS的IP,
这样请求的包就到了RS上,
而RS返回的数据包本来是到DIP的,也会经过DIR转换,
把目标IP转换为客户端的IP - DR模式(direct routing):
DIR会改请求报文中的MAC地址,
本来请求的包中的MAC地址为DIR的MAC地址,
但是却被修改成了RS的MAC地址,
这样数据包就到了RS上。
由于数据包的源IP为客户端IP,所以它在返回数据包的时候,
可以直接发给客户端,而不再经过DIR。 - Tunnel模式(ip tunneling): 客户端请求的数据包发给DIR,
DIR会近一步把包封装,加上了一个新的目标IP(RS的IP),
这样数据包到了RS后再将封装的包拆开,获得原始数据包。
返回数据包的时候,也是直接发给了客户端。
LVS八种调度算法
- 轮叫(round Robin):
调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,
它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。 - 加权轮叫(Weighted Round Robin):
调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。
这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。 - 最少链接(Least Connections):
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。
如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。 - 加权最少链接(Weighted Least Connections):
在集群系统中的服务器性能差异较大的情况下,
调度器采用"加权最少链接"调度算法优化负载均衡性能,
具有较高权值的服务器将承受较大比例的活动连接负载。
调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。 - 基于局部性的最少链接(Locality-Based Least Connections)
"基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。
该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;
若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载, 则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。 - 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication):
"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。
它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,
而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址
对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,
将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,
将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,
将最忙的服务器从服务器组中删除,以降低复制的 程度。 - 目标地址散列(Destination Hashing):
"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,
若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 - 源地址散列(Source Hashing):
"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,
若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
搭建LVS负载均衡 - DR模式
1,准备
- 三台机器:
aming01(128) -> RS1
aming03(130) -> RS2
aming02(129) -> DIR
VIP: 100
2,在DIR上操作:
- 安装ipvsadm:
yum install -y ipvsadm - 编辑脚本
vim /usr/local/sbin/lvs_dr.sh //内容如下
#! /bin/bash
ipv=/usr/sbin/ipvsadm
vip=192.168.222.100
rs1=192.168.222.128
rs2=192.168.222.130
#注意这里的网卡名字
#之所以要先重启ens33网卡,是为了防止脚本重复执行时和之前的配置冲突
ifdown ens33
ifup ens33
#增加ens33:1虚拟网卡,并把vip配置在ens33:1上
ifconfig ens33:1 $vip broadcast $vip netmask 255.255.255.255 up
#增加路由
route add -host $vip dev ens33:1
#-C表示清空之前的规则
$ipv -C
#-A表示增加规则,-t指定vip以及port,-s指定调度算法,这里还有一个-p选项,后面跟时间(单位s),表示保持长连接
$ipv -A -t $vip:80 -s wrr
#-a表示增加rs,-r指定具体的rsip和port,-g表示使用dr模式(-i表示ip tunnel模式,-m表示NAT模式),-w指定权重
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
# 脚本内容到此结束
-
执行脚本
sh /usr/local/sbin/lvs_dr.sh -
检查:ip add
-
在两台RS上编辑脚本
vim /usr/local/sbin/lvs_rs.sh //内容如下:
#! /bin/bash
ipv=/usr/sbin/ipvsadm
vip=192.168.222.100
rs1=192.168.222.128
rs2=192.168.222.130
#注意这里的网卡名字
#之所以要先重启ens33网卡,是为了防止脚本重复执行时和之前的配置冲突
ifdown ens33
ifup ens33
#增加ens33:1虚拟网卡,并把vip配置在ens33:1上
ifconfig ens33:1 $vip broadcast $vip netmask 255.255.255.255 up
#增加路由
route add -host $vip dev ens33:1
#-C表示清空之前的规则
$ipv -C
#-A表示增加规则,-t指定vip以及port,-s指定调度算法,这里还有一个-p选项,后面跟时间(单位s),表示保持长连接
$ipv -A -t $vip:80 -s wrr
#-a表示增加rs,-r指定具体的rsip和port,-g表示使用dr模式(-i表示ip tunnel模式,-m表示NAT模式),-w指定权重
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
# 脚本内容到此结束#!/bin/bash
vip=192.168.222.100
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档https://www.imooc.com/article/79661
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
-
执行脚本
sh /usr/local/sbin/lvs_rs.sh -
测试
windows hosts 浏览器 -
linux curl vip