负载均衡----LVS
LVS的三种工作模式
LVS-NAT:
LVS-NAT方式的思路很简单,它利用调度服务器实施网络层数据欺骗,它把客户端发送到调度服务器的数据IP包的目标地址进行了替换。
LVS-DR:
这个方法的思路是实施数据链路层数据欺骗,修改网络帧数据的Mac地址。
LVS-TUN:
这个方法是为了突破LVS-DR同一网段内的限制所提出来的。它不做任何欺骗,而是光明正大的交流,在网络层进行了二次包装
各种模式的优缺点
VS/NAT的优缺点
<1>优点:
对后端的操作系统没有要求;
只需要一个IP地址配置在调度器上,服务器组可以用私有IP地址;
支持端口映射;
<2>缺点:
请求和响应都需要通过LB,伸缩能力有限(一般后面能连接10台左右服务器)
需要服务器和LB在同一个局域网中;
需要将服务器的默认网关设置为LB;
VS/TUN的优缺点
<1>优点:
不需要调度应答报文,负载能力强;
服务器和调度器可以不在同一个VLAN中;
支持广域负载均衡;
<2>缺点:
所有的服务器必须支持“IP Tunneling”协议,需安装内核模块,安装复杂;
建立IP隧道的开销大;
服务器需要联通外网,风险较大;
不支持端口映射;
VS/DR的优缺点
<1>优点:
与TUN相比,没有IP隧道的开销,性能较高;
<2>缺点:
要求LB和服务器都有一块网卡连在同一个物理网段中;
不支持端口映射;
使用场景
VS/NAT:小并发的实验性应用、mysql集群;
VS/TUN:广域网负载;
VS/DR:大众方式;
LVS的调度算法有十种,其中静态算法4种,动态算法6种。
静态算法:不考虑后端服务器的连接情况和负载情况,只根据算法进行调度。
1.RR(轮叫调度 round robin)
调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
2.WRR(加权轮叫调度 Weight RR)
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
3.DH 目标地址散列调度(Destination Hash)
根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
4.SH 源地址散列调度(Source Hash)
源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
动态算法:前端的调度器会根据后端真实服务器的实际连接情况来分配请求
1.LC 最少链接
调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
2.WLC 加权最少链接
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
3.SED 最短延迟调度(Shortest Expected Delay)
在WLC上改进,因为非活跃链接对服务器造成的负载并不高,因此此算法不再考虑非活动状态,使用Overhead =(活跃链接数+1)/权重。得出数值最小的接受下一个前端发来的请求。
4..NQ 永不排队/最少队列调度(Never Queue Scheduling NQ)
无需队列,如果有 realserver=0的服务器,则直接把前端的请求发给他,而不经过sed算法。这样就保证了不会有服务器是空间的。假如一台服务器有很多非活动链接,假如这些链接是dns通过udp建立起来的,那实质上他其实是没什么负载的,但是在NQ下面则是不会将请求发往该服务器,这样有可能会造成资源的浪费。而假如这些链接是通过http建立起来的,就要考虑非活动链接对服务器带来的压力。
5.. LBLC:基于局部性的最少链接(locality-Based Least Connections)
目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,则将请求发往该服务器,若服务器不存在或超载,则按照最少链接原则选出一台连接数最少的服务器,并将请求发往给它。
6. LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)
目前主要用于Cache集群系统。与LBLC不同的是,LBLCR是将目标地址与服务器组建立关系,根据最小链接原则选出服务器,假如没有超载,则把请求发往给该服务器。假如超载,则再在服务器集群中根据最小链接原则选出服务器,并将请求发往给该服务器。
LVS/DR模式配置方式
关闭selinux
setenforce 0
防火墙开放端口
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
配置调度服务器
加载ip_vs模块
modprobe ip_vs
查看相关信息
cat /proc/net/ip_vs
安装ipvsadm
yum -y install ipvsadm
在负载均衡服务器上转发编辑脚本
#!/bin/bash
#
ifconfig ens33:0 172.16.1.189 broadcast 172.16.1.189 netmask 255.255.255.255 up #添加虚拟地址的接口
route add -host 172.16.1.189 dev ens33:0 #给ens33:0添加路由
ipvsadm -C #清除内核虚拟服务器表中的所有记录
ipvsadm -A -t 172.16.1.189:80 -s wlc #创建虚拟服务器
ipvsadm -a -t 172.16.1.189:80 -r 172.16.1.11:80 -g #添加服务器节点
ipvsadm -a -t 172.16.1.189:80 -r 172.16.1.12:80 -g #添加服务器节点
ipvsadm -a -t 172.16.1.189:80 -r 172.16.1.13:80 -g #添加服务器节点
ipvsadm -Ln #查看节点状态,加个“-n”将以数字形式显示地址、端口信息
//选项注释:
"-A"表示添加虚拟服务器,
"-a"表示添加真实服务器
"-t"用来指定VIP地址及TCP端口
"-r"用来指定RIP地址及TCP端口
"-s"用来指定负载调度算法——rr(轮询)、wrr(加权轮询)、lc(最少连接)、wlc(加权最少连接)
"-m"表示使用NAT群集模式("-g"是DR模式,"-i"是TUN模式)
查看网卡是否已创建虚拟接口
ifconfig
在节点机器上编辑转发脚本
#!/bin/bash
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
ifconfig lo:0 172.16.1.189 broadcast 172.16.1.189 netmask 255.255.255.255 up #在lo上配置虚拟接口
route add -host 172.16.1.189 dev lo:0 #配置虚拟接口的路由
sysctl -p &>/dev/null
查看网卡是否已经创建虚拟接口
Ifconfig
测试
在除了LVS集群的机器上访问,切记不可在LVS环境本地进行测试,会访问不到。例如这里的一台调度器和三台后端服务器都不能作为测试环境。
for n in `seq 10000`;do curl 172.16.1.189:/test/;sleep 1;done
得出下图证明负载已经正常运行
LVS/NAT模式配置方式
搭建环境
为了防止selinux和iptables对实验的影响,我们在实验之前先将所有selinux策略临时调为0,将iptables服务关闭
- 调度器:VIP192.168.1.89/24 DIP172.16.1.89/24
- 节点rs1:192.168.1.89/24, 网关指向调度器DIP172.16.1.7/24
- 节点rs2:192.168.1.89/24, 网关指向调度器DIP172.16.1.8/24
- 节点rs3:192.168.1.89/24, 网关指向调度器DIP172.16.1.9/24
由于调度器上需要转发请求,所以需要在内核中开启转发功能:
在调度器上,执行如下步骤
vim /etc/sysctl.conf #修改这一行,将0改为1,表示开启转发功能
net.ipv4.ip_forward = 1
sysctl -p #读取配置文件,显示以下内容证明修改成功
net.ipv4.ip_forward = 1
添加调度器
在调度器上,执行以下步骤
yum -y install ipvsadm #安装ipvaadm工具
添加节点
在调度器上,执行以下步骤
ipvsadm -A -t 192.168.1.89:80 -s rr #设置调度器,调度算法为rr(轮询)
ipvsadm -a -t 192.168.1.89:80 -r 172.16.1.7:80 -m
ipvsadm -a -t 192.168.1.89:80 -r 172.16.1.8:80 -m
ipvsadm -a -t 192.168.1.89:80 -r 172.16.1.9:80 -m
查看状态
ipvsadm -Ln
P Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.89:80 rr
-> 172.16.1.7:80 Masq 1 0 2
-> 172.16.1.8:80 Masq 1 0 2
-> 172.16.1.9:80 Masq 1 0 3
测试
curl 192.168.1.89