LVS:linux virtual server,linux虚拟服务,可以通过LVS实现负载均衡集群的部署,从内核2.6开始作为模块集成在内核中,使用方便灵活

负载均衡集群的结构
负载调度层:由一台或者多台调度器组成,通过加载LVS内核模块,并且生成虚拟IP,通过虚拟IP接收客户端的请求,根据自身配置的调度算法将请求交给合适的服务节点
服务器集群层:由多台提供服务的服务器节点组成用来处理客户端的请求
共享存储层:实现服务节点之间的数据统一

常用的调度模式:
NAT:网络地址转换
客户端通过虚拟IP将请求包交给调度器(请求包源IP为客户端,目的IP为调度器的虚拟IP),调度器接收到请求之后根据调度算法将请求发送给合适的服务节点(源IP为客户端IP,目的IP为节点IP,节点处理完该请求后,服务节点将响应包交给调度器(源IP为节点IP,目的IP为客户端IP),调度器再将响应包的源节点IP转换为调度虚拟IP之后响应给客户端
DR:直接路由
调度器与服务节点都配置了虚拟IP,客户端通过虚拟IP将请求交给调度器,调度器根据自身配置的调度算法将请求转发给合适的服务节点,调度器将请求包的目的MAC地址改为服务节点的地址之后将请求转发给服务节点,服务节点处理完后直接响应给客户端
需要注意两个问题:
1)服务节点的虚拟IP配置在本地回环网卡loop back上,并且虚拟IP所在网卡不响应arp请求
2)服务节点响应客户端时通过本地物理网卡向客户端发送arp请求而不是虚拟IP所在网卡
TUN:IP隧道
客户端通过虚拟IP将请求交给调度器,调度器接收请求之后,根据调度算法找到合适的服务节点,对请求包进行再封装,封装后的源IP为调度器自己的真实IP,目的IP为服务节点IP,然后将请求报交给服务节点,节点接收到请求包之后解封装,解封装后的请求包源IP为客户端,目的IP为虚拟IP,服务节点处理完以虚拟IP响应给客户端,该模式要求调度器与服务节点都支持并配置IP隧道技术

常用调度算法:
静态算法: 根据算法本身进行调度
Rr:round robin轮询,调度器接收到请求之后按照节点的顺序依次分发请求(多用于主库)
Wrr:weight round robin加权轮询,调度器接收到请求之后,按照节点的顺序以及每个节点的权重来分发请求
SH:source hash,源地址散列,根据客户端请求的源IP进行哈希算法得到散列值,匹配到客户端最近一次访问的服务节点,并将客户端的请求交给该节点
DH:destination hash:目标地址散列,根据客户端请求的目的IP进行哈希计算得到散列值,匹配出客户端最近一次访问的服务节点,并将客户端的请求交给该节点

动态算法:根据算法以及服务节点自身的负载能力进行调度
Lc:least connection最少连接数,调度器将请求交给连接数最少的服务节点(多用于从库)
Wlc:weight least connection加权最少连接数,调度器将根据服务节点的权重以及连接数的比例再将请求交给合适的服务节点
LBLC:基于局部的最少连接,调度器根据DH找到合适的服务节点,如果该节点因为自身故障或者负载压力暂时无法处理该请求时,调度器会在服务集群中找出此时连接量最少的一台服务节点处理该请求
LBLCR:带复制的基于局部的最少连接,调度器根据DH找到合适的服务节点,如果该节点因为自身故障或者负载压力暂时无法处理该请求,调度器会在一个服务器组(专门的服务器组)中找出一台节点处理该请求,如果该族中的节点也无法吹,则在服务器集群中找出一台此时连接量最少的一台主机加入到组中处理该请求

实验环境:LVS-DR模式

upload successful

调度器配置:

配置虚拟IP:

1
2
3
4
5
6
7
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:1
vi ifcfg-ens33:1
修改:
NAME=ens33:1
DEVICE=ens33:1
IPADDR=1.1.1.111

重启网卡

1
2
systemctl restart network
ip a | grep 1.111

放行防火墙和沙盒

1
2
3
firewall-cmd --add-port=80/tcp
firewall-cmd --add-service=http
setenforce 0

加载ipvsadm模块

1
modprobe ip_vs

安装ipvsadm命令工具

yum -y install ipvsadm*
创建集群、添加节点:

1
2
3
4
ipvsadm -A -t 1.1.1.111:80 -s rr		//生成本身调度器的虚拟IP使用rr轮询模式(此IP为虚拟IP)
ipvsadm -a -t 1.1.1.111:80 -r 1.1.1.20:80 -g //-g为LVS—DR模式(后端Web节点1 IP)
ipvsadm -a -t 1.1.1.111:80 -r 1.1.1.30:80 -g //(后端Web节点2 IP)
ipvsadm -S //使配置生效

ipvsadm参数;
-A:添加虚拟IP
-t:集群中节点之间使用TCP协议通信
-s:指定调度算法
-a:添加服务节点
-r:指定要添加的服务节点IP与端口

查看配置:

1
ipvsadm -ln

Web节点配置虚拟IP

ps:两台配置一样
配置虚拟IP:

1
2
3
4
5
6
7
8
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:1
vi ifcfg-lo:1
修改:
DEVICE=lo:1 //配置文件同名
IPADDR=1.1.1.111 //VIP
NETMASK=255.255.255.255 //允许接受所有主机的请求
NAME=lo:1
1
systemctl restart network

修改内核文件:

1
2
3
4
5
6
7
vi /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.default.arp_ignore=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.default.arp_announce=2
net.ipv4.conf.all.arp_announce=2

加载内核文件:

1
sysctl -p

修改web服务配置文件

1
2
vi /usr/local/nginx/conf/nginx.conf
keepalivd_timeout = 0;

重载服务

1
nginx -s reload
修改首页文件(第二台web就换成NO.2)
1
2
vi /usr/local/nginx/html/index.html
Wecom to nginx NO.1

放行防火墙:

1
2
3
firewall-cmd --add-port=80/tcp
firewall-cmd --add-service=http
Setenforce 0

客户端配置:

放行防火墙沙盒
多次访问虚拟IP,查看是否有轮询效果

1
2
3
4
curl 1.1.1.111
Wecom to nginx NO.1
curl 1.1.1.111
Wecom to nginx NO.2