LVS负载均衡群集
LVS(Linux virtual server)
它是一个负载均衡、高可用性集群,主要针对大业务量的网络应用(比如新闻。电子商务、网上银行…)
LVS是建立在一个主控服务器(双机)及若干个真实服务器组成。真实服务器负责提供服务,主控服务器会根据指定的调度算法对真实的服务器进行控制。LVS集群结构对用户来说是透明的,客户端只与单个IP(虚拟IP)进行通信。客户端向lvs发出服务请求,主控服务器会通过特定的算法来指定某个真实服务器来应答,而客户端只与负载均衡的IP进行通信
LVS调度算法
轮询调度RR:
将外部请求按照顺序轮流分配到真实的服务器上
加权轮询WRR:
根据真实服务器的不同处理能力来调度访问请求
最少链接数LC:
调度器通过最少连接调度算法动态的将网络请求调度到以建立的连接数最少的服务器上
(两台服务器配置差不多时使用)
**加权最少连接WLC: **
优化负载的性能,较高权重的服务器将承受较大比例的活动连接负载
(两台服务器 有一台比较弱时 可以使用)
基于局部性的最少连接 LBLC:
针对目标的IP地址的负载均衡,应用于cache集群上。会根据请求的目标IP地址找出该目标IP地址最近使用的服务器,如果该服务器是可用的没有超载,则将请求发送到服务器上,若服务器不存在,或服务器处于一半的工作负载,则用最少连接数选出一个服务器。
带复制的基于局部性的最少连接(locality-Based Least Connections with Replication)
也是针对目标IP地址的负载均衡,用于cache集群。它与LBLC算法不同之处是它要维护的是从一个目标IP地址到一组服务器的映射,而LBLC算法维护的是从一个目标IP地址到一台服务器的映射。
目标地址散列(Destination IP Hashing)
目标地址散列调度算法根据请求的目标IP地址,作为散列键(Hash KEY)从静态分配的散列表中找出对应的服务器,若服务器是可用的且未超载,则请求发送到该服务器,否则返回空。
源地址散列
根据请求的源IP地址,作为散列键从静态分配的散列表中找出对应的服务器,若服务器是可用的且未超载,则请求发送到该服务器,否则返回空。
**源IP端口散列 **
通过hash函数将来自用一个源IP地址和源端口号的请求映射到后端同一台服务器上。
(适合按服务的类型分类)
随机
随机地将请求分发到不同的服务器上
典型的负载均衡集群中,包括三层次的组件,前端至少一个负载均衡调度器(LB)负责相应并发来自客户端的访问请求;后端有大量真实服务器构成服务池(server pool)提供实际的应用服务
透明性 一致性和伸缩性
LVS工作模式
调度技术可以基于IP、端口、内容进行分发。基于IP的效率最高。常见的有三种,地址转换、IP隧道和直接路由。
地址转换(NAT):
简称NAT模式,类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,及作为客户机的访问入口,也是各个节点回应客户机的访问出口。服务器节点使用的是私有IP地址
相当于负载均衡作为client和web的网关,在lvs中进行地址转换,所有的请求和响应都需要经过负载均衡服务器
IP隧道(TUN):
简称TUN模式,采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器。服务器节点分散在不同的位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信。
最终web返回给client的数据时通过特有的公网ip隧道进行返回,web和负载均衡服务器都需要公网的ip
直接路由(DR):
简称DR模式,采用半开放式网络结构,与TUN模式的结构类似,但是节点并不是分散的,而是与调度器位于同一物理网络。通过本地网络连接,不需要建立专用IP隧道。
LVS集群的管理工作主要包括创建虚拟服务器、添加服务器节点、查看集群节点状态、删除服务器节点和保存负载分配策略
返回方式和TUN模式一致,但是这里的web和负载均衡服务器必须要处于同一个物理网络内。通过虚拟ip进行传输
TUN和DR:请求需要经过负载均衡服务器,响应直接由web返回给client
LVS部署与配置(NAT)
实验环境:
客户端:IP:192.168.1.1 网关:192.168.1.4
负载均衡:IP1:192.168.1.4 IP2:192.168.2.1
web1:IP:192.168.2.2 网关:192.168.2.1
web2:IP:192.168.2.3 网关:192.168.2.1
实验目的:
客户机通过访问LVS地址,也就是192.168.1.4,获取到web1或者web2的页面,LVS会自动调度后端web的页面
实验步骤:
第一步:
根据实验环境把主机ip配置好,以及网卡
第二步:
为了方便实验,这里使用yum安装后端的web服务器
web1:192.168.2.2
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# echo "cyj" >> /var/www/html/index.html
[root@localhost ~]# systemctl restart httpd
web2:192.168.2.3
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# echo "pjf" >> /var/www/html/index.html
[root@localhost ~]# systemctl restart httpd
第三步:
因为是不同网段,所以负载均衡服务器当做网关服务器使用,需要开启路由转发
LVS:192.168.1.4/2.1
[root@localhost ~]# vim /etc/sysctl.conf
添加:
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
第四步:
LVS部署
因为linux内核中默认编入了LVS,所以只需要将LVS的模块加载即可
[root@localhost ~]# modprobe ip_vs
[root@localhost ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
安装LVS管理工具–>ipvsadm
[root@localhost ~]# yum -y install ipvsadm
第五步:
LVS:192.168.1.4/2.1
部署添加群集
[root@localhost ~]# ipvsadm -A -t 192.168.1.4:80 -s rr
# IP地址必须是与客户机相同的ip,也就是客户机的网关
-A:添加新的群集
-t:使用tcp协议,后面加集群的ip地址
-s:调度算法 rr:轮询
添加web节点到群集中
[root@localhost ~]# ipvsadm -a -t 192.168.1.4:80 -r 192.168.2.2:80 -m -w 1
[root@localhost ~]# ipvsadm -a -t 192.168.1.4:80 -r 192.168.2.3:80 -m -w 1
-a:给指定集群中添加真实web节点
-t:后面写的是指定的群集
-m:表示NAT模式的工作模式 -g:DR模式 -i:TUN模式
-r:后面写的是要添加的web节点
-w:权重
[root@localhost ~]# ipvsadm -S # 保存配置
查看群集节点
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.4:80 rr
-> 192.168.2.2:80 Masq 1 0 0
-> 192.168.2.3:80 Masq 1 0 0
删除节点命令
删除群集:ipvsadm -D -t 192.168.1.4:80
删除群集中节点:ipvsadm -d -t 192.168.1.4:80 -r 192.168.2.2:80
第六步:
客户机验证:
切记防火墙,要么开端口,要么关闭,包括LVS和web后端
最后client访问验证
[root@localhost ~]# curl 192.168.1.4
cyj
[root@localhost ~]# curl 192.168.1.4
pjf
[root@localhost ~]# curl 192.168.1.4
cyj
[root@localhost ~]# curl 192.168.1.4
pjf
[root@localhost ~]# curl 192.168.1.4
cyj
[root@localhost ~]# curl 192.168.1.4
pjf
[root@localhost ~]# curl 192.168.1.4
cyj
[root@localhost ~]# curl 192.168.1.4
pjf
通过在LVS查看转发记录可以知道轮询成功
[root@localhost ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:59 TIME_WAIT 192.168.1.1:41048 192.168.1.4:80 192.168.2.3:80
TCP 01:58 TIME_WAIT 192.168.1.1:41046 192.168.1.4:80 192.168.2.2:80
LVS部署与配置(DR)
实验环境:
客户端:IP:192.168.1.1
负载均衡:IP1:192.168.1.4 虚拟ip:192.168.1.10
web1:IP:192.168.1.6
web2:IP:192.168.1.7
实验目的:
客户机通过访问虚拟ip(192.168.1.10)得到web1和web2的页面
实验步骤:
第一步:
根据实验环境配置pc的ip地址
LVS需要配置虚拟ip
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]# vim ifcfg-ens33:0
删除uuid,更改ip为192.168.1.10
[root@localhost ~]# systemctl restart network
web需要配置lo地址为LVS的虚拟ip
web1:192.168.1.6
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim icfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.1.10
NETMASK=255.255.255.255
NAME=cyj
[root@localhost ~]# systemctl restart network
web2:192.168.1.7
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim icfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.1.10
NETMASK=255.255.255.255
NAME=pjf
[root@localhost ~]# systemctl restart network
第二步:
根据NAT的第二步部署web服务器的httpd
第三步:
配置调整内核参数对arp的限制
web1:192.168.1.6 web2::192.168.1.7
[root@localhost ~]# vim /etc/sysctl.conf
添加
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1 # 本地(lo)、所有、默认的arp包都接收
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2 # 不进行arp响应给调度器,而是直接响应给客户机
[root@localhost ~]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
web1和web2分别设置本地访问路由(临时)
[root@localhost ~]# route add -host 192.168.1.10 dev lo:0
永久
添加vip本地访问路由
vim /etc/rc.local
添加
route add -host 192.168.1.11 dev lo:0
第四步:
创建群集,并添加web节点
[root@localhost ~]# ipvsadm -A -t 192.168.1.10:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.6:80 -g -w 1
[root@localhost ~]# ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.7:80 -g -w 1
[root@localhost ~]# ipvsadm -S
-A -t localhost:http -s rr
-a -t localhost:http -r localhost:http -g -w 1
-a -t localhost:http -r localhost:http -g -w 1
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.10:80 rr
-> 192.168.1.6:80 Route 1 0 2
-> 192.168.1.7:80 Route 1 0 2
第五步:
客户端验证:
切记防火墙,要么开端口,要么关闭,包括LVS和web后端
最后client访问验证
[root@localhost ~]# curl 192.168.1.10
pjf
[root@localhost ~]# curl 192.168.1.10
cyj
[root@localhost ~]# curl 192.168.1.10
pjf
[root@localhost ~]# curl 192.168.1.10
cyj
通过在LVS查看转发记录可以知道轮询成功
[root@localhost ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 00:15 FIN_WAIT 192.168.1.1:47558 192.168.1.10:80 192.168.1.7:80
TCP 00:16 FIN_WAIT 192.168.1.1:47560 192.168.1.10:80 192.168.1.6:80
TCP 00:16 FIN_WAIT 192.168.1.1:47562 192.168.1.10:80 192.168.1.7:80
TCP 00:17 FIN_WAIT 192.168.1.1:47564 192.168.1.10:80 192.168.1.6:80